জিটিস্ট এবং সিএমকে নিয়ে কীভাবে কাজ শুরু করবেন


125

আমি সম্প্রতি আমার সি ++ প্রকল্পগুলি সংকলনের জন্য সিএমকে ব্যবহার করে বিক্রি করেছি এবং এখনই আমার কোডের জন্য কিছু ইউনিট পরীক্ষা লেখা শুরু করতে চাই। এটিতে সহায়তা করার জন্য আমি গুগল টেস্টের ইউটিলিটিটি ব্যবহার করার সিদ্ধান্ত নিয়েছি, তবে শুরু করার জন্য কিছু সহায়তা দরকার।

সমস্ত দিন আমি বিভিন্ন গাইড পড়ছি এবং উদাহরণগুলির মধ্যে রয়েছে প্রাইমার , আইবিএমের একটি ভূমিকা এবং এসও সম্পর্কিত কিছু প্রশ্ন ( এখানে এবং এখানে ) পাশাপাশি অন্যান্য উত্সগুলিও আমি হারিয়ে ফেলেছি। আমি বুঝতে পারি যে সেখানে প্রচুর পরিমাণে আছে তবে কোনওরকম আমার এখনও অসুবিধা হচ্ছে।

আমি বর্তমানে সর্বাধিক বেসিক পরীক্ষাটি বাস্তবায়নের চেষ্টা করছি, আমি গেমস্টের ডানটি সঠিকভাবে কম্পাইল / ইনস্টল করেছি এবং এটি কাজ করছে না তা নিশ্চিত করার জন্য। একমাত্র উৎস ফাইল (testgtest.cpp) থেকে প্রায় হুবহু নেওয়া হয় এই পূর্ববর্তী উত্তর:

#include <iostream>

#include "gtest/gtest.h"

TEST(sample_test_case, sample_test)
{
    EXPECT_EQ(1, 1);
}

এবং আমার সম্পর্কিত সিএমকেলিস্ট.টেক্সট নিম্নরূপ:

cmake_minimum_required(VERSION 2.6)
project(basic_test)

# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})

# Add test cpp file
add_executable(runUnitTests
    testgtest.cpp
)

# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})

add_test(
    NAME runUnitTests
    COMMAND runUnitTests
)

নোট করুন যে আমি সিপিপি ফাইলের শেষে মূল সরবরাহ না করে জিস্টে_মেনের সাথে লিঙ্ক করা বেছে নিয়েছি কারণ আমার বিশ্বাস এটি আমাকে একাধিক ফাইলগুলিতে আরও সহজে টেস্টিং স্কেল করতে দেয়।

উত্পন্ন .sln ফাইল তৈরি করার সময় (ভিজ্যুয়াল সি ++ ২০১০ এক্সপ্রেসে) আমি দুর্ভাগ্যক্রমে ফর্মটির ত্রুটির একটি দীর্ঘ তালিকা পাই

2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) already defined in gtestd.lib(gtest-all.obj)

যা আমি মনে করি তার মানে আমি সফলভাবে গ্রেস্ট লাইব্রেরিতে লিঙ্ক করছি না। আমি নিশ্চিত করেছি যে ডিবাগ লাইব্রেরিগুলির সাথে লিঙ্ক করার সময় আমি তখন ডিবাগ মোডে তৈরি করার চেষ্টা করেছি।

সম্পাদনা

আরও কিছু খনন করার পরে, আমি মনে করি যে আমার ইস্যুটি আমি গ্রন্থাগারটি তৈরি করছি তার ধরণের সাথে কিছু করা। সিএমকে দিয়ে গেস্ট তৈরি করার সময়, যদি BUILD_SHARED_LIBSএটি পরীক্ষা না করা হয় এবং আমি আমার প্রোগ্রামটিকে এই .lib ফাইলগুলির সাথে লিঙ্ক করি তবে আমি উপরে উল্লিখিত ত্রুটিগুলি পেয়েছি। যাইহোক, যদি BUILD_SHARED_LIBSচেক করা হয় তবে আমি .lib এবং .dll ফাইলের সেট তৈরি করি। এখন এই .lib এর সাথে সংযোগ স্থাপনের পরে প্রোগ্রামটি সংকলন করে, কিন্তু রান যখন অভিযোগ করে যে এটি gest.dll খুঁজে পাচ্ছে না।

