使用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。

  1. 您可以检查Testing/Temporary子文件夹。 运行maketesting后自动创build。 该文件夹包含两个文件: LastTest.logLastTestsFailed.logLastTest.log包含运行testing所需的输出。 LastTestFailed.log包含失败testing的名称。 所以你可以在执行make test后手动检查它们。

  2. 第二种方法是让ctest在运行testing后显示日志文件的内容:

    1. build dir (从中运行make test )文件CTestCustom.ctest(例如,你可以用configure file命令来完成)

      CTEST_CUSTOM_POST_TEST(“cat Testing / Temporary / LastTest.log”)

您可以使用任何执行类似操作的Windows cmd命令来代替cat。

  1. 再次运行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版本上,可能需要用ALLreplaceALL_BUILD ;我还没有在Linux上testing过。)

对于使用Visual Studio的人来说,这里是另一个主题的变体(hack):

 cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS