it-swarm.com.de

CMake & CTest: make test erstellt keine Tests

Ich versuche CTest in CMake, um einige meiner Tests automatisch mit make test target auszuführen. 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 also nach einer Möglichkeit, diese Abhängigkeit explizit anzugeben.

79
claf

Es ist wohl ein Fehler in CMake (zuvor verfolgt hier ), dass dies nicht außerhalb der Box funktioniert. Eine Problemumgehung 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 ausführen und der Test wird kompiliert und ausgeführt. Wenn Sie mehrere Tests haben, müssen Sie DEPENDS exe1 exe2 exe3 ... in der obigen Zeile verwenden.

64
richq

Es gibt tatsächlich eine Möglichkeit, make test zu verwenden. 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)
47
Iakov

Ich verwende eine Variante von Richqs Antwort. In der obersten Ebene CMakeLists.txt füge ich ein benutzerdefiniertes Ziel build_and_test zum Erstellen und Ausführen aller Tests hinzu:

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 Unterprojekten CMakeLists.txt-Dateien unter test/ füge ich jede ausführbare Testdatei als eine Abhängigkeit von build_and_test hinzu:

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) verwenden, und es hat den Vorteil, dass nur Testcode (und seine Abhängigkeiten) erstellt werden. Es ist eine Schande, dass ich den Zielnamen test nicht verwenden kann. In meinem Fall ist es nicht so schlimm, weil ich ein Top-Level-Skript habe, das Out-of-Tree-Debugging und Release-Builds (und Kreuzkompilierungen) durch Aufruf von cmake und dann make ausführt und test in build_and_test übersetzt.

Das GTest-Zeug ist natürlich nicht erforderlich. Ich habe zufällig/like Google Test verwendet und wollte ein vollständiges Beispiel für die Verwendung mit CMake/CTest zeigen. Meines Erachtens hat dieser Ansatz auch den Vorteil, dass ich ctest -V verwenden darf, der die Google-Test-Ausgabe während des Tests zeigt:

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
Trevor Robinson

Wenn Sie versuchen, make check zu emulieren, kann dieser Wiki-Eintrag nützlich sein:

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

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

5
Samuel

Sparen Sie sich die Kopfschmerzen:

make all test

Funktioniert von Anfang an für mich und baut Abhängigkeiten auf, bevor der Test ausgeführt wird. In Anbetracht dessen, wie einfach dies ist, macht es die native make test-Funktionalität beinahe praktisch, da Sie hier die Möglichkeit haben, die letzten kompilierenden Tests auszuführen, selbst wenn Ihr Code beschädigt ist.

4
quant

Das ist, was ich herausgefunden habe und 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 \"@[email protected]\" 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

0
Derrick

Wenn Sie CMake> = 3.7 verwenden, ist der empfohlene Ansatz Fixtures :

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