SHAREDনা এবং SHAREDপাঠাগার নয় এমন লাইব্রেরির মধ্যে কী পার্থক্য রয়েছে এবং আমি যদি ভাগ না করা পছন্দ করি তবে এটি কেন কাজ করে না? আমার প্রকল্পটির জন্য সিএমকেলিস্ট.টেক্সটে কোনও বিকল্প আছে যা আমি অনুপস্থিত?


4
ExternalProject_Addপরিবর্তে ব্যবহার করে আপনি নিজের মধ্যে জিটিস্ট উত্সগুলি অন্তর্ভুক্ত করতে পারবেন add_subdirectory। বিস্তারিত জানার জন্য এই উত্তরটি দেখুন ।
ফ্রেজার

উপরের সমাধান উদাহরণে আমাদের কেন $ {gtest_SOURCE_DIR? এ অ্যাক্সেস রয়েছে? কিভাবে / কোথায় সেই পরিবর্তনশীল ঘোষিত হয়?
dmonopoly

ওহ এটি গেস্ট-১.6.০ / সিএমকেলিস্টস টেক্সট-এ ঘোষণা করা হয়েছে: "প্রকল্প (গেটেস্ট সিএক্সএক্স সি)" যা ভেরিয়েবলগুলি জিস্টেস্ট_সোআরসি_ডায়িআর এবং গেস্ট_বিআনআরআই_ডিআর উপলভ্য করে তোলে।
ডেমোনপোলি

1
কি করে enable_testing()?
আপডেটগ্লিউ

1
@ আপডোগ্লিউ: এটি কেষ্ট এবং 'টেস্ট' (বা 'রুন_আরএসইটিএস) লক্ষ্য সক্ষম করে) এটি add_test () cmake কমান্ডের সাথে একসাথে খেলবে।
ইলা 782

উত্তর:


76

সমাধানটি আপনার প্রকল্পের উপ ডিরেক্টরি হিসাবে গেমস্টে উত্স ডিরেক্টরিটি অন্তর্ভুক্ত করে। আমি কারওর জন্য সহায়ক হলে নীচে কর্মরত CMakeLists.txt অন্তর্ভুক্ত করেছি।

cmake_minimum_required(VERSION 2.6)
project(basic_test)

################################
# GTest
################################
ADD_SUBDIRECTORY (gtest-1.6.0)
enable_testing()
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})

################################
# Unit Tests
################################
# Add test cpp file
add_executable( runUnitTests testgtest.cpp )
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests gtest gtest_main)
add_test( runUnitTests runUnitTests )

3
আমি নিশ্চিত নই যে অ্যাড_স্টেট () কী করে তবে এটি বাইনারি পরীক্ষা চালানোর ফলে বলে মনে হচ্ছে না ... আমি কি কিছু মিস করছি?
weberc2

4
মৃত ঘোড়াটিকে মারতে নয় তবে আমি ভেবেছিলাম এটি আবার উল্লেখ করার মতো। ফ্রেজারের উপরের মন্তব্যটি একটি অত্যন্ত গুরুত্বপূর্ণ বিষয় তুলে ধরেছে: "আপনি নিজেরাইতে জিটিস্ট উত্সগুলি অ্যাড_সুবডাইরেক্টরির পরিবর্তে এক্সটার্নালপ্রজেক্ট_এড ব্যবহার করে এড়াতে পারবেন" " বিস্তারিত জানার জন্য ফ্রেজারের উত্তর এবং মন্তব্যগুলি এখানে দেখুন: stackoverflow.com/a/9695234/1735836
প্যাট্রিসিয়া

