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.

98voto

richq Punkte 53842

Sie ist wohl a Fehler in CMake (zuvor verfolgt aquí ), dass dies nicht ohne Weiteres funktioniert. Eine Umgehung besteht darin, Folgendes zu tun:

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

Dann können Sie make check und es wird kompiliert und der Test ausgeführt. Wenn Sie mehrere Tests haben, dann müssen Sie DEPENDS exe1 exe2 exe3 ... in der obigen Zeile.

62voto

Iakov Nakhimovski Punkte 767

Es gibt tatsächlich eine Möglichkeit, die 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 heißt:

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)

19voto

John Freeman Punkte 2165

Wenn Sie CMake >= 3.7 verwenden, dann ist die empfohlene Vorgehensweise die Verwendung von Vorrichtungen :

add_executable(test test.cpp)
add_test(test_build
  "${CMAKE_COMMAND}"
  --build "${CMAKE_BINARY_DIR}"
  --config "$<CONFIG>"
  --target test
)
set_tests_properties(test_build PROPERTIES FIXTURES_SETUP    test_fixture)
add_test(test test)
set_tests_properties(test       PROPERTIES FIXTURES_REQUIRED test_fixture)

Damit wird Folgendes erreicht:

  • Fügt eine test ausführbares Ziel, das aus test.cpp
  • Fügt eine test_build "test", das Cmake ausführt, um das Ziel zu erstellen test
  • Markiert die test_build Test zu einer Einrichtungsaufgabe der Halterung test_fixture
  • Hinzufügen einer test Test, der nur die test ausführbar
  • Markiert die test Test zu benötigen Halterung test_fixture .

Also, jedes Mal, wenn der Test test ausgeführt werden soll, wird zuerst der Test test_build , die die erforderliche ausführbare Datei erstellt.

16voto

Trevor Robinson Punkte 14524

Ich verwende eine Variante von richqs Antwort. In der obersten Ebene CMakeLists.txt füge ich ein benutzerdefiniertes Ziel hinzu, build_and_test für die Erstellung und Durchführung 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/ füge ich jede ausführbare Testdatei 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)

Bei diesem Ansatz muss ich nur make build_and_test anstelle von make test (oder make all test ), und es hat den Vorteil, dass nur Testcode (und dessen Abhängigkeiten) erstellt wird. 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 Debug- und Release-Builds (und Cross-Compile-Builds) außerhalb des Baums durch den Aufruf von cmake und dann make und wird übersetzt mit test in build_and_test .

Die GTest-Sachen sind natürlich nicht erforderlich. Ich benutze/mag Google Test einfach und wollte ein komplettes Beispiel für die Verwendung mit CMake/CTest teilen. IMHO hat dieser Ansatz auch den Vorteil, dass ich ctest -V die die Ausgabe von Google Test anzeigt, während die Tests laufen:

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

7voto

Samuel Punkte 121

Wenn Sie versuchen, Folgendes nachzuahmen make check finden Sie vielleicht diesen Wiki-Eintrag nützlich:

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

Ich habe soeben überprüft, dass es das tut, was es sagt, mit Erfolg (CMake 2.8.10).

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