【问题标题】:Using CMake, how do I get verbose output from CTest?使用 CMake,如何从 CTest 获得详细输出?
【发布时间】:2011-08-08 06:29:29
【问题描述】:

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

【问题讨论】:

标签: cmake ctest


【解决方案1】:

您可以设置环境变量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
【解决方案2】:

您可以在 cmaking 和制作项目后直接致电ctest

ctest --verbose

【讨论】:

    【解决方案3】:
    1. 您可以查看Testing/Temporary 子文件夹。它是在运行 make test 后自动创建的。此文件夹包含两个文件:LastTest.logLastTestsFailed.logLastTest.log 包含运行测试所需的输出。 LastTestFailed.log 包含失败测试的名称。所以你可以在执行make test之后手动检查。

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

      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 的其他信息,您可以找到 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 中修复。
    【解决方案4】:

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

    ctest --output-on-failure
    

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

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

    设置为您的构建配置。

    【讨论】:

    • 我非常喜欢您的解决方案;除了失败之外,它并不冗长。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      make check CTEST_OUTPUT_ON_FAILURE=TRUE

      【讨论】:

      • 所有的反对票都相当令人惊讶:这几乎等同于接受的答案,但更短更好。也适用于我测试的项目。
      • 进行 CTEST_OUTPUT_ON_FAILURE=1 测试
      【解决方案7】:

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

      make test ARGS="-V"
      

      【讨论】:

      • 很好,正是我想要的。这确保了即使所有测试都成功了,我用print_message 打印的输出也会显示 - 否则我只会看到那些失败的打印。
      【解决方案8】:

      我的方法是结合from onyfrom zbyszekfrom tarc 的答案。我使用${CMAKE_COMMAND} 变量(设置为调用的cmake 可执行文件的绝对路径)和-E env CTEST_OUTPUT_ON_FAILURE=1 参数来调用使用${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 上测试过。)

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

          ctest -VVctest --extra-verbose

          来自documentation

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

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

          【讨论】:

            【解决方案11】:

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

            ~$ ctest -T Test
            

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

            【讨论】:

              猜你喜欢
              • 2015-04-27
              • 1970-01-01
              • 1970-01-01
              • 2021-11-09
              • 2013-09-28
              • 1970-01-01
              • 1970-01-01
              • 2020-10-13
              • 2020-03-26
              相关资源
              最近更新 更多