使用cmake如何获得ctest的详细输出?
我正在使用CMake来构build我的项目。 我添加了一个使用boostunit testing框架的unit testing二进制文件。 这一个二进制包含了所有的unit testing。 我已经添加了由CTest运行的二进制文件:
ADD_EXECUTABLE( tftest test-main.cpp ) ENABLE_TESTING() ADD_TEST( UnitTests tftest)
但Visual Studio中的构build输出仅显示运行ctest的结果:
Start 1: UnitTests 1/1 Test #1: UnitTests ................***Failed 0.05 sec 0% tests passed, 1 tests failed out of 1
这不是很有帮助,因为我看不到哪个testing失败。 如果我从命令行手动运行ctest –verbose我从增强unit testing的输出,告诉什么实际上失败:
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? 有没有更好的方法来使用cmake / ctest的增强unit testing?
您可以设置环境variablesCTEST_OUTPUT_ON_FAILURE
,每当testing失败时它将显示来自testing程序的任何输出。 使用Makefiles和命令行时的一种方法如下:
env CTEST_OUTPUT_ON_FAILURE=1 make check
这个问题和答案显示了如何在Visual Studio中设置环境variables。
-
您可以检查
Testing/Temporary
子文件夹。 运行maketesting后自动创build。 该文件夹包含两个文件:LastTest.log
和LastTestsFailed.log
。LastTest.log
包含运行testing所需的输出。LastTestFailed.log
包含失败testing的名称。 所以你可以在执行make test
后手动检查它们。 -
第二种方法是让ctest在运行testing后显示日志文件的内容:
-
在build dir (从中运行
make test
)文件CTestCustom.ctest(例如,你可以用configure file命令来完成)CTEST_CUSTOM_POST_TEST(“cat Testing / Temporary / LastTest.log”)
-
您可以使用任何执行类似操作的Windows cmd命令来代替cat。
- 再次运行
make test
并获得利润!
有关定制ctest的更多信息,请点击这里 。 只需进入“自定义cmake”部分。 祝你好运!
我必须自己添加“检查”目标。 “做testing”由于某种原因不做任何事情。 所以我做了什么(就像在某个地方build议在stackoverflow) – 我手动添加此目标。 为了得到详细的输出,我只是这样写的:
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
你可以直接调用ctest
,做完你的项目后。
ctest --verbose
make check CTEST_OUTPUT_ON_FAILURE=TRUE
我的方法是来自ony , zbyszek和tarc的答案的组合。 我用-E env CTEST_OUTPUT_ON_FAILURE=1
参数使用${CMAKE_COMMAND}
variables(设置为被调用的cmake可执行文件的绝对path)来使用${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很好,其中任何testing错误都显示为可点击的编译错误。 有关cmake -E便携式命令行工具模式的文档,请参见cmake -E env 。 我还添加了对ALL_BUILD
的依赖关系,以便在调用check
目标之前构build所有项目。 (在Linux版本上,可能需要用ALL
replaceALL_BUILD
;我还没有在Linux上testing过。)
对于使用Visual Studio的人来说,这里是另一个主题的变体(hack):
cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS