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

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

env CTEST_OUTPUT_ON_FAILURE=1 make check

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

你可以在制作项目之后直接调用ctest

ctest --verbose

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

ctest --output-on-failure

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

"ctestCommandArgs": "--output-on-failure"
  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("猫测试/临时/LastTest.log")

您可以使用任何Windows cmd命令来代替cat。

  • 再次运行make test并获得利润!
  • 关于定制ctest的更多信息可以在这里找到。请转到"自定义cmake"部分。好运!

    我必须自己添加"check"目标。"make tests"由于某种原因什么也没做。所以我所做的(就像在stackoverflow上建议的那样)-我手动添加了这个目标。为了得到详细的输出,我只是这样写:

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

    这使得测试输出更详细:

    make test ARGS="-V"
    

    make check CTEST_OUTPUT_ON_FAILURE=TRUE

    我的方法是来自ony、zbyszek和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 env获取cmake -E便携式命令行工具模式的文档。我还添加了对ALL_BUILD的依赖,以便在调用check目标之前构建所有项目。(在Linux版本中,可能需要将ALL_BUILD替换为ALL;我还没有在Linux上测试过。

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

    所以把这个添加到你的CMake文件(必须在enable_testing()之上):

    set(CMAKE_CTEST_ARGUMENTS "--verbose")
    

    表示CTest将始终运行verbose。或者对于失败测试的输出,使用:

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

    编辑:正如RobLoach所建议的那样,由于它是一个参数列表,因此您将需要将其附加到列表中。

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

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

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

    ctest -VVctest --extra-verbose

    从文档:

    启用更详细的测试输出。

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

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

    执行测试
    ~$ ctest -T Test
    

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

    相关内容

    • 没有找到相关文章

    最新更新