1
আমার ক্ষেত্রে, আমাকে pthreadলিঙ্কযুক্ত গ্রন্থাগারগুলিতে যুক্ত করার দরকার ছিল , দ্বিতীয় শেষ লাইনটি পরিবর্তন করতে হবেtarget_link_libraries(runUnitTests gtest gtest_main pthread)
mari

3
@ ওয়েবারসি 2 আপনাকে make testপরীক্ষা চালাতে চালাতে হবে, বা ctestবিল্ড ডিরেক্টরি থেকে চালাতে হবে । ctest -Vগুগল টেস্ট আউটপুট পাশাপাশি আউটপুট দেখতে চালান ctest
প্যাট্রিক

38

এখানে একটি সম্পূর্ণ কার্যকারী উদাহরণ যা আমি সবেমাত্র পরীক্ষা করেছি। এটি ওয়েব থেকে সরাসরি ডাউনলোড করা হয়, হয় একটি স্থির টার্বল বা সর্বশেষতম সাবভার্সন ডিরেক্টরি।

cmake_minimum_required (VERSION 3.1)

project (registerer)

##################################
# Download and install GoogleTest

include(ExternalProject)
ExternalProject_Add(gtest
  URL https://googletest.googlecode.com/files/gtest-1.7.0.zip
  # Comment above line, and uncomment line below to use subversion.
  # SVN_REPOSITORY http://googletest.googlecode.com/svn/trunk/ 
  # Uncomment line below to freeze a revision (here the one for 1.7.0)
  # SVN_REVISION -r700

  PREFIX ${CMAKE_CURRENT_BINARY_DIR}/gtest
  INSTALL_COMMAND ""
)
ExternalProject_Get_Property(gtest source_dir binary_dir)

################
# Define a test
add_executable(registerer_test registerer_test.cc)

######################################
# Configure the test to use GoogleTest
#
# If used often, could be made a macro.

add_dependencies(registerer_test gtest)
include_directories(${source_dir}/include)
target_link_libraries(registerer_test ${binary_dir}/libgtest.a)
target_link_libraries(registerer_test ${binary_dir}/libgtest_main.a)

##################################
# Just make the test runnable with
#   $ make test

enable_testing()
add_test(NAME    registerer_test 
         COMMAND registerer_test)

7
আমি জানি না আপনি কেন এই জন্য নিম্নচাপে গেছেন। আপনার সমাধান কাউকে সংস্করণ নিয়ন্ত্রণে গুগল টেস্টে পরীক্ষা করতে বাধা দেয়। আপনার সমাধানের জন্য কুডোস।
সাল

4
আপনার ব্যবহৃত ইউআরএল এখন ভেঙে গেছে। একটি আপ-টু-ডেট URL হ'লhttps://github.com/google/googletest/archive/release-1.8.0.zip
oscfri

দুর্দান্ত উত্তর। নম্বর 1 হওয়া উচিত
মিঃ00 এন্ডারসন

1
গ্রেট উত্তর! এছাড়াও আমরা GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.8.1ইউআরএল পরিবর্তে ব্যবহার করতে পারি
টিংকুইয়ান এলআই

সর্বশেষতম প্রকাশের URL টি হ'ল:https://github.com/google/googletest/archive/release-1.10.0.zip
ভাইহঞ্চো

16

আপনি উভয় বিশ্বের সেরা পেতে পারেন। ExternalProjectঅতিপ্রাকৃত উত্সটি ডাউনলোড করতে এবং তারপরে add_subdirectory()এটি আপনার বিল্ডে যুক্ত করতে ব্যবহার করা সম্ভব । এর নিম্নলিখিত সুবিধা রয়েছে:

  • গেস্ট আপনার মূল বিল্ডের অংশ হিসাবে নির্মিত হয়, সুতরাং এটি একই সংকলক পতাকা ইত্যাদি ব্যবহার করে এবং সুতরাং প্রশ্নে বর্ণিত সমস্যাগুলি এড়ানো।
  • আপনার নিজস্ব উত্স ট্রিতে গেষ্টেস্ট উত্সগুলি যুক্ত করার দরকার নেই।

