Ich benutze eine Variante von Richqs Antwort. In der obersten Ebene CMakeLists.txt
füge ich ein benutzerdefiniertes Ziel hinzu build_and_test
, um alle Tests zu erstellen und auszuführen:
find_package(GTest)
if (GTEST_FOUND)
enable_testing()
add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V)
add_subdirectory(test)
endif()
In den verschiedenen Unterprojektdateien CMakeLists.txt
unter test/
füge ich jede ausführbare Testdatei als Abhängigkeit von 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)
Mit diesem Ansatz, ich brauche nur make build_and_test
statt make test
(oder make all test
), und es hat den Vorteil, nur Testcode Aufbau (und ihre Abhängigkeiten). Schade, dass ich den Zielnamen nicht verwenden kann test
. In meinem Fall ist es nicht so schlimm , weil ich einen Top-Level - Skript, das funktioniert out-of-Baum Debug- und Release (und Cross-kompilierte) baut durch den Aufruf cmake
und dann make
, und es übersetzt test
in build_and_test
.
Offensichtlich ist das GTest-Zeug nicht erforderlich. Ich habe gerade Google Test verwendet / mag und wollte ein vollständiges Beispiel für die Verwendung mit CMake / CTest teilen. Meiner Meinung nach hat dieser Ansatz auch den Vorteil, dass ich ihn verwenden kann ctest -V
, der die Google Test-Ausgabe anzeigt, während die Tests ausgeführt werden:
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