111 Stimmen

CMake & CTest : make test erstellt keine Tests

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

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

7voto

quant Punkte 19263

Ersparen Sie sich die Kopfschmerzen:

make all test

Funktioniert bei mir sofort und erstellt Abhängigkeiten, bevor der Test ausgeführt wird. Wenn man bedenkt, wie einfach dies ist, macht es fast die native make test Diese Funktion ist praktisch, weil sie Ihnen die Möglichkeit gibt, die letzten Kompilierungstests auszuführen, selbst wenn Ihr Code fehlerhaft ist.

3voto

sakra Punkte 57239

Für CMake 3.10 oder später besteht eine weitere Möglichkeit darin, die TEST_INCLUDE_FILES um ein Skript einzurichten, das einen Build auslöst, bevor ein Test ausgeführt wird. In Ihrem äußersten CMakeLists.txt fügen Sie den folgenden Code hinzu:

set_property(DIRECTORY APPEND
    PROPERTY TEST_INCLUDE_FILES "${CMAKE_CURRENT_BINARY_DIR}/BuildTestTarget.cmake")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/BuildTestTarget.cmake"
   "execute_process(COMMAND \"${CMAKE_COMMAND}\""
   " --build \"${CMAKE_BINARY_DIR}\""
   " --config \"\$ENV{CMAKE_CONFIG_TYPE}\")")

Die eigentliche Testkonfiguration wird dem Build über die Umgebungsvariable CMAKE_CONFIG_TYPE . Optional können Sie eine --target um nur die für den Test erforderlichen Ziele zu erstellen.

2voto

Derrick Punkte 61

Das ist das, was ich mir ausgedacht habe und seither verwende:

set(${PROJECT_NAME}_TESTS a b c)

enable_testing()
add_custom_target(all_tests)
foreach(test ${${PROJECT_NAME}_TESTS})
        add_executable(${test} EXCLUDE_FROM_ALL ${test}.cc)
        add_test(NAME ${test} COMMAND $<TARGET_FILE:${test}>)
        add_dependencies(all_tests ${test})
endforeach(test)

build_command(CTEST_CUSTOM_PRE_TEST TARGET all_tests)
string(CONFIGURE \"@CTEST_CUSTOM_PRE_TEST@\" CTEST_CUSTOM_PRE_TEST_QUOTED ESCAPE_QUOTES)
file(WRITE "${CMAKE_BINARY_DIR}/CTestCustom.cmake" "set(CTEST_CUSTOM_PRE_TEST ${CTEST_CUSTOM_PRE_TEST_QUOTED})" "\n")

YMMV

1voto

user2394284 Punkte 4682

Derricks Antwort, vereinfacht und kommentiert:

# It is impossible to make target "test" depend on "all":
# https://gitlab.kitware.com/cmake/cmake/-/issues/8774
# Set a magic variable in a magic file that tells ctest
# to invoke the generator once before running the tests:
file(WRITE "${CMAKE_BINARY_DIR}/CTestCustom.cmake"
    "set(CTEST_CUSTOM_PRE_TEST ${CMAKE_MAKE_PROGRAM})\n"
)

Es ist nicht ganz korrekt, da es das Problem der Gleichzeitigkeit der Ausführung von ninja all test für den Fall, dass jemand das tut. Im Gegenteil, denn jetzt haben Sie zwei Ninja-Prozesse.

(Ftr, ich habe auch diese Lösung geteilt aquí .)

-4voto

holmescn Punkte 1116

Alle oben genannten Antworten sind perfekt. Aber eigentlich CMake verwenden CTest als seine Test-Tools, so dass die Standardmethode (ich denke, es ist), um die Mission zu tun ist:

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

Dann laufen cmake y hacer um die Ziele zu erstellen. Danach können Sie entweder Test machen , oder führen Sie einfach

ctest

erhalten Sie das Ergebnis. Dies wurde unter CMake 2.8 getestet.

Einzelheiten finden Sie unter: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X