সাধারণ উপায়ে ব্যবহৃত হয়, এক্সটার্নাল প্রোজেক্ট কনফিগার করার সময় ডাউনলোডগুলি এবং আনপ্যাকিং করবে না (যেমন যখন সিএমকে চালিত হয়) তবে আপনি এটি সামান্য কিছু কাজ করে এটি করতে পারেন। আমি কীভাবে এটি করব সে সম্পর্কে একটি ব্লগ পোস্ট লিখেছি যার মধ্যে একটি সাধারণীকরণ বাস্তবায়নও রয়েছে যা কোনও বাহ্যিক প্রকল্পের জন্য কাজ করে যা কেবল গেষ্ট নয়, সিএমকেকে তার বিল্ড সিস্টেম হিসাবে ব্যবহার করে। আপনি এখানে তাদের খুঁজে পেতে পারেন:

আপডেট: এই পদ্ধতির এখন গুগলটেস্ট ডকুমেন্টেশনের অংশ


2
আইএমও, এটি কোনও সিএমকে প্রকল্পের মাধ্যমে গুগল পরীক্ষা বাস্তবায়নের সবচেয়ে পরিষ্কার উপায়। আমি আশা করি মডারেটররা উত্তরের বিষয়বস্তু এবং গুণমানের দিকে আরও মনোযোগ দেবে।
নেমরেক্স

লিঙ্কযুক্ত ডাউনলোডপ্রজেক্ট.কমকে সাধারণীকরণ করা মডিউলটি দুর্দান্ত। এটি প্যাকেজ ম্যানেজমেন্ট সিস্টেমের সিমেকে ভিত্তির মতো মনে হয় যেখানে আমার প্রয়োজন সমস্ত সিএমকে সামঞ্জস্যপূর্ণ গিথুব ইউআরএলগুলির লিঙ্কগুলির একটি তালিকা।
জোশ পিক

13

সম্ভবত, আপনার পরীক্ষার বাইনারি এবং গুগল টেস্ট লাইব্রেরির মধ্যে সংকলক বিকল্পগুলির মধ্যে পার্থক্য হ'ল এই জাতীয় ত্রুটিগুলির জন্য দোষ। এজন্য উত্স ফর্মটিতে গুগল টেস্ট আনার এবং এটি আপনার পরীক্ষার পাশাপাশি তৈরি করার পরামর্শ দেওয়া হচ্ছে। এটি সিএমকে করা খুব সহজ। আপনি কেবল ADD_SUBDIRECTORYঅতিষ্ঠ রুটের পথে যেতে চান এবং তারপরে আপনি সেখানে সংজ্ঞায়িত পাবলিক লাইব্রেরি লক্ষ্যগুলি ( gtestএবং gtest_main) ব্যবহার করতে পারেন । গুগলস্টেস্ট ফ্রেমওয়ার্ক গ্রুপে এই সিএমকে থ্রেডে আরও পটভূমি তথ্য রয়েছে ।

[সম্পাদনা] BUILD_SHARED_LIBSবিকল্পটি এখনই উইন্ডোজটিতে কার্যকর। এটি সিএমকে আপনি যে লাইব্রেরি তৈরি করতে চান তা সুনির্দিষ্ট করে। আপনি যদি এটি সেট করে থাকেন ON, সিএমকে স্ট্যাটিক লিবের বিপরীতে তাদের ডিএলএল হিসাবে তৈরি করবে। সেক্ষেত্রে আপনাকে -DGTEST_LINKED_AS_SHARED_LIBRARY = 1 দিয়ে আপনার পরীক্ষা তৈরি করতে হবে এবং সিএমকে উত্পাদিত ডিএলএল ফাইলগুলি আপনার পরীক্ষার বাইনারি দিয়ে ডিরেক্টরিতে অনুলিপি করতে হবে (সিএমেক এগুলি ডিফল্টরূপে পৃথক আউটপুট ডিরেক্টরিতে রাখে)। স্ট্যাটিক লিবিতে গেষ্টেস্ট আপনার পক্ষে কাজ না করে, এই বিকল্পটি সেট না করা সহজ।


