Ich benutze eine Variante von Richqs Antwort. In der obersten Ebene CMakeLists.txtfü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.txtunter 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_teststatt 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 cmakeund dann make, und es übersetzt testin 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