Uso una variante della risposta di richq. Nel livello superiore CMakeLists.txt
, aggiungo un target personalizzato,, build_and_test
per la creazione e l'esecuzione di tutti i test:
find_package(GTest)
if (GTEST_FOUND)
enable_testing()
add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V)
add_subdirectory(test)
endif()
Nei vari CMakeLists.txt
file di sottoprogetto sotto test/
, aggiungo ogni eseguibile di test come dipendenza di build_and_test
:
include_directories(${CMAKE_SOURCE_DIR}/src/proj1)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(proj1_test proj1_test.cpp)
target_link_libraries(proj1_test ${GTEST_BOTH_LIBRARIES} pthread)
add_test(proj1_test proj1_test)
add_dependencies(build_and_test proj1_test)
Con questo approccio, ho solo bisogno make build_and_test
di make test
(o make all test
), e ha il vantaggio di creare solo codice di test (e le sue dipendenze). È un peccato non poter usare il nome del bersaglio test
. Nel mio caso, non è così male perché ho uno script di primo livello che esegue il debug e il rilascio fuori dall'albero (e le compilazioni incrociate) chiamando cmake
e poi make
, e si traduce test
in build_and_test
.
Ovviamente, la roba GTest non è richiesta. Mi è capitato di usare / come Google Test e volevo condividere un esempio completo di utilizzo con CMake / CTest. IMHO, questo approccio ha anche il vantaggio di consentirmi di utilizzare ctest -V
, che mostra l'output di Google Test durante l'esecuzione dei test:
1: Running main() from gtest_main.cc
1: [==========] Running 1 test from 1 test case.
1: [----------] Global test environment set-up.
1: [----------] 1 test from proj1
1: [ RUN ] proj1.dummy
1: [ OK ] proj1.dummy (0 ms)
1: [----------] 1 test from proj1 (1 ms total)
1:
1: [----------] Global test environment tear-down
1: [==========] 1 test from 1 test case ran. (1 ms total)
1: [ PASSED ] 1 test.
1/2 Test #1: proj1_test ....................... Passed 0.03 sec