1
দুর্দান্ত ধন্যবাদ, বুঝতে পারিনি যে আপনি একই রকম সিএমকেলিস্টের মধ্যে সম্পূর্ণ পৃথক প্রকল্পগুলি তৈরি করতে পারেন। আমি এখন নিরাপদে বলতে পারি যে EXPECT_EQ (1.0 == 1.0) পাস হয় এবং EXPECT_EQ (0.0 == 1.0) ব্যর্থ হয়। এখন আরও বাস্তব পরীক্ষার জন্য সময় ...
ক্রিস

2

আরও কিছু খনন করার পরে, আমি মনে করি যে আমার ইস্যুটি আমি গ্রন্থাগারটি তৈরি করছি তার ধরণের সাথে কিছু করা। সিএমকে দিয়ে গেস্ট তৈরি করার সময়, যদি BUILD_SHARED_LIBS চেক করা থাকে না, এবং আমি এই প্রোগ্রামগুলির সাথে আমার লিঙ্কটি লিঙ্ক ফাইলগুলিতে লিঙ্ক করি আমি উপরে উল্লিখিত ত্রুটিগুলি পেয়েছি। তবে, যদি BUILD_SHARED_LIBS পরীক্ষা করা হয় তবে আমি .lib এবং .dll ফাইলের সেট তৈরি করি। এখন এই .lib এর সাথে সংযোগ স্থাপনের পরে প্রোগ্রামটি সংকলন করে, কিন্তু রান যখন অভিযোগ করে যে এটি gest.dll খুঁজে পাচ্ছে না।

এর কারণ হল যদি আপনি ভাগ্যবান লাইব্রেরি হিসাবে গেস্ট ব্যবহার করতে চান তবে আপনাকে আপনার প্রকল্পের সংজ্ঞা সংকলন করতে -DGTEST_LINKED_AS_SHARED_LIBRARY = 1 যুক্ত করতে হবে।

আপনি স্থিত লাইব্রেরিগুলিও ব্যবহার করতে পারেন, আপনি যদি দেখেছেন ত্রুটিগুলি অপসারণ করার জন্য এটি gtest_for_shared_crt বিকল্পের সাথে সংকলন করেছেন।

আমি লাইব্রেরিটি পছন্দ করি তবে প্রকল্পে এটি যুক্ত করা সত্যিকারের ব্যথা। এবং যদি না আপনি গেস্ট চেমেক ফাইলগুলিতে খনন করেন (এবং হ্যাক করেন) তবে আপনার এটি করার সঠিক সুযোগ নেই। লজ্জা। বিশেষত উত্স হিসাবে গেস্ট যোগ করার ধারণাটি আমি পছন্দ করি না। :)


1

ওপি উইন্ডোজ ব্যবহার করছে এবং জিটিস্ট ব্যবহারের আরও সহজ উপায় আজ ভিসিপিকিজি + সিমেকে দিয়ে।


অনুযায়ী vcpkg ইনস্টল করুন https://github.com/microsoft/vcpkg , এবং নিশ্চিত আপনি চালাতে পারেন করতে vcpkgcmd কমান্ড লাইন থেকে। Vcpkg ইনস্টলেশন ফোল্ডারটি নোট করুন, যেমন। C:\bin\programs\vcpkg

ব্যবহার করে জেস্ট ইনস্টল করুন vcpkg install gtest: এটি জিটিস্ট ডাউনলোড, সংকলন এবং ইনস্টল করবে।

CmakeLists.txt ব্যবহার করুন নীচের হিসাবে: দ্রষ্টব্য আমরা ফোল্ডারগুলি অন্তর্ভুক্ত না করে লক্ষ্যগুলি ব্যবহার করতে পারি ।

