使用CMake,我如何从CTest中获取详细输出?

163

我正在使用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运行?是否有更好的方法来使用CMake / CTest进行Boost单元测试?


1
这个回答解决了你的问题吗?在CMakeLists.txt文件中,将"ctest"命令永久替换为"ctest --output-on-failure",适用于特定项目。参考链接 - Erunehtar
12个回答

124

您可以使用ctest --output-on-failure选项,或设置环境变量CTEST_OUTPUT_ON_FAILURE,这将在测试失败时显示测试程序的任何输出。当使用Makefiles和命令行时,一种实现方式如下:

env CTEST_OUTPUT_ON_FAILURE=1 make check

这个 Stack Overflow 的问题和答案 展示了如何在 Visual Studio 中设置环境变量。


3
对我来说不起作用(ctest版本2.8.12.1)。我尝试了SET(CTEST_OUTPUT_ON_FAILURE TRUE)SET(CTEST_OUTPUT_ON_FAILURE ON),但没有效果。网络上的其他报告证实了这是有问题的。 - Joachim W
8
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE) 不会设置环境变量。请在命令行上尝试这个:CTEST_OUTPUT_ON_FAILURE=TRUE make test - thehouse
6
在我看来,make CTEST_OUTPUT_ON_FAILURE=1 test 更加简洁优美。 - Timmmm
在Windows批处理文件中,如何在调用--msbuild /toolsversion:15.0 /p:Configuration=Release /p:Platform=x64 TESTS.vcxproj时使用CTEST_OUTPUT_ON_FAILURE=1? - Toral
1
根据手册man 1 ctest,与--output-on-failure相同。 - user2394284
@richq,“make check”是什么?而我经常看到的是“make test”,而不是“make check”。 - John

63
你可以在使用cmake和make完成项目后,直接调用ctest
ctest --verbose

38

有一个非常简单的解决方案(但不知为何在谷歌搜索中很难找到):

ctest --output-on-failure

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

"ctestCommandArgs": "--output-on-failure"

设置为您的构建配置。


2
我非常喜欢你的解决方案;除了失败之外,它并不啰嗦。 - adentinger
1
如果我想在成功时输出怎么办? - Avrdan
你的意思是只有成功时才执行,而失败时不执行? - MikeMB

36
  1. 您可以查看Testing/Temporary子文件夹。在运行make test后,它会自动创建。该文件夹包含两个文件:LastTest.logLastTestsFailed.logLastTest.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”部分即可。祝好运!


1
好的,谢谢。我希望有一种方法可以修改插入到项目/Makefile中用于ctest的标志,但我没有找到任何东西,你的答案似乎证实了这一点。文件名信息很有帮助! - Skrymsli
1
大约在 ctest 2.8.10 左右,使用 CTEST_CUSTOM_POST_TEST 中的带参数的外部命令已经失效了。具体请参阅 https://github.com/openscad/openscad/issues/260 - don bright
1
@don:也许他们没有在 ctest 上运行足够的测试;-) - Joachim W
CMake中关于CTEST_CUSTOM_POST_TEST的问题已在2.8.12版本中修复。 - Ela782
CTEST_CUSTOM_POST_TEST("cat Testing/Temporary/LastTest.log") 是有效的。但它显示的是上一次 CTest 运行的日志 :( - undefined

24

这将使测试输出更加详细:

make test ARGS="-V"

1
很好,这正是我想要的。这确保了我的print_message输出在所有测试都成功时也会显示出来 - 否则我只能在失败时看到这些打印。 - Sajjon
1
在我看来,这是唯一正确的答案。那些“失败输出”的答案并不合格,因为在成功执行的情况下,可能需要生成报告/结果。 - Avrdan

24

我不知道为什么"make tests"没有起作用,所以我自己添加了一个"check"目标。根据stackoverflow上的建议,我手动添加了这个目标。要获取详细的输出信息,我将其编写如下:

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)

21

运行命令make check CTEST_OUTPUT_ON_FAILURE=TRUE


8
所有的踩都相当令人惊讶:这个回答几乎等同于被接受的答案,但更短更优美。我也在我测试的项目中使用了它。 - zbyszek
4
将CTEST_OUTPUT_ON_FAILURE=1 test添加到命令中以运行测试,并在测试失败时输出详细信息。 - Alex Punnen

11

我的方法是将 onyzbyszektarc 的回答结合起来。我使用 ${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
    )

这对于MSVC IDE非常友好,任何测试错误都会显示为可点击的编译错误。请参见CMake -E env文档中的cmake -E便携式命令行工具模式。我还添加了对ALL_BUILD的依赖,以便在调用check目标之前将构建所有项目。(在Linux构建中,可能需要将ALL_BUILD替换为ALL; 我尚未在Linux上进行测试。)


9

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

因此,将以下内容添加到您的CMake文件中(必须位于enable_testing()之上):

set(CMAKE_CTEST_ARGUMENTS "--verbose")

这意味着CTest将始终以详细模式运行。或者,如果只需要失败测试的输出,请使用:

set(CMAKE_CTEST_ARGUMENTS "--output-on-failure")

编辑: 根据RobLoach的建议,由于这是一个参数列表,您将希望将其附加到列表中。

list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure")

3
由于这是一个参数列表,您需要将其附加到列表中...list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure") - RobLoach

6

ctest -VVctest --extra-verbose

来自文档:

使测试输出更加详细。

测试输出通常被禁止并且仅显示总结信息。这个选项将展示更多的测试输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接