我正在使用 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 单元测试?
您可以设置环境变量 CTEST_OUTPUT_ON_FAILURE
,它会在测试失败时向您显示测试程序的任何输出。使用 Makefiles 和命令行时执行此操作的一种方法如下:
env CTEST_OUTPUT_ON_FAILURE=1 make check
This Stack Overflow question and answer 展示了如何在 Visual Studio 中设置环境变量。
在 cmaking 和 make 项目之后,您可以直接调用 ctest
。
ctest --verbose
您可以检查测试/临时子文件夹。它是在运行 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”部分。祝你好运!
有一个非常简单的解决方案(由于某种原因很难通过 Google 搜索找到):
ctest --output-on-failure
如果您将 CMake 与 Visual Studio 的打开文件夹功能一起使用,您可以添加
"ctestCommandArgs": "--output-on-failure"
设置为您的构建配置。
我不得不自己添加“检查”目标。 “进行测试”出于某种原因什么也没做。所以我做了什么(正如stackoverflow某处所建议的那样) - 我手动添加了这个目标。为了获得详细的输出,我只是这样写:
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
make check CTEST_OUTPUT_ON_FAILURE=TRUE
这使得测试输出更加详细:
make test ARGS="-V"
print_message
输出也会显示 - 否则我只会看到那些失败的打印。
我的方法是结合答案 from ony、from zbyszek 和 from 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 上对此进行测试。)
对于使用 Visual Studio 的人,这里是主题的另一个变体(hack):
cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
现在有一个 CMake 变量允许您修改 make test
的行为。 CMAKE_CTEST_ARGUMENTS 允许您设置通过 make test
运行时传递给 ctest 的参数列表。
因此,将其添加到您的 CMake 文件中:
set(CMAKE_CTEST_ARGUMENTS "--verbose")
意味着 CTest 将始终运行详细。或者对于失败的测试的输出,使用:
set(CMAKE_CTEST_ARGUMENTS "--output-on-failure")
要使用 XML 文件显示结果,您必须使用以下命令执行测试
~$ ctest -T Test
我们在 Testing/1234123432/test.xml 中找到了结果,并且在测试文件夹中也生成了其他文件
SET(CTEST_OUTPUT_ON_FAILURE TRUE)
和SET(CTEST_OUTPUT_ON_FAILURE ON)
,但没有效果。网络上的其他报告证实了这一点。set(CTEST_OUTPUT_ON_FAILURE TRUE)
没有设置 environment 变量。在命令行上试试这个:CTEST_OUTPUT_ON_FAILURE=TRUE make test
。make CTEST_OUTPUT_ON_FAILURE=1 test
更短且更好的 IMO。--output-on-failure
相同:man 1 ctest。