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


109

我正在使用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中进行什么更改才能--verbose始终运行CTest ?有没有更好的方法将Boost单元测试与CMake / CTest一起使用?


Answers:


92

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

env CTEST_OUTPUT_ON_FAILURE=1 make check

此堆栈溢出问题和答案显示了如何在Visual Studio中设置环境变量。


3
不适用于我(ctest版本2.8.12.1)。我尝试了SET(CTEST_OUTPUT_ON_FAILURE TRUE)SET(CTEST_OUTPUT_ON_FAILURE ON),但没有任何效果。网络上的其他报告证实了这种情况。
约阿希姆W

4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)没有设置环境变量。试试这个命令行:CTEST_OUTPUT_ON_FAILURE=TRUE make test
thehouse

3
make CTEST_OUTPUT_ON_FAILURE=1 test是更短更好的IMO。
Timmmm

在Windows批处理文件上,如何在调用时使用CTEST_OUTPUT_ON_FAILURE = 1 – msbuild /toolsversion:15.0 / p:Configuration = Release / p:Platform = x64 TESTS.vcxproj
Toral


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

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

    1. 将CTestCustom.ctest(例如,可以使用configure file命令执行)放置在生成目录中(从中运行make test),其内容如下

      CTEST_CUSTOM_POST_TEST(“ cat Testing / Temporary / LastTest.log”)

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

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

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


1
好的谢谢。我希望有一种方法可以修改插入到ctest的项目/ makefile中的标志,但是我什么也没找到,您的回答似乎可以证实这一点。文件名信息很有帮助!
Skrymsli 2011年

1
在ctest 2.8.10左右的某个地方,他们已使用带有CTEST_CUSTOM_POST_TEST中的参数的外部命令破坏了它们,请参见github.com/openscad/openscad/issues/260
明亮

@don:也许他们没有在ctest上运行足够的测试;-)
Joachim W

CTEST_CUSTOM_POST_TEST的CMake问题已在2.8.12中修复。
Ela782 2014年

23

我必须自己添加“检查”目标。由于某些原因,“进行测试”不执行任何操作。所以我做了什么(就像在stackoverflow上的某个地方建议的那样)-我手动添加了这个目标。为了获得详细的输出,我将其编写为:

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

21

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

ctest --output-on-failure

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

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

设置为您的构建配置。


1
我非常喜欢您的解决方案; 除了失败之外,它并不冗长。
AnthonyD973 '18 -10-10

19

make check CTEST_OUTPUT_ON_FAILURE=TRUE


6
所有的否决票都是相当令人惊讶的:这几乎等同于公认的答案,但是更简短,更好。也可以在我测试的项目中使用。
zbyszek 2015年

2
进行CTEST_OUTPUT_ON_FAILURE = 1测试
Alex Punnen


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 envcmake -E。我还添加了一个依赖项,ALL_BUILD以便在调用check目标之前构建所有项目。(在Linux构建中,可能需要替换ALL_BUILDALL;我尚未在Linux上进行过测试。)


6

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

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

0

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

~$ ctest -T Test

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.