CMake & CTest: make test не создает тесты
Я пытаюсь CTest в CMake для того, чтобы автоматически запускать некоторые из моих тестов с помощью make test цель. Проблема в том, что CMake не "понимает", что тест, который я готов запустить, должен быть построен, поскольку он является частью проекта.
поэтому я ищу способ явно указать эту зависимость.
7 ответов:
Это возможно a ошибка в CMake (ранее отслеживались здесь) что это не работает из коробки. Обходной путь заключается в следующем:
add_test(TestName ExeName) add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} DEPENDS ExeName)затем вы можете запустить
make checkи он будет компилировать и запускать тест. Если у вас есть несколько тестов, то вам придется использоватьDEPENDS exe1 exe2 exe3 ...в строке выше.
на самом деле есть способ использовать
make test. Необходимо определить сборку исполняемого файла теста как один из тестов, а затем добавить зависимости между тестами. То есть: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)
я использую вариант ответа ричка. В верхнем уровне
CMakeLists.txt, я добавляю пользовательскую цель,build_and_test, для построения и выполнения всех тестов:find_package(GTest) if (GTEST_FOUND) enable_testing() add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V) add_subdirectory(test) endif()в различных подпроектах
CMakeLists.txtфайлыtest/, я добавляю каждый тестовый исполняемый файл как зависимость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)при таком подходе мне просто нужно
make build_and_testвместоmake test(илиmake all test), и он имеет преимущество только построения тестового кода (и его зависимостей). Жаль, что я не могу использовать имя целиtest. В моем случае это не так плохо, потому что у меня есть скрипт верхнего уровня, который выполняет отладку и выпуск вне дерева (и кросс-скомпилированные) сборки, вызываяcmakeа тоmake, и он переводитtestнаbuild_and_test.очевидно, что GTest материал не требуется. Я просто использую / как Google Test, и хотел бы поделиться полным примером его использования с CMake/CTest. ИМХО, этот подход также имеет преимущество, позволяя мне использовать
ctest -V, который показывает Выход теста Google во время выполнения тестов: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
Если вы пытаетесь подражать
make check, вы можете найти эту запись Вики полезным:http://www.cmake.org/Wiki/CMakeEmulateMakeCheck
Я только что проверил, что это делает то, что он говорит с успехом (CMake 2.8.10).
избавить себя от головной боли:
make all testработает из коробки для меня и будет строить зависимости перед запуском теста. Учитывая, насколько это просто, это почти делает родной
make testфункциональность удобна, потому что она дает вам возможность запускать последние тесты компиляции, даже если ваш код сломан.
все выше ответы совершенны. Но на самом деле CMake использует CTest в качестве своих инструментов тестирования, поэтому стандартный метод (я думаю, что это так) для выполнения миссии:
enable_testing () add_test (TestName TestCommand) add_test (TestName2 AnotherTestCommand)затем запустите cmake и сделать для создания цели. После этого вы можете либо запустить сделайте тест, или просто запустить
ctestвы получите результат. Это проверено под CMake 2.8 .
Проверьте детали на: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing
все ответы хороши, но они подразумевают нарушение традиции запустить тест командой
make test. Я сделал этот трюк:add_test(NAME <mytest> WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND sh -c "make <mytarget>; $<TARGET_FILE:<mytarget>>")это означает, что тест состоит из построения (необязательно) и запуска исполняемого объекта.
Comments