2013-07-26 4 views
3

Я работаю над проектом с использованием CMake и просто интегрировал некоторые тесты CppUnit. Я хотел бы использовать CTest, и поэтому я использовал add_test в моих файлах CMakeLists.txt, чтобы тесты выполнялись при вводе make test. Тем не менее я заметил, что при вводе make test в нем говорится, что все тесты прошли, даже если я делаю тест с тривиальными ошибками. Ошибочные тесты сообщают об этих ошибках при выполнении вручную (например ./my_test), но не при выполнении с использованием make test.Тесты CppUnit всегда проходят с Ctest

Вот содержание моего CMakeLists.txt в тестовом каталоге:

add_executable(TestDataSpace TestDataSpace.cpp) 
target_link_libraries(TestDataSpace ${DEP_LIBRARIES} ${CPPUNIT_LIBRARIES}) 

add_executable(TestVariableManager TestVariableManager.cpp) 
target_link_libraries(TestVariableManager ${DEP_LIBRARIES} ${CPPUNIT_LIBRARIES}) 

add_executable(TestLayoutManager TestLayoutManager.cpp) 
target_link_libraries(TestLayoutManager ${DEP_LIBRARIES} ${CPPUNIT_LIBRARIES}) 

add_test(NAME "TestDataSpace" COMMAND ${MY_PROJECT_SOURCE_DIR}/test/TestDataSpace) 
add_test(NAME "TestVariableManager" COMMAND ${MY_PROJECT_SOURCE_DIR}/test/TestVariableManager) 
add_test(NAME "TestLayoutManager" COMMAND ${MY_PROJECT_SOURCE_DIR}/test/TestLayoutManager) 

CTest действительно находит исполняемые файлы, так как поставив неправильный путь для команды делает CMake жалуется, что он не находит их.

make test выводит следующие:

Запуск тестов ... Тест проект

Start 1: TestDataSpace 1/3 Test #1: TestDataSpace .................... Passed 0.01 sec 
Start 2: TestVariableManager 2/3 Test #2: TestVariableManager .............. Passed 0.02 sec 
Start 3: TestLayoutManager 3/3 Test #3: TestLayoutManager ................ Passed 0.01 sec 

100% испытания прошли, 0 тестов не удалось из 3

Что я упускаю ?

ответ

6

Я не знаком с CppUnit, но я подозреваю, что ваши исполняемые файлы всегда возвращают 0, даже если сбой теста. Для подтверждения успеха CTest возвращает 0.

Если вы измените свое возвращаемое значение, если тест не прошел к ненулевому числу, вы должны увидеть ожидаемый результат от CTest.

В качестве альтернативы, вы можете изменить поведение CTest с помощью set_tests_properties, чтобы установить значения PASS_REGULAR_EXPRESSION и/или FAIL_REGULAR_EXPRESSION. Если любое из них установлено, возвращаемое значение игнорируется. Так, например, вы могли бы сделать:

set_tests_properties(
    TestDataSpace 
    TestVariableManager 
    TestLayoutManager 
     PROPERTIES PASS_REGULAR_EXPRESSION "TEST PASSED;Pass") 

Как и в сторону, вы можете избежать прохождения полного пути к тестовым исполняемым в вашем случае, поскольку они являются реальными объектами CMake, определенные в том же CMakeLists.txt:

add_test(NAME TestDataSpace COMMAND TestDataSpace) 
add_test(NAME TestVariableManager COMMAND TestVariableManager) 
add_test(NAME TestLayoutManager COMMAND TestLayoutManager) 
+0

Это действительно работает, однако CMake, похоже, перенаправляет стандартные результаты тестов (которые, используя CppUnit, печатает много полезной информации, чтобы указать, где была ошибка), и только сообщает, прошел тест или нет. Когда тест не проходит, я все равно должен запустить его снова вручную, чтобы получить лучший отчет. Любое предложение приветствуется! – sunmat

+3

Вместо того, чтобы 'make test', из вашей папки сборки вы можете запустить' ctest -V' для подробного вывода или 'ctest --out-on-failure' – Fraser

+0

Спасибо, это прекрасно! – sunmat