【问题标题】:CppUnit tests always passing with CtestCppUnit 测试总是通过 Ctest
【发布时间】:2013-07-27 07:42:00
【问题描述】:

我正在使用 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)

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% 测试通过,3 次测试中有 0 次失败

我错过了什么?

【问题讨论】:

    标签: cmake cppunit ctest


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 这确实有效,但是 CMake 似乎正在重定向测试的标准输出(使用 CppUnit 打印很多有用的信息来指示错误所在),并且只告诉测试是否通过与否。当测试没有通过时,我仍然需要手动再次运行它以获得更好的报告。欢迎提出任何建议!
    • 而不是make test,从您的构建文件夹中,您应该能够运行ctest -V 以获得详细输出,或者ctest --output-on-failure
    • 谢谢,太好了!
    • 你也可以试试make check,因为这会打印出详细的输出,而无需直接调用ctest
    • AFAIK make check 默认不可用
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 2020-03-01
    • 2021-10-29
    • 2023-03-20
    • 2021-04-11
    • 2016-05-31
    • 2020-05-21
    • 2018-04-17
    相关资源
    最近更新 更多