cmake_minimum_required(VERSION 3.15)
project(sample CXX)
enable_testing()
find_package(GTest REQUIRED)
add_executable(test1 test.cpp source.cpp)
target_link_libraries(test1 GTest::GTest GTest::Main)
add_test(test-1 test1)

চটজলদি চালান: (প্রয়োজনে ভিসিপিকিজি ফোল্ডারটি সম্পাদনা করুন, এবং ভিসিপকিজি.কম.মেক সরঞ্জামচইন ফাইলের পথটি সঠিক কিনা তা নিশ্চিত করুন)

cmake -B build -DCMAKE_TOOLCHAIN_FILE=C:\bin\programs\vcpkg\scripts\buildsystems\vcpkg.cmake

এবং cmake --build buildযথারীতি ব্যবহার করে নির্মাণ করুন । মনে রাখবেন যে, vcpkg ইনস্টল ফোল্ডার থেকে ডিবেগ / রিলিজ ফোল্ডারগুলিতে প্রয়োজনীয় জেস্ট (ডি) .ডিএল / গেস্ট (ডি) _main.dll অনুলিপি করবে।

সঙ্গে পরীক্ষা cd build & ctest


0

আপনার এবং ভ্লাদলসভের সমাধান সম্ভবত আমার চেয়ে ভাল। তবে আপনি যদি কোনও ব্রুট-ফোর্স সমাধান চান তবে এটি চেষ্টা করুন:

