GTest और CMake के साथ काम करना कैसे शुरू करें


125

मुझे हाल ही में अपने C ++ प्रोजेक्ट्स को संकलित करने के लिए CMake का उपयोग करने पर बेचा गया है, और अब मैं अपने कोड के लिए कुछ यूनिट टेस्ट लिखना शुरू करना चाहूंगा। मैंने इसकी सहायता के लिए Google परीक्षण उपयोगिता का उपयोग करने का निर्णय लिया है, लेकिन आरंभ करने में कुछ मदद की आवश्यकता है।

पूरे दिन मैं विभिन्न गाइडों और उदाहरणों को पढ़ रहा हूं , इसमें प्राइमर , आईबीएम पर एक परिचय और एसओ ( यहां और यहां कुछ प्रश्न) शामिल हैं ) साथ ही साथ अन्य स्रोत भी शामिल हैं जिनका मैंने ट्रैक किया है। मुझे लगता है कि वहाँ बहुत कुछ है, लेकिन किसी तरह मुझे अभी भी मुश्किलें हो रही हैं।

मैं वर्तमान में सबसे बुनियादी परीक्षण को लागू करने की कोशिश कर रहा हूं, यह पुष्टि करने के लिए कि मैंने सही तरीके से संकलित / स्थापित किया है और यह काम नहीं कर रहा है। एकमात्र स्रोत फ़ाइल (testgtest.cpp) को इस पिछले उत्तर से लगभग बिल्कुल लिया गया है :

#include <iostream>

#include "gtest/gtest.h"

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

और मेरे संबद्ध CMakeLists.txt इस प्रकार है:

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
)

ध्यान दें कि मैंने cpp फ़ाइल के अंत में मुख्य प्रदान करने के बजाय gtest_main के खिलाफ लिंक करना चुना है क्योंकि मेरा मानना ​​है कि यह मुझे कई फ़ाइलों तक अधिक आसानी से परीक्षण करने की अनुमति देगा।

जब निर्मित .sln फ़ाइल (दृश्य C ++ 2010 एक्सप्रेस में) का निर्माण करते हैं, तो मुझे दुर्भाग्य से फॉर्म की त्रुटियों की एक लंबी सूची मिलती है

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)

जो मुझे लगता है कि इसका मतलब है कि मैं सफलतापूर्वक gtest पुस्तकालयों से लिंक नहीं कर रहा हूं। मैंने यह सुनिश्चित किया है कि डिबग लाइब्रेरी के खिलाफ लिंक करते समय, मैंने तब डिबग मोड में निर्माण करने की कोशिश की है।

संपादित करें

कुछ और खुदाई करने के बाद, मुझे लगता है कि मेरा मुद्दा पुस्तकालय के प्रकार के साथ कुछ करना है जो मैं gtest में बना रहा हूं। सीएमके के साथ गाइस्ट का निर्माण करते समय, यदि BUILD_SHARED_LIBSसंयुक्त राष्ट्र की जाँच की जाती है, और मैं अपने प्रोग्राम को इन .lib फ़ाइलों के खिलाफ लिंक करता हूं , तो मुझे ऊपर उल्लिखित त्रुटियां मिलती हैं। हालांकि, यदिBUILD_SHARED_LIBS जाँच की जाती है तो मैं .lib और .dll फ़ाइलों का एक सेट तैयार करता हूँ। जब अब इन .lib के विरुद्ध लिंक करने से प्रोग्राम कंपाइल होता है, लेकिन जब रन शिकायत करता है कि वह gtest.dll नहीं पा सकता है।

एक SHAREDऔर नहीं SHAREDपुस्तकालय के बीच अंतर क्या हैं , और अगर मैं साझा नहीं चुनते हैं, तो यह काम क्यों नहीं करता है? क्या मेरी परियोजना के लिए CMakeLists.txt में कोई विकल्प है जो मुझे याद आ रही है?


4
के ExternalProject_Addबजाय का उपयोग करके आप अपने आप में GTest स्रोतों को शामिल करने से बच सकते हैं add_subdirectory। देखें इस उत्तर जानकारी के लिए।
फ्रेजर

उपरोक्त समाधान उदाहरण में हमारे पास $ {gtest_SOURCE_DIR} की पहुंच क्यों है? उस चर को कैसे / कहाँ घोषित किया गया है?
डॉमोनोपॉली

