CMake & CTest: make test не создает тесты - PullRequest
81 голосов
/ 09 апреля 2009

Я пробую CTest в CMake, чтобы автоматически запустить некоторые из моих тестов, используя цель make test. Проблема в том, что CMake не «понимает», что тест, который я хочу выполнить, должен быть построен, поскольку он является частью проекта.

Поэтому я ищу способ явно указать эту зависимость.

Ответы [ 9 ]

70 голосов
/ 10 апреля 2009

возможно ошибка в CMake (ранее отслеживалась здесь ), что это не работает из коробки. Обходной путь должен сделать следующее:

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

Затем вы можете запустить make check, и он скомпилирует и запустит тест. Если у вас есть несколько тестов, вам придется использовать DEPENDS exe1 exe2 exe3 ... в приведенной выше строке.

48 голосов
/ 31 мая 2012

На самом деле есть способ использовать 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)
12 голосов
/ 25 февраля 2013

Я использую вариант ответа richq. На верхнем уровне 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 Test во время выполнения тестов:

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
6 голосов
/ 12 марта 2013

Если вы пытаетесь эмулировать make check, вам может пригодиться эта статья в вики:

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

Я только что проверил, что делает то, что он говорит с успехом (CMake 2.8.10).

4 голосов
/ 04 апреля 2015

избавь себя от головной боли:

make all test

Работает для меня из коробки и будет строить зависимости перед запуском теста. Учитывая, насколько это просто, это почти делает нативную функциональность make test удобной, потому что дает вам возможность запускать последние тесты компиляции, даже если ваш код не работает.

0 голосов
/ 04 июня 2019

Если вы используете CMake> = 3.7, то рекомендуется использовать приборы :

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 голосов
/ 21 декабря 2018

Это то, что я выбил и использовал:

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

0 голосов
/ 20 мая 2013

Все ответы хорошие, но они подразумевают нарушение традиции запускать тест по команде make test. Я сделал этот трюк:

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

Это означает, что тест состоит из сборки (необязательно) и запуска исполняемой цели.

0 голосов
/ 24 августа 2012

Все ответы выше идеальны. Но на самом деле CMake использует CTest в качестве инструментов тестирования, поэтому стандартный метод (я думаю, что так и есть) для выполнения миссии:

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

Затем запустите cmake и make для построения целей. После этого вы можете либо запустить make test , либо просто запустить

ctest

вы получите результат. Это проверено под CMake 2.8.

Проверьте подробности по адресу: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...