Frage CMake & CTest: make test erstellt keine Tests


Ich versuche CTest in CMake, um einige meiner Tests automatisch auszuführen make test Ziel. Das Problem ist, dass CMake nicht "versteht", dass der Test, den ich ausführen möchte, erstellt werden muss, da er Teil des Projekts ist.

Ich suche nach einer Möglichkeit, diese Abhängigkeit explizit anzugeben.


76
2018-04-09 09:22


Ursprung


Antworten:


Es ist wohl ein Fehler in CMake (zuvor verfolgt Hier) dass das nicht out of the box funktioniert. Eine Problemumgehung besteht darin, Folgendes zu tun:

add_test(TestName ExeName)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}
                  DEPENDS ExeName)

Dann kannst du rennen make check und es wird den Test kompilieren und ausführen. Wenn Sie mehrere Tests haben, dann müssten Sie verwenden DEPENDS exe1 exe2 exe3 ... in der obigen Zeile.


58
2018-04-10 05:57



Es gibt tatsächlich einen Weg zu benutzen make test. Sie müssen den Build der ausführbaren Testdatei als einen der Tests definieren und dann Abhängigkeiten zwischen den Tests hinzufügen. Das ist:

ADD_TEST(ctest_build_test_code
         "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target test_code)
ADD_TEST(ctest_run_test_code test_code)
SET_TESTS_PROPERTIES(ctest_run_test_code
                     PROPERTIES DEPENDS ctest_build_test_code)

43
2018-05-30 21:32



Ich benutze eine Variante von richqs Antwort. In der obersten Ebene CMakeLists.txt, Füge ich ein benutzerdefiniertes Ziel hinzu, build_and_test, für den Aufbau und den Betrieb aller Tests:

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 Teilprojekten CMakeLists.txt Dateien unter test/, Ich füge jeden Test ausführbar als eine 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 muss ich nur make build_and_test Anstatt von make test (oder make all test), und es hat den Vorteil, nur Testcode (und seine Abhängigkeiten) zu erstellen. Es ist eine Schande, dass ich den Zielnamen nicht verwenden kann test. In meinem Fall ist es nicht so schlimm, weil ich ein Top-Level-Skript habe, das Debugging- und Release-Builds (und Cross-Compiled-Builds) von Out-of-Tree durch Aufruf ausführt cmake und dann makeund es übersetzt test in build_and_test.

Offensichtlich wird das GTest-Zeug nicht benötigt. Ich benutze / mag einfach Google Test und wollte ein komplettes Beispiel für die Verwendung mit CMake / CTest teilen. IMHO, dieser Ansatz hat auch den Vorteil, mir zu erlauben, zu verwenden ctest -V, die die Google Test-Ausgabe während der Tests anzeigt:

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

11
2018-02-25 05:53



Wenn Sie versuchen zu emulieren make check, Sie können diesen Wiki-Eintrag nützlich finden:

http://www.cmake.org/Wiki/CMakeEmulateMakeCheck

Ich habe gerade überprüft, dass das mit Erfolg funktioniert (CMake 2.8.10).


5
2018-03-12 16:08



Sparen Sie sich die Kopfschmerzen:

make all test

Funktioniert out of the box für mich und erstellt Abhängigkeiten, bevor der Test ausgeführt wird. Angesichts dessen, wie einfach das ist, macht es fast das Native make test Funktionalität praktisch, weil es Ihnen die Möglichkeit bietet, die letzten Compiling-Tests auszuführen, selbst wenn Ihr Code kaputt ist.


4
2018-04-04 08:48



Alle obigen Antworten sind perfekt. Aber eigentlich sollte CMest CTest als Test-Tool verwenden, also ist die Standardmethode (ich denke, es ist) für die Mission:

enable_testing ()
add_test (TestName TestCommand)
add_test (TestName2 AnotherTestCommand)

Dann renne cmake und machen um die Ziele zu bauen. Danach können Sie entweder laufen mach einen Testoder lauf einfach

ctest

Du wirst das Ergebnis bekommen. Dies wird unter CMake 2.8 getestet.

Überprüfen Sie Details unter: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing


-2
2017-08-24 14:20



Alle Antworten sind gut, aber sie beinhalten einen Bruch der Tradition, um einen Test per Befehl durchzuführen make test. Ich habe diesen Trick gemacht:

add_test(NAME <mytest>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND sh -c "make <mytarget>; $<TARGET_FILE:<mytarget>>")

Dies bedeutet, dass der Test darin besteht, ein ausführbares Ziel zu erstellen (optional) und auszuführen.


-4
2018-05-20 13:25