【问题标题】:CMake: setting an environmental variable for ctest (or otherwise getting failed test output from ctest/make test automatically)CMake:为 ctest 设置环境变量(或者自动从 ctest/make test 获取失败的测试输出)
【发布时间】:2013-04-16 00:04:32
【问题描述】:

我希望 ctest 默认显示失败的测试输出。也就是我要跑:

$ make all test

无需cat Testing/Temporary/LastTest.log即可查看失败测试的任何输出。

似乎有两种方法可以做到这一点:

(1)设置CTEST_OUTPUT_ON_FAILURE环境变量:

 $ CTEST_OUTPUT_ON_FAILURE=1 make all test
 $ # or CTEST_OUTPUT_ON_FAILURE=1 ctest

(2) 为ctest 调用指定--output-on-failure 标志:

 $ ctest --output-on-failure

有没有办法编写一个 CMakeLists.txt 文件,这样 ctests 在正常的“make all test”调用中默认转储失败的测试输出,而无需在会话中全局导出环境变量或使用自定义目标,如make check(如here所述)?

我知道SET_TESTS_PROPERTIES() 命令,但尝试如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(testenv CXX)
ENABLE_TESTING()
ADD_EXECUTABLE(hello hello.cpp)
ADD_TEST(testhello hello)

# Following sets the environment variable for the shell in which the test
# progoram 'hello' is run, but not the shell in which ctest is run
SET_TESTS_PROPERTIES(testhello
    PROPERTIES ENVIRONMENT "CTEST_OUTPUT_ON_FAILURE=1")

并且实验表明环境变量是在执行测试程序的shell中设置的,而不是在执行ctest的shell中。

【问题讨论】:

标签: testing cmake environment-variables output ctest


【解决方案1】:

无法修改内置的test 目标,但您可以添加自定义check 目标,该目标通过--output-on-failure 开关调用ctest,方式如下:

if (CMAKE_CONFIGURATION_TYPES)
    add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} 
        --force-new-ctest-process --output-on-failure 
        --build-config "$<CONFIGURATION>")
else()
    add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} 
        --force-new-ctest-process --output-on-failure)
endif()

对于单一构建类型和多配置构建,必须以不同方式设置自定义目标。在后一种情况下,必须使用--build-config 标志将活动构建配置传递给ctest 调用。 --force-new-ctest-process 被内置的test 目标默认使用。

【讨论】:

  • 非常感谢,正是我想要的!知道为什么不能修改 test 目标吗?
  • test 目标是 CMake 的全局默认目标之一,无法修改。在 CMake 源代码中硬编码的 test 命令的设置。
  • 真的很遗憾,不能通过默认设置选项或设置环境变量来改变测试命令的行为......
  • 还有没有更好的选择?这违背了GTEST_ADD_TESTS 等简单命令的目的。
  • 至少对于 Ninja 生成器,这不会在测试期间打印测试摘要,只有在所有测试都运行之后。添加USES_TERMINAL 可以解决此问题。
【解决方案2】:

现在有列表变量CMAKE_CTEST_ARGUMENTS,您可以在其中设置 ctest 参数。

https://cmake.org/cmake/help/latest/variable/CMAKE_CTEST_ARGUMENTS.html

【讨论】:

  • 有什么方法可以调试吗?因为我尝试过各种方式设置都无济于事。我目前将它设置在我的测试目录的 CMakeLists.txt 中,并且我尝试将它移动到其中的各个其他位置,但没有迹象表明它有任何作用。我使用的是 3.20.2 版本。
  • 啊,它需要在调用enable_testing() 之前设置,以防人们不明白这一点。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 2018-08-03
  • 2016-04-16
  • 2021-04-11
  • 2020-11-14
相关资源
最近更新 更多