ChatGPT解决这个技术问题 Extra ChatGPT

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


P
Peter Mortensen

您可以设置环境变量 CTEST_OUTPUT_ON_FAILURE,它会在测试失败时向您显示测试程序的任何输出。使用 Makefiles 和命令行时执行此操作的一种方法如下:

env CTEST_OUTPUT_ON_FAILURE=1 make check

This Stack Overflow question and answer 展示了如何在 Visual Studio 中设置环境变量。


对我不起作用(ctest 版本 2.8.12.1)。我试过 SET(CTEST_OUTPUT_ON_FAILURE TRUE)SET(CTEST_OUTPUT_ON_FAILURE ON),但没有效果。网络上的其他报告证实了这一点。
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE) 没有设置 environment 变量。在命令行上试试这个:CTEST_OUTPUT_ON_FAILURE=TRUE make test
make CTEST_OUTPUT_ON_FAILURE=1 test 更短且更好的 IMO。
在 Windows 批处理文件上,如何在调用时使用 CTEST_OUTPUT_ON_FAILURE=1 -- msbuild /toolsversion:15.0 /p:Configuration=Release /p:Platform=x64 TESTS.vcxproj
与手册中的 --output-on-failure 相同:man 1 ctest
J
JAL

在 cmaking 和 make 项目之后,您可以直接调用 ctest

ctest --verbose

M
Mark Lakata

您可以检查测试/临时子文件夹。它是在运行 make test 后自动创建的。此文件夹包含两个文件:LastTest.log 和 LastTestsFailed.log。 LastTest.log 包含运行测试所需的输出。 LastTestFailed.log 包含失败测试的名称。所以你可以在执行 make test 后手动检查它们。第二种方法是让 ctest 在运行测试后向您显示日志文件的内容:放置在构建目录(您从中运行 make test)文件 CTestCustom.ctest(例如,您可以使用配置文件命令),如下所示内容 CTEST_CUSTOM_POST_TEST("cat Testing/Temporary/LastTest.log")

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

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

有关自定义 ctest 的其他信息,您可以找到 here。只需进入“自定义 cmake”部分。祝你好运!


好的谢谢。我希望有一种方法可以修改插入到 ctest 项目/makefile 中的标志,但我没有找到任何东西,你的回答似乎证实了这一点。文件名信息很有帮助!
在 ctest 2.8.10 附近的某个地方,他们使用带有 CTEST_CUSTOM_POST_TEST 参数的外部命令破坏了,请参阅 github.com/openscad/openscad/issues/260
@don:也许他们没有在 ctest 上运行足够的测试;-)
CTEST_CUSTOM_POST_TEST 的 CMake 问题已在 2.8.12 中修复。
P
Peter Mortensen

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

ctest --output-on-failure

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

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

设置为您的构建配置。


我非常喜欢你的解决方案;除了失败之外,它并不冗长。
如果我想输出成功怎么办?
你的意思是只在成功时,而不是在失败时?
o
ony

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

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

z
zbyszek

make check CTEST_OUTPUT_ON_FAILURE=TRUE


所有的反对票都相当令人惊讶:这几乎等同于公认的答案,但更短更好。也适用于我测试的项目。
进行 CTEST_OUTPUT_ON_FAILURE=1 测试
P
Penghe Geng

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

make test ARGS="-V"

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

我的方法是结合答案 from onyfrom zbyszekfrom tarc。我使用带有 -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_BUILD 替换为 ALL;我尚未在 Linux 上对此进行测试。)


T
Tarc

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

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

D
Daniel

ctest -VVctest --extra-verbose

documentation

从测试中启用更详细的输出。测试输出通常被抑制,只显示摘要信息。此选项将显示更多的测试输出。


a
alwaysmpe

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

因此,将其添加到您的 CMake 文件中:

set(CMAKE_CTEST_ARGUMENTS "--verbose")

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

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

A
Amirouche Zeggagh

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

~$ ctest -T Test

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


使用 -T 在 XML 中有一些摘要信息,但它只包括顶级测试,而不包括单个测试用例。有没有办法也显示这些?