133

我正在使用 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

这不是很有帮助,因为我看不到哪个测试失败了。如果我从命令行手动运行 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

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

4

11 回答 11

110

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

env CTEST_OUTPUT_ON_FAILURE=1 make check

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

于 2011-04-22T15:54:25.147 回答
54

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

ctest --verbose
于 2016-07-15T01:32:50.660 回答
33
  1. 您可以检查Testing/Temporary子文件夹。它是在运行 make test 后自动创建的。此文件夹包含两个文件:LastTest.logLastTestsFailed.log. LastTest.log包含运行测试所需的输出。LastTestFailed.log包含失败测试的名称。所以你可以在执行后手动检查它们make test

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

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

      CTEST_CUSTOM_POST_TEST("猫测试/临时/LastTest.log")

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

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

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

于 2011-04-19T04:06:17.693 回答
31

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

ctest --output-on-failure

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

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

设置为您的构建配置。

于 2018-02-22T21:47:07.683 回答
25

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

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
于 2013-04-05T16:52:45.117 回答
21

make check CTEST_OUTPUT_ON_FAILURE=TRUE

于 2015-02-09T21:05:48.937 回答
18

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

make test ARGS="-V"
于 2018-09-10T21:32:13.980 回答
10

我的方法是结合来自 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_BUILDALL;我还没有在 Linux 上测试过。)

于 2015-06-29T20:00:15.897 回答
6

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

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
于 2016-05-09T19:30:02.937 回答
5

ctest -VV或者ctest --extra-verbose

文档

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

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

于 2019-10-25T17:07:53.017 回答
0

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

~$ ctest -T Test

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

于 2019-08-28T08:57:53.583 回答