SET(CMAKE_EXE_LINKER_FLAGS /NODEFAULTLIB:\"msvcprtd.lib;MSVCRTD.lib\")

FOREACH(flag_var
    CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
    CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
    if(${flag_var} MATCHES "/MD")
        string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
    endif(${flag_var} MATCHES "/MD")
ENDFOREACH(flag_var)

0

সবচেয়ে সহজ CMakeLists.txt আমি এই থ্রেডের উত্তরগুলি থেকে পাতিত করেছি এবং কিছু ট্রায়াল এবং ত্রুটিটি হ'ল:

project(test CXX C)
cmake_minimum_required(VERSION 2.6.2)

#include folder contains current project's header filed
include_directories("include")

#test folder contains test files
set (PROJECT_SOURCE_DIR test) 
add_executable(hex2base64 ${PROJECT_SOURCE_DIR}/hex2base64.cpp)

# Link test executable against gtest nothing else required
target_link_libraries(hex2base64 gtest pthread)

ইতিমধ্যে আপনার সিস্টেমে গেস্ট ইনস্টল করা উচিত।


সিএমকে এই জাতীয় লাইব্রেরি যুক্ত করা সত্যিই ভাল অভ্যাস নয়। চটকের মূল উদ্দেশ্যগুলির মধ্যে একটি হ'ল "এই লিবগুলি ইতিমধ্যে ইনস্টল করা উচিত ..." এর মতো অনুমান করা উচিত নয়। সিএমকে পরীক্ষা করে দেখুন যে লাইব্রেরিটি এখানে রয়েছে, এবং না থাকলে একটি ত্রুটি নিক্ষেপ করা হয়।
এড্রিয়েন বারাল

0

ঠিক যেমন @ প্যাট্রিসিয়ার মন্তব্যে গৃহীত উত্তরে এবং মূল প্রশ্নের জন্য @ ফ্রেজারের মন্তব্যে আপডেট হয়েছে, আপনার যদি সিএমকে ৩.১১+ অ্যাক্সেস থাকে তবে আপনি সিএমকের ফেচকন্টেন্ট ফাংশনটি ব্যবহার করতে পারেন ।

সিএমকের ফেচ কনটেন্ট পৃষ্ঠাটি উদাহরণ হিসাবে গুগলস্ট ব্যবহার করে!

আমি গৃহীত উত্তরের একটি ছোট পরিবর্তন সরবরাহ করেছি:

cmake_minimum_required(VERSION 3.11)
project(basic_test)

set(GTEST_VERSION 1.6.0 CACHE STRING "Google test version")

################################
# GTest
################################
FetchContent_Declare(googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG release-${GTEST_VERSION})

FetchContent_GetProperties(googletest)
if(NOT googletest_POPULATED)
  FetchContent_Populate(googletest)
  add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
endif()

enable_testing()

################################
# Unit Tests
################################
# Add test cpp file
add_executable(runUnitTests testgtest.cpp)

# Include directories
target_include_directories(runUnitTests 
                      $<TARGET_PROPERTY:gtest,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
                      $<TARGET_PROPERTY:gtest_main,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>)

# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests gtest
                                   gtest_main)

add_test(runUnitTests runUnitTests)

INTERFACE_SYSTEM_INCLUDE_DIRECTORIESগুগল টেস্ট সিএমকেলিস্ট.সেক্সট স্ক্রিপ্টে সেট করা থাকায় আপনি গেষ্ট এবং জেস্ট_মাইন টার্গেটের টার্গেট সম্পত্তি ব্যবহার করতে পারেন ।


সিএমকে> = v3.14 এ আপনি স্পষ্টভাবে পূর্বে রেখে আগে target_include_directoriesব্যবহার করতে পারেন FetchContent_MakeAvailable(googletest)। এটি উভয়ই সামগ্রীতে পপুলেশন করবে এবং এটি মূল বিল্ডে যুক্ত করবে। সিএমকে ফেচ কনটেন্ট - আরও তথ্য
67hz

0

আমি জেনেরিক কিছু একসাথে ছুঁড়ে ফেলার সিদ্ধান্ত নিয়েছিলাম পূর্বের পোস্ট করা উত্তরগুলির চেয়ে এটি করার একটি ভিন্ন উপায় প্রকট তাড়াতাড়ি প্রদর্শন, আশা করি যে এটি কারও সাহায্য করবে। নিম্নলিখিতগুলি আমার ম্যাকের জন্য আমার জন্য কাজ করেছিল। প্রথমত আমি গেটস জন্য সেটআপ কমান্ড দৌড়েছি। আমি সবকিছু সেট আপ করার জন্য সবেমাত্র একটি স্ক্রিপ্ট ব্যবহার করেছি।

#!/usr/bin/env bash

# install gtests script on mac
# https://gist.github.com/butuzov/e7df782c31171f9563057871d0ae444a

#usage
# chmod +x ./gtest_installer.sh
# sudo ./gtest_installer.sh

# Current directory
__THIS_DIR=$(pwd)


# Downloads the 1.8.0 to disc
function dl {
    printf "\n  Downloading Google Test Archive\n\n"
    curl -LO https://github.com/google/googletest/archive/release-1.8.0.tar.gz
    tar xf release-1.8.0.tar.gz
}

# Unpack and Build
function build {
    printf "\n  Building GTest and Gmock\n\n"
    cd googletest-release-1.8.0
    mkdir build 
    cd $_
    cmake -Dgtest_build_samples=OFF -Dgtest_build_tests=OFF ../
    make
}

# Install header files and library
function install {
    printf "\n  Installing GTest and Gmock\n\n"

    USR_LOCAL_INC="/usr/local/include"
    GTEST_DIR="/usr/local/Cellar/gtest/"
    GMOCK_DIR="/usr/local/Cellar/gmock/"

    mkdir $GTEST_DIR

    cp googlemock/gtest/*.a $GTEST_DIR
    cp -r ../googletest/include/gtest/  $GTEST_DIR
    ln -snf $GTEST_DIR $USR_LOCAL_INC/gtest
    ln -snf $USR_LOCAL_INC/gtest/libgtest.a /usr/local/lib/libgtest.a
    ln -snf $USR_LOCAL_INC/gtest/libgtest_main.a /usr/local/lib/libgtest_main.a

    mkdir $GMOCK_DIR
    cp googlemock/*.a   $GMOCK_DIR
    cp -r ../googlemock/include/gmock/  $GMOCK_DIR
    ln -snf $GMOCK_DIR $USR_LOCAL_INC/gmock
    ln -snf $USR_LOCAL_INC/gmock/libgmock.a /usr/local/lib/libgmock.a
    ln -snf $USR_LOCAL_INC/gmock/libgmock_main.a /usr/local/lib/libgmock_main.a
}

# Final Clean up.
function cleanup {
    printf "\n  Running Cleanup\n\n"

    cd $__THIS_DIR
    rm -rf $(pwd)/googletest-release-1.8.0
    unlink $(pwd)/release-1.8.0.tar.gz
}

dl && build && install && cleanup 

এর পরে, আমি একটি সাধারণ ফোল্ডার কাঠামো তৈরি করেছি এবং কয়েকটি দ্রুত ক্লাস লিখেছি

utils/
  cStringUtils.cpp
  cStringUtils.h
  CMakeLists.txt
utils/tests/
    gtestsMain.cpp
    cStringUtilsTest.cpp
    CMakeLists.txt

আমি ইউটিস ফোল্ডারের জন্য একটি শীর্ষ স্তরের সিএমকেলিস্টস টেক্সট এবং পরীক্ষার ফোল্ডারের জন্য একটি সিএমকেলিস্ট.টেক্সট করেছি

cmake_minimum_required(VERSION 2.6)

project(${GTEST_PROJECT} C CXX)

set(CMAKE_C_STANDARD 98)
set(CMAKE_CXX_STANDARD 98)

#include .h and .cpp files in util folder
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")

##########
# GTests
#########
add_subdirectory(tests)

এটি পরীক্ষার ফোল্ডারে সিএমকেলিস্ট.টেক্সট

cmake_minimum_required(VERSION 2.6)

set(GTEST_PROJECT gtestProject)

enable_testing()

message("Gtest Cmake")

find_package(GTest REQUIRED)

# The utils, test, and gtests directories
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
include_directories("/usr/local/Cellar/gtest/include")
include_directories("/usr/local/Cellar/gtest/lib")

set(SOURCES
  gtestsMain.cpp
  ../cStringUtils.cpp
  cStringUtilsTest.cpp
)

set(HEADERS
  ../cStringUtils.h
)

add_executable(${GTEST_PROJECT} ${SOURCES})
target_link_libraries(${GTEST_PROJECT} PUBLIC
  gtest
  gtest_main
)

add_test(${GTEST_PROJECT} ${GTEST_PROJECT})

তারপরে যা যা অবশিষ্ট রয়েছে তা হ'ল একটি নমুনা গেমস্টেস্ট এবং গেমস্টেইন মেইন লিখতে

নমুনা গেমস্টে

#include "gtest/gtest.h"
#include "cStringUtils.h"

namespace utils
{

class cStringUtilsTest : public ::testing::Test {

 public:

  cStringUtilsTest() : m_function_param(10) {}
  ~cStringUtilsTest(){}

 protected:
  virtual void SetUp() 
  {
    // declare pointer 
    pFooObject = new StringUtilsC();    
  }

  virtual void TearDown() 
  {
    // Code here will be called immediately after each test
    // (right before the destructor).
    if (pFooObject != NULL)
    {
      delete pFooObject;
      pFooObject = NULL;
    }
  }


  StringUtilsC fooObject;              // declare object
  StringUtilsC *pFooObject;
  int m_function_param;                // this value is used to test constructor
};

TEST_F(cStringUtilsTest, testConstructors){
    EXPECT_TRUE(1);

  StringUtilsC fooObject2 = fooObject; // use copy constructor


  fooObject.fooFunction(m_function_param);
  pFooObject->fooFunction(m_function_param);
  fooObject2.fooFunction(m_function_param);
}

} // utils end

নমুনা গেমটি মূল

#include "gtest/gtest.h"
#include "cStringUtils.h"

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv); 
  return RUN_ALL_TESTS();
}

আমি তারপরে ইউটিস ফোল্ডার থেকে নিম্নলিখিত কমান্ডগুলি দিয়ে গেটসগুলি সংকলন করতে এবং চালাতে পারি

cmake .
make 
./tests/gtestProject
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.