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

我正在使用 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 单元测试?

89086 次浏览
  1. 您可以检查 Testing/Temporary子文件夹。它是在运行 make 测试之后自动创建的。此文件夹包含两个文件: LastTest.logLastTestsFailed.logLastTest.log包含运行测试所需的输出。LastTestFailed.log包含失败测试的名称。因此,您可以在执行 make test之后手动检查它们。

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

    1. 放置在 构建目录(从中运行 make test)文件 CTestCustom.ctest 中(例如,可以使用 配置文件命令) ,其中包含以下内容

      CTEST _ CUSTOM _ POST _ TEST (“ cat test/Clinical/LastTest.log”)

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

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

关于自定义 ctest 的附加信息,你可以找到 给你。只需进入“自定义 cmake”部分。 祝你好运!

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

env CTEST_OUTPUT_ON_FAILURE=1 make check

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

我不得不自己加上“检查”目标。出于某种原因,“做测试”什么也做不了。因此,我所做的(正如在 stackoverflow 中所建议的那样)是手动添加这个目标。为了获得详细的输出,我只是这样写:

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

Make check CTEST _ OUTPUT _ ON _ FAILURE = TRUE

我的方法是结合 来自 Ony来自兹比谢克跑道上的的答案。我使用带有 -E env CTEST_OUTPUT_ON_FAILURE=1参数的 ${CMAKE_COMMAND}变量(设置为被调用的 cmake 可执行文件的绝对路径)使用 ${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便携式命令行工具模式的文档,请参见 Cmake-E env。我还在 ALL_BUILD上添加了一个依赖项,以便在调用 check目标之前构建所有项目。(在 Linux 构建中,可能需要用 ALL替换 ALL_BUILD; 我还没有在 Linux 上测试过这一点。)

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

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

您可以直接调用 ctest,在制作和完成您的项目之后。

ctest --verbose

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

ctest --output-on-failure

如果将 CMake 与 VisualStudio 的打开文件夹函数一起使用,则可以添加

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

设置为构建配置。

这使得测试输出更加冗长:

make test ARGS="-V"

要使用 XML 文件显示结果,必须使用以下命令执行测试

~$ ctest -T Test

我们在 Test/1234123432/test.xml 中找到了结果 其他文件也在测试文件夹中生成

ctest -VVctest --extra-verbose

来自 文件:

从测试中启用更详细的输出。

测试输出通常被禁止,只有摘要信息被禁止 此选项将显示更多的测试输出。

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

所以把这个添加到你的 CMake 文件中:

set(CMAKE_CTEST_ARGUMENTS "--verbose")

意味着 CTest 将始终运行详细的测试,或者对于失败测试的输出,使用:

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