我使用CMake来构建我的项目。我添加了一个使用Boost单元测试框架的单元测试二进制文件。这个二进制文件包含了所有的单元测试。我已经添加了由CTest运行的二进制文件:
ADD_EXECUTABLE( tftest test-main.cpp )
ENABLE_TESTING()
ADD_TEST( UnitTests tftest)
但是Visual Studio中的构建输出只显示运行CTest的结果:
Start 1: UnitTests
1/1 Test #1: UnitTests ................***Failed 0.05 sec
0% tests passed, 1 tests failed out of 1
这不是很有用,因为我看不到哪个测试失败了。如果我用--verbose
从命令行手动运行ctest,我会得到Boost单元测试的输出,它告诉我们实际失败的是什么:
1: Test command: tftest.exe
1: Test timeout computed to be: 9.99988e+006
1: Running 4 test cases...
1: test-main.cpp(20): error in "sanity_check3": check 1 == 2 failed
1:
1: *** 1 failure detected in test suite "Master Test Suite"
1/1 Test #1: UnitTests ................***Failed 0.00 sec
那么,我需要在CMakeLists.txt中更改什么以使CTest始终与--verbose
一起运行?是否有更好的方法来使用Boost单元测试与CMake/CTest?
您可以使用ctest --output-on-failure
选项,或者设置环境变量CTEST_OUTPUT_ON_FAILURE
,它将在测试失败时显示测试程序的任何输出。在使用Makefiles和命令行时,这样做的一种方法如下:
env CTEST_OUTPUT_ON_FAILURE=1 make check
这个Stack Overflow问答展示了如何在Visual Studio中设置环境变量。
你可以在制作项目之后直接调用ctest
。
ctest --verbose
有一个非常简单的解决方案(由于某些原因很难通过Google搜索找到):
ctest --output-on-failure
如果你使用CMake与Visual Studio的打开文件夹功能,你可以添加
"ctestCommandArgs": "--output-on-failure"
您可以查看
Testing/Temporary
子文件夹。它在运行make test后自动创建。该文件夹包含两个文件:LastTest.log
和LastTestsFailed.log
。LastTest.log
包含运行测试所需的输出。LastTestFailed.log
包含失败测试的名称。所以你可以在执行make test
后手动检查它们第二种方法是让ctest在运行测试后显示日志文件的内容:
放置在构建目录(从这里运行
make test
)文件CTestCustom。Ctest(例如,您可以使用configure file命令来执行)使用以下内容CTEST_CUSTOM_POST_TEST("猫测试/临时/LastTest.log")
您可以使用任何Windows cmd命令来代替cat。
- 再次运行
make test
并获得利润!
关于定制ctest的更多信息可以在这里找到。请转到"自定义cmake"部分。好运!
我必须自己添加"check"目标。"make tests"由于某种原因什么也没做。所以我所做的(就像在stackoverflow上建议的那样)-我手动添加了这个目标。为了得到详细的输出,我只是这样写:
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
这使得测试输出更详细:
make test ARGS="-V"
make check CTEST_OUTPUT_ON_FAILURE=TRUE
我的方法是来自ony、zbyszek和tarc的答案的组合。我使用${CMAKE_COMMAND}
变量(设置为被调用的cmake可执行文件的绝对路径)和-E env CTEST_OUTPUT_ON_FAILURE=1
参数来使用${CMAKE_CTEST_COMMAND} -C $<CONFIG>
调用实际的ctest命令。为了帮助说明发生了什么,我从三个cmake -E echo
命令开始,以显示当前工作目录和要调用的ctest命令。下面是我如何调用add_custom_target
。
add_custom_target(check
${CMAKE_COMMAND} -E echo CWD=${CMAKE_BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -E echo CMD=${CMAKE_CTEST_COMMAND} -C $<CONFIG>
COMMAND ${CMAKE_COMMAND} -E echo ----------------------------------
COMMAND ${CMAKE_COMMAND} -E env CTEST_OUTPUT_ON_FAILURE=1
${CMAKE_CTEST_COMMAND} -C $<CONFIG>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS ALL_BUILD
)
在MSVC IDE中,任何测试错误都显示为可点击的编译错误。参见cmake -E env获取cmake -E
便携式命令行工具模式的文档。我还添加了对ALL_BUILD
的依赖,以便在调用check
目标之前构建所有项目。(在Linux版本中,可能需要将ALL_BUILD
替换为ALL
;我还没有在Linux上测试过。
现在有一个CMake变量允许你修改make test
的行为。CMAKE_CTEST_ARGUMENTS允许你设置一个参数列表,当通过make test
运行时传递给ctest。
所以把这个添加到你的CMake文件(必须在enable_testing()
之上):
set(CMAKE_CTEST_ARGUMENTS "--verbose")
表示CTest将始终运行verbose。或者对于失败测试的输出,使用:
set(CMAKE_CTEST_ARGUMENTS "--output-on-failure")
编辑:正如RobLoach所建议的那样,由于它是一个参数列表,因此您将需要将其附加到列表中。
list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure")
对于使用Visual Studio的人,这里有另一个关于主题的变体(hack):
cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
ctest -VV
或ctest --extra-verbose
启用更详细的测试输出。
测试输出通常被抑制,只有摘要信息被抑制显示出来。这个选项将显示更多的测试输出。
要用XML文件显示结果,您必须使用以下命令
执行测试~$ ctest -T Test
,我们在Testing/1234123432/test.xml中找到了结果和其他文件也生成在测试文件夹