अरे यह gtest-1.6.0 / CMakeLists.txt: "प्रोजेक्ट (gtest CXX C)" में घोषित किया गया है, जो वैरिएबल gtest_SOURCE_DIR और gtest_BINARY_DIR उपलब्ध कराता है।
14

1
क्या करता enable_testing()है?
updogliu

1
@updogliu: यह ctest और 'परीक्षण' (या 'RUN_TESTS') लक्ष्य को सक्षम करता है। यह add_test () cmake कमांड के साथ खेलता है।
इला .२'२

जवाबों:


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
मुझे यकीन नहीं है कि add_test () क्या करता है, लेकिन यह परीक्षण बाइनरी रनिंग में परिणाम नहीं लगता है ... क्या मुझे कुछ याद आ रहा है?
वेबर 2

4
एक मरे हुए घोड़े को हराने के लिए नहीं, लेकिन मुझे लगा कि यह फिर से ध्यान देने योग्य है। ऊपर फ्रेजर की टिप्पणी एक बहुत महत्वपूर्ण बिंदु बनाती है: "आप add_subdirectory के बजाय बाहरीProject_Add का उपयोग करके अपने आप में GTest स्रोतों को शामिल करने से बच सकते हैं।" फ्रेजर के जवाब और विवरणों के लिए यहां देखें: stackoverflow.com/a/9695234/1735836
पेट्रीसिया

1
मेरे मामले में, मुझे pthreadलिंक किए गए पुस्तकालयों में जोड़ने की भी ज़रूरत थी , दूसरी अंतिम पंक्ति को target_link_libraries(runUnitTests gtest gtest_main pthread)
बदलकर

3
@ weberc2 आपको make testपरीक्षणों को चलाने के लिए या ctestनिर्माण निर्देशिका से चलाना होगा । ctest -VGoogle परीक्षण आउटपुट के साथ-साथ आउटपुट देखने के लिए चलाएँ 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
मुझे नहीं पता कि आप इसके लिए क्यों टूट गए। आपका समाधान किसी को संस्करण नियंत्रण पर Google टेस्ट में जांचने से रोकता है। अपने समाधान के लिए यश।
साल

4
आपके द्वारा उपयोग किया गया URL अब टूट गया है। एक अप-टू-डेट URL हैhttps://github.com/google/googletest/archive/release-1.8.0.zip
ऑगस्टार

बहुत बढ़िया जवाब। नंबर 1 होना चाहिए
Mr00Anderson

1
greate जवाब! इसके अलावा हम GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.8.1URL का उपयोग कर सकते हैं
TingQian LI

Gtest नवीनतम रिलीज़ का URL है:https://github.com/google/googletest/archive/release-1.10.0.zip
vahancho

16

आप दोनों दुनिया के सर्वश्रेष्ठ प्राप्त कर सकते हैं। ExternalProjectGtest स्रोत को डाउनलोड करने के लिए इसका उपयोग करना संभव है और फिर add_subdirectory()इसे अपने बिल्ड में जोड़ने के लिए उपयोग करें। इसके निम्नलिखित फायदे हैं:

  • gtest को आपके मुख्य बिल्ड के हिस्से के रूप में बनाया गया है, इसलिए यह समान संकलक झंडे आदि का उपयोग करता है और इसलिए प्रश्न में वर्णित की तरह समस्याओं से बचा जाता है।
  • अपने स्वयं के स्रोत ट्री में gtest स्रोतों को जोड़ने की कोई आवश्यकता नहीं है।

सामान्य तरीके से उपयोग किया जाता है, एक्सप्रोप्रोजेक्ट कॉन्फ़िगर समय पर डाउनलोडिंग और अनपैकिंग नहीं करेगा (यानी जब सीएमके चलाया जाता है), लेकिन आप इसे केवल थोड़ा सा काम करने के लिए प्राप्त कर सकते हैं। मैंने एक ब्लॉग पोस्ट लिखा है कि यह कैसे करना है जिसमें एक सामान्यीकृत कार्यान्वयन भी शामिल है जो किसी भी बाहरी परियोजना के लिए काम करता है जो सीएमके को अपने सिस्टम के रूप में उपयोग करता है, न कि केवल gtest में। आप उन्हें यहां पा सकते हैं:

अद्यतन: यह दृष्टिकोण अब googletest प्रलेखन का भी हिस्सा है


