使用CMake,如何从CTest获得详细输出?

Skr*_*sli 94 cmake ctest

我正在使用CMake来构建我的项目.我添加了一个使用Boost单元测试框架的单元测试二进制文件.这个二进制文件包含所有单元测试.我已经添加了由CTest运行的二进制文件:

ADD_EXECUTABLE( tftest test-main.cpp )
ENABLE_TESTING()
ADD_TEST( UnitTests tftest)
Run Code Online (Sandbox Code Playgroud)

但Visual Studio中的构建输出仅显示运行CTest的结果:

      Start 1: UnitTests
  1/1 Test #1: UnitTests ................***Failed    0.05 sec

  0% tests passed, 1 tests failed out of 1
Run Code Online (Sandbox Code Playgroud)

这不是很有用,因为我看不出哪个测试失败了.如果我从命令行手动运行ctest,--verbose我得到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
Run Code Online (Sandbox Code Playgroud)

那么,我需要在CMakeLists.txt中进行哪些更改才能让CTest --verbose始终运行?有没有更好的方法来使用CMake/CTest进行Boost单元测试?

ric*_*chq 81

您可以设置环境变量CTEST_OUTPUT_ON_FAILURE,只要测试失败,它就会显示测试程序的任何输出.使用Makefile和命令行时,这样做的一种方法如下:

env CTEST_OUTPUT_ON_FAILURE=1 make check
Run Code Online (Sandbox Code Playgroud)

此Stack Overflow问题和答案显示了如何在Visual Studio中设置环境变量.

  • @JoachimWuttke`set(CTEST_OUTPUT_ON_FAILURE TRUE)`没有设置*environment*变量.在命令行上尝试:`CTEST_OUTPUT_ON_FAILURE = TRUE make test`. (4认同)
  • 对我不起作用(ctest版本2.8.12.1).我试过`SET(CTEST_OUTPUT_ON_FAILURE TRUE)`和`SET(CTEST_OUTPUT_ON_FAILURE ON)`,但它没有效果.网上的其他报告证实这已经破裂. (3认同)
  • 使CTEST_OUTPUT_ON_FAILURE = 1测试更短,更好的IMO。 (2认同)

小智 29

你可以ctest在制作和制作项目后直接打电话.

ctest --verbose
Run Code Online (Sandbox Code Playgroud)


bed*_*uin 27

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

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

    1. 放置在构建目录(从中运行make test)文件CTestCustom.ctest(例如,您可以使用configure file命令执行)以及以下内容

      CTEST_CUSTOM_POST_TEST("cat Testing/Temporary/LastTest.log")

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

  1. make test再次运行并获得利润!

有关自定义ctest的更多信息,请点击此处.只需步骤"自定义cmake"部分.祝好运!


ony*_*ony 20

我不得不自己添加"检查"目标."做测试"由于某种原因没有做任何事情.所以我做了什么(就像在stackoverflow上提到的那样) - 我手动添加了这个目标.为了获得详细的输出,我只是写了:

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
Run Code Online (Sandbox Code Playgroud)


zby*_*zek 17

make check CTEST_OUTPUT_ON_FAILURE=TRUE

  • 所有的下选票都相当令人惊讶:这几乎等同于接受的答案,但更短更好.也适用于我测试过的项目. (6认同)
  • 进行CTEST_OUTPUT_ON_FAILURE = 1测试 (2认同)

Mik*_*eMB 16

有一个非常简单的解决方案(由于某些原因很难通过Google搜索找到):

ctest --output-on-failure
Run Code Online (Sandbox Code Playgroud)

如果您使用CMake与Visual Studio的打开文件夹功能,您可以添加

"ctestCommandArgs": "--output-on-failure"
Run Code Online (Sandbox Code Playgroud)

设置为您的构建配置.

  • 我非常喜欢你的解决方案;除了失败之外,它并不冗长。 (2认同)

Phi*_*hil 10

我的方法是来自ony,zbyszektarc的答案的组合.我使用${CMAKE_COMMAND}变量(设置为调用的cmake可执行文件的绝对路径)和-E env CTEST_OUTPUT_ON_FAILURE=1参数来调用实际的ctest命令${CMAKE_CTEST_COMMAND} -C $<CONFIG>.为了帮助澄清发生了什么,我从三个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
    )
Run Code Online (Sandbox Code Playgroud)

这适用于MSVC IDE,其中任何测试错误都显示为可点击的编译错误.有关便携式命令行工具模式的文档,请参阅cmake -E envcmake -E.我还添加了一个依赖项,ALL_BUILD以便在调用check目标之前构建所有项目.(在Linux版本,一个可能需要更换ALL_BUILDALL,我还没有在Linux上测试过这个呢.)


alw*_*mpe 10

现在有一个 CMake 变量允许您修改make test. CMAKE_CTEST_ARGUMENTS允许您设置在通过 运行时传递给 ctest 的参数列表make test

因此,将其添加到您的 CMake 文件中(必须位于上面enable_testing()):

set(CMAKE_CTEST_ARGUMENTS "--verbose")
Run Code Online (Sandbox Code Playgroud)

意味着 CTest 将始终以详细方式运行。或者仅获取失败测试的输出,请使用:

set(CMAKE_CTEST_ARGUMENTS "--output-on-failure")
Run Code Online (Sandbox Code Playgroud)

编辑:正如 RobLoach 所建议的,由于它是一个参数列表,因此您需要将其附加到列表中。

list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure")
Run Code Online (Sandbox Code Playgroud)

  • 由于它是参数列表,因此您需要附加到列表... list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure") (3认同)

Pen*_*eng 9

这使测试输出更加详细:

make test ARGS="-V"
Run Code Online (Sandbox Code Playgroud)


Tar*_*arc 6

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

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 6

ctest -VV或者ctest --extra-verbose

来自文档

启用测试的更详细输出。

测试输出通常被抑制,仅显示摘要信息。此选项将显示更多测试输出。