Frage

Ich versuche CTest in CMake, um automatisch einige meiner Tests laufen make test Ziel verwenden. Das Problem ist CMake nicht „verstehen“, dass der Test Ich bin bereit ist zu laufen gebaut werden, da sie Teil des Projektes ist.

Also ich nach einer Möglichkeit, explizit diese Abhängigkeit angeben.

War es hilfreich?

Lösung

Es ist wohl ein Fehler in CMake (früher verfolgt hier ), dass dies nicht aus der Box funktioniert . Eine Abhilfe ist folgendes zu tun:

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

Dann können Sie laufen make check und es wird kompilieren und führen Sie den Test. Wenn Sie mehrere Tests haben, dann würden Sie haben DEPENDS exe1 exe2 exe3 ... in der obigen Zeile verwenden.

Andere Tipps

Es ist eigentlich eine Art und Weise make test zu verwenden. Sie müssen den Build der Test ausführbare Datei als einer der Tests definieren, und fügen Sie dann Abhängigkeiten zwischen den Tests. 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)

Ich benutze eine Variante von richq Antwort. In der obersten Ebene CMakeLists.txt, füge ich ein benutzerdefiniertes Ziel, build_and_test, zum Erstellen und Ausführen 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 Teilprojekt CMakeLists.txt Dateien unter test/, ich jeden Test ausführbar als Abhängigkeit von build_and_test hinzufügen:

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 statt make build_and_test make test (oder make all test), und es hat den Vorteil, nur Gebäude Testcode (und seine Abhängigkeiten). Es ist schade, dass ich nicht die Zielnamen test verwenden kann. In meinem Fall ist es nicht so schlimm, weil ich eine Top-Level-Skript, das funktioniert out-of-Baum Debug- und Release (und Cross-kompiliert) baut durch cmake aufrufen und dann make, und es übersetzt test in build_and_test.

Offensichtlich ist die Gtest Sachen nicht erforderlich. Ich bin eben verwenden / wie Google-Test, und wollte mit CMake / CTest des Verwendens es ein komplettes Beispiel teilen. IMHO, dieser Ansatz hat auch den Vorteil, dass mir ctest -V verwenden, die die Google-Test Ausgabe zeigt, während die Tests ausgeführt:

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

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

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

Ich habe überprüft nur, dass sie das tut, was er sagt, mit Erfolg (CMake 2.8.10).

Sparen Sie sich die Kopfschmerzen:

make all test

Funktioniert bei mir aus der Box und Abhängigkeiten bauen, bevor der Test ausgeführt wird. Bedenkt man, wie einfach das ist, macht es fast die native make test Funktionalität praktisch, weil es die Möglichkeit, den Betrieb der letzten Übersetzungs- Tests gibt, auch wenn Ihr Code gebrochen ist.

Das ist, was ich gehämmert und wurde mit:

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

Wenn Sie CMake verwenden> = 3,7, dann ist die empfohlene Vorgehensweise verwenden Armaturen :

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)

Alle oben genannten Antworten sind perfekt. Aber CMake tatsächlich CTest als Test-Tools zu verwenden, um die Standard-Methode (ich glaube, es ist), um die Mission zu tun ist:

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

Führen Sie dann Cmake und machen , um die Ziele zu bauen. Danach können Sie entweder laufen make test , oder führen Sie einfach

ctest

Sie werden das Ergebnis. Dies wird getestet unter CMake 2.8.

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

Alle Antworten sind gut, aber sie bedeuten eine Verletzung der Tradition einen Test durch Befehl make test auszuführen. Ich habe diesen Trick getan:

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

Das bedeutet, dass der Test des Gebäudes besteht (optional) und Ausführen von ausführbarem Ziel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top