2
IMO, यह शायद सीएमके प्रोजेक्ट के साथ Google परीक्षण को लागू करने का सबसे साफ तरीका है। काश, मध्यस्थ उत्तर की सामग्री और गुणवत्ता पर अधिक ध्यान देते।
NameRakes 5

लिंक किया गया DownloadProject.cmake सामान्यीकृत मॉड्यूल बढ़िया है। यह महसूस करता है कि सीमेक के लिए एक पैकेज प्रबंधन प्रणाली का आधार है जहां मुझे सभी सीएमके संगत गीथब यूआरएल के लिंक की एक सूची चाहिए।
जोश पीक

13

सबसे अधिक संभावना है, आपके परीक्षण बाइनरी और Google टेस्ट लाइब्रेरी के बीच संकलक विकल्पों में अंतर ऐसी त्रुटियों के लिए जिम्मेदार है। इसीलिए इसे Google टेस्ट को स्रोत रूप में लाने और इसे अपने परीक्षणों के साथ बनाने की सिफारिश की गई है। CMake में करना बहुत आसान है। आप बस ADD_SUBDIRECTORYgtest रूट के पथ के साथ आह्वान करते हैं और फिर आप वहां परिभाषित सार्वजनिक पुस्तकालय लक्ष्यों ( gtestऔर gtest_main) का उपयोग कर सकते हैं । Googletestframework समूह में इस CMake थ्रेड में पृष्ठभूमि की अधिक जानकारी है ।

[संपादित करें] BUILD_SHARED_LIBSविकल्प केवल विंडोज के लिए अब तक प्रभावी है। यह पुस्तकालयों के प्रकार को निर्दिष्ट करता है जिन्हें आप CMake बनाना चाहते हैं। यदि आप इसे सेट करते हैं ON, तो सीएमके उन्हें स्थिर देयताओं के विपरीत DLL के रूप में निर्माण करेगा। उस स्थिति में आपको अपने परीक्षण -DGTEST_LINKED_AS_SHARED_LIBRARY = 1 के साथ बनाने होंगे और CMake द्वारा उत्पादित DLL फ़ाइलों को अपने परीक्षण बाइनरी के साथ निर्देशिका में कॉपी करना होगा (CMake उन्हें डिफ़ॉल्ट रूप से अलग आउटपुट निर्देशिका में रखता है)। जब तक स्टैटिक लिबास में gtest आपके लिए काम नहीं करता, तब तक उस विकल्प को सेट करना आसान नहीं है।


1
महान धन्यवाद, एहसास नहीं था कि आप उसी तरह CMakeLists के भीतर पूरी तरह से अलग परियोजनाओं का निर्माण कर सकते हैं। मैं अब सुरक्षित रूप से कह सकता हूं कि EXPECT_EQ (1.0 == 1.0) गुजरता है और EXPECT_EQ (0.0 == 1.0) विफल रहता है। अब और अधिक वास्तविक परीक्षणों का समय ...
क्रिस

2

कुछ और खुदाई करने के बाद, मुझे लगता है कि मेरा मुद्दा पुस्तकालय के प्रकार के साथ कुछ करना है जो मैं gtest में बना रहा हूं। सीएमके के साथ gtest का निर्माण करते समय, अगर BUILD_SHARED_LIBS को अन-चेक किया गया है, और मैं इन प्रोग्रामों को इन .lib फ़ाइलों के खिलाफ लिंक करता हूं, तो मुझे ऊपर उल्लिखित त्रुटियां मिलती हैं। हालाँकि, अगर BUILD_SHARED_LIBS की जाँच की जाती है तो मैं .lib और .dll फ़ाइलों का एक सेट तैयार करता हूँ। जब अब इन .lib के विरुद्ध लिंक करने से प्रोग्राम कंपाइल होता है, लेकिन जब रन शिकायत करता है कि वह gtest.dll नहीं पा सकता है।

ऐसा इसलिए है क्योंकि आपको अपनी परियोजना में संकलक परिभाषाओं के लिए -DGTEST_LINKED_AS_SHARED_LIBRARY = 1 को जोड़ना है, यदि आप साझा पुस्तकालय के रूप में gtest का उपयोग करना चाहते हैं।

आप स्थैतिक पुस्तकालयों का भी उपयोग कर सकते हैं, बशर्ते आपने जो त्रुटियाँ देखी हैं, उन्हें समाप्त करने के लिए आप इसे gtest_force_sared_crt विकल्प के साथ संकलित कर सकते हैं।

