Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake CPP单元测试始终通过Ctest_Cmake_Cppunit_Ctest - Fatal编程技术网

Cmake CPP单元测试始终通过Ctest

Cmake CPP单元测试始终通过Ctest,cmake,cppunit,ctest,Cmake,Cppunit,Ctest,我正在使用CMake进行一个项目,并且刚刚集成了一些单元测试。我想使用CTest,因此我在CMakeLists.txt文件中使用add_test,以便在键入make test时执行测试。 然而,我观察到,当键入maketest时,它表示所有测试都通过了,即使我做了一个小错误的测试。错误测试在手动执行(例如../my_测试)时报告这些错误,但在使用make test执行时不报告这些错误 以下是测试目录中my CMakeLists.txt的内容: add_executable(TestDataSpa

我正在使用CMake进行一个项目,并且刚刚集成了一些单元测试。我想使用CTest,因此我在CMakeLists.txt文件中使用add_test,以便在键入
make test
时执行测试。 然而,我观察到,当键入
maketest
时,它表示所有测试都通过了,即使我做了一个小错误的测试。错误测试在手动执行(例如../my_测试)时报告这些错误,但在使用
make test
执行时不报告这些错误

以下是测试目录中my 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抱怨没有找到它们

进行测试
输出以下内容:

正在运行测试。。。测试项目

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个测试失败


我遗漏了什么?

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

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

或者,您可以通过设置和/或的值来修改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,打印大量有用的信息以指示错误的位置),并且只告诉测试是否通过。当一个测试没有通过时,我仍然需要手动再次运行它以获得更好的报告。欢迎任何建议!您应该能够从构建文件夹中运行
ctest-V
以获得详细输出,而不是
maketest
,或者
ctest--output on failure
谢谢,这太完美了!您也可以尝试执行
make check
,因为这会打印详细的输出,而无需直接调用
ctest
。默认情况下,AFAIK
make check
不可用