CppUnit测试总是通过Ctest传递

sun*_*mat 3 cppunit cmake ctest

我正在使用CMake开发一个项目,并且只是集成了一些CppUnit测试.我想使用CTest,因此我在我的CMakeLists.txt文件中使用了add_test来在输入时执行测试make test.然而我观察到,在输入时make test,它表示即使我用微不足道的错误进行测试,所有测试都会通过.手动执行时(例如./my_test),错误的测试会报告这些错误,但在执行时不会报告make test.

以下是测试目录中我的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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

100%测试通过,0测试失败3

我错过了什么?

Fra*_*ser 7

我不熟悉CppUnit,但我怀疑你的可执行文件总是返回0,即使测试失败.CTest返回0表示成功.

如果在测试失败时更改返回值为非零数字,则应该看到CTest的预期输出.

或者,您可以使用set_tests_properties设置PASS_REGULAR_EXPRESSION和/或的值来修改CTest的行为FAIL_REGULAR_EXPRESSION.如果设置了其中任何一个,则忽略返回值.例如,您可以这样做:

set_tests_properties(
    TestDataSpace
    TestVariableManager
    TestLayoutManager
        PROPERTIES PASS_REGULAR_EXPRESSION "TEST PASSED;Pass")
Run Code Online (Sandbox Code Playgroud)

另外,您可以避免将完整路径传递给您的案例中的测试可执行文件,因为它们是在同一个CMakeLists.txt中定义的实际CMake目标:

add_test(NAME TestDataSpace COMMAND TestDataSpace)
add_test(NAME TestVariableManager COMMAND TestVariableManager)
add_test(NAME TestLayoutManager COMMAND TestLayoutManager)
Run Code Online (Sandbox Code Playgroud)

  • 而不是`make test`,你应该能够运行`ctest -V`来获得详细的输出,或者`ctest --output-on-failure` (3认同)