मुझे पुस्तकालय पसंद है लेकिन इसे परियोजना में जोड़ना एक वास्तविक दर्द है। और आपके पास इसे तब तक करने का कोई मौका नहीं है जब तक कि आप gtest cmake फ़ाइलों में खुदाई (और हैक) न करें। शर्म की बात है। विशेष रूप से मुझे gtest को एक स्रोत के रूप में जोड़ने का विचार पसंद नहीं है। :)


1

ओपी विंडोज का उपयोग कर रहा है, और आज जीसीएस्ट का उपयोग करने का एक बहुत आसान तरीका vcpkg + cmake के साथ है।


Https://github.com/microsoft/vcpkg के अनुसार vcpkg स्थापित करें , और सुनिश्चित करें कि आप vcpkgcmd लाइन से चल सकते हैं । Vcpkg इंस्टॉलेशन फोल्डर पर ध्यान दें, जैसे।C:\bin\programs\vcpkg

Gtest का उपयोग कर स्थापित करें vcpkg install gtest: यह 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 चलाएँ: (यदि आवश्यक हो तो vcpkg फ़ोल्डर को संपादित करें, और सुनिश्चित करें कि vcpkg.cmake toolchain फ़ाइल का पथ सही है)

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

और cmake --build buildहमेशा की तरह उपयोग करके निर्माण करें । ध्यान दें कि, vcpkg स्थापित फ़ोल्डर से डीबग / रिलीज़ फ़ोल्डर में आवश्यक gtest (d) .dll / gtest (d) _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)

आपके सिस्टम पर Gestest पहले से ही स्थापित होना चाहिए।


यह वास्तव में CMake में इस तरह पुस्तकालय को जोड़ने के लिए एक अच्छा अभ्यास नहीं है। Cmake का एक मुख्य उद्देश्य यह है कि "यह काम पहले ही स्थापित किया जाना चाहिए ..." जैसी धारणा नहीं बनानी चाहिए। CMake जाँचता है कि पुस्तकालय यहाँ है, और यदि नहीं, तो एक त्रुटि है।
बजे एड्रियन BARRAL

0

बस स्वीकृत उत्तर में @ पेट्रीसिया की टिप्पणी और मूल प्रश्न के लिए @ फ्रेजर की टिप्पणी के अपडेट के रूप में, यदि आपके पास सीएमके 3.11+ तक पहुंच है, तो आप सीएमके का उपयोग कर सकते हैं फेटकॉन्टेंट फ़ंक्शन ।

CMake का FetchContent पेज एक उदाहरण के रूप में googletest का उपयोग करता है!

मैंने स्वीकृत उत्तर का एक छोटा संशोधन प्रदान किया है:

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जैसे ही वे google test CMakeLists.txt स्क्रिप्ट में सेट होते हैं आप gtest और gtest_main लक्ष्यों की लक्षित संपत्ति का उपयोग कर सकते हैं ।


CMake> = v3.14 में आप स्पष्ट target_include_directoriesऔर FetchContent_MakeAvailable(googletest)इसके बदले उपयोग कर सकते हैं । यह दोनों सामग्री को पॉप्युलेट करेगा और इसे मुख्य बिल्ड में जोड़ेगा। CMake FetchContent - अधिक जानकारी
67hz

0

मैंने कुछ जेनेरिक को एक साथ वास्तविक त्वरित रूप से फेंकने का फैसला किया, जो पहले से पोस्ट किए गए उत्तरों की तुलना में इसे करने का एक अलग तरीका प्रदर्शित करता है, इस उम्मीद में कि यह किसी की मदद कर सकता है। निम्नलिखित मेरे लिए मेरे मैक पर काम किया। सबसे पहले मैंने gtests के लिए सेटअप कमांड चलाए। मैंने बस एक स्क्रिप्ट का उपयोग किया जो मुझे सब कुछ सेटअप करने के लिए मिला।

#!/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

मैंने बर्तन फ़ोल्डर के लिए एक शीर्ष स्तर CMakeLists.txt बनाया, और परीक्षण फ़ोल्डर के लिए एक 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)

यह परीक्षण फ़ोल्डर में CMakeLists.txt है

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})

फिर जो कुछ बचा है, उसे एक नमूना gtest और gtest मुख्य लिखना है

नमूना

#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

नमूना gtest main

#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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.