Cmake ctest:默认情况下禁用一组带标签的测试,但在明确指定目标时运行它们
我希望在默认情况下禁用一组测试,但在明确指定目标时能够运行它们 例如,假设我有一个项目,其中包含大量快速运行的单元测试,这些测试是通过Cmake ctest:默认情况下禁用一组带标签的测试,但在明确指定目标时运行它们,cmake,ctest,Cmake,Ctest,我希望在默认情况下禁用一组测试,但在明确指定目标时能够运行它们 例如,假设我有一个项目,其中包含大量快速运行的单元测试,这些测试是通过add\u测试(NAME SomeNameHere COMMAND SomeCommandHere)命令添加的。并且进一步假设还有一系列长期运行的集成测试应该从默认的ctestrun中排除,但是在明确目标时,应该可以使用单个命令运行所有集成测试 作为一个具体例子: 应始终运行的测试-我希望在用户运行$ctest FooIntegrationTest-我希望仅当用
add\u测试(NAME SomeNameHere COMMAND SomeCommandHere)
命令添加的。并且进一步假设还有一系列长期运行的集成测试应该从默认的ctest
run中排除,但是在明确目标时,应该可以使用单个命令运行所有集成测试
作为一个具体例子:
-我希望在用户运行应始终运行的测试
$ctest
-我希望仅当用户运行FooIntegrationTest
$ctest时才运行此测试--此处的某些选项集成
-我希望仅当用户运行BarIntegrationTest
$ctest时才运行此测试--这里有一些选项集成
cmake_最低要求(3.1版)
项目(如何运行禁用的测试无)
启用_测试()
#添加一个快速运行的测试
#此测试应在用户运行“ctest”时运行
添加测试(名称TestThatShouldAlwaysRun命令回显“我始终处于启用状态”)
#添加长期运行的集成测试
#此测试应在用户运行时运行:“ctest--label regex my_integration_tests”
添加_测试(名称FooIntegrationTest命令echo'Foo integration test')
设置测试属性(FooIntegrationTest属性已禁用True)
设置\u测试\u属性(FooIntegrationTest属性标签我的\u集成\u测试)
#添加另一个长期运行的集成测试
#此测试应在用户运行时运行:“ctest--label regex my_integration_tests”
添加测试(名称BARINTEGRIONTEST命令echo“Bar集成测试”)
设置测试属性(BarIntegrationTest属性已禁用为True)
设置测试属性(BarIntegrationTest属性标签我的集成测试)
现在,让我们通过
$mkdir构建
$cd构建/
$cmake。。
$ctest-V
正如我们在下面的输出中所看到的,ctest
确实排除了集成测试(很棒!)
但是,我不知道现在如何通过ctest
,运行标有my\u integration\u tests
的测试
ctest --label-regex my_integration_tests
Test project /path/to/code/example_repo/build
Start 2: FooIntegrationTest
1/2 Test #2: FooIntegrationTest ...............***Not Run (Disabled) 0.00 sec
Start 3: BarIntegrationTest
2/2 Test #3: BarIntegrationTest ...............***Not Run (Disabled) 0.00 sec
No tests were found!!!
有没有一种方法可以在明确目标时运行禁用的测试
我还探索了其他方法,比如
- 不否认集成测试。然后,当用户想要运行快速运行的测试时,他们需要指定
。这不太好。这让每个人都很难记住这一点。我希望使用最多的选项(仅运行快速运行的测试)可以通过ctest--label exclude my_integration_tests
运行ctest
- 不禁用集成测试,但为
调用提供参数add\u test
。但我认为这样我在语义上滥用了CONFIGURATIONS my\u integration\u tests
配置。此外,这也不允许我在有目标时只运行集成测试
- 通过
添加集成测试。在这里,我认为我误用了APIAdd_custom_target
用于自定义目标,而不是作为运行测试的方式,对吗add_custom_target
# cat CMakeLists.txt
cmake_minimum_required (VERSION 3.1)
project (HOW_TO_RUN_DISABLED_TESTS NONE)
enable_testing()
add_test(NAME TestThatShouldAlwaysRun COMMAND echo 'I am always enabled')
if(BUILD_INTEGRATION_TESTING)
add_test(NAME FooIntegrationTest COMMAND echo 'Foo integration test')
add_test(NAME BarIntegrationTest COMMAND echo 'Bar integration test')
endif()
这很简单,也更灵活,即允许为这些测试添加与测试相关的目标(和设置(以及要使用的ctest夹具))。(我通常在项目中看到名为SOMETHING\u BUILD\u TESTING
的变量,因此它类似于BUILD\u TESTING
cmake变量。)
我的另一个想法是使用一个环境变量,并使用SKIP\u RETURN\u code
将测试包装在脚本中(甚至不使用SKIP\u RETURN\u code
,如果不应该运行集成测试,只返回success):
然后:
但是:
尽管如此,我还是对以下问题的答案感兴趣:“有没有办法在明确目标时运行禁用的测试?”您知道答案吗?例如,在一些项目中,我使用GoogleTest.cmake,它将禁用的GTEST标记为“ctest disabled”,在某些情况下,使用单个ctest命令运行所有禁用的测试会很有用。大多数项目禁用某些测试,因为它们可能需要太长时间才能运行,或者依赖于可能并非在所有计算机上都可用的依赖项。
# cat CMakeLists.txt
cmake_minimum_required (VERSION 3.1)
project (HOW_TO_RUN_DISABLED_TESTS NONE)
enable_testing()
add_test(NAME TestThatShouldAlwaysRun COMMAND echo 'I am always enabled')
if(BUILD_INTEGRATION_TESTING)
add_test(NAME FooIntegrationTest COMMAND echo 'Foo integration test')
add_test(NAME BarIntegrationTest COMMAND echo 'Bar integration test')
endif()
add_test(NAME FooIntegrationTest
COMMAND sh -c "if [ \"\${RUN_INTEGRATION:-}\" ]; then echo 'Foo integration test'; else exit 127; fi"
VERBATIM)
set_tests_properties(FooIntegrationTest PROPERTIES
SKIP_RETURN_CODE 127)
$ ctest -V
....
2: Test command: /usr/bin/sh "-c" "if [ "${RUN_INTEGRATION:-}" ]; then echo 'Foo integration test'; else exit 127; fi" "VERBATIM"
2: Test timeout computed to be: 10000000
2/3 Test #2: FooIntegrationTest ...............***Skipped 0.01 sec
....
The following tests did not run:
2 - FooIntegrationTest (Skipped)
$ RUN_INTEGRATION=TRUE ctest -V
...
2: Test command: /usr/bin/sh "-c" "if [ "${RUN_INTEGRATION:-}" ]; then echo 'Foo integration test'; else exit 127; fi" "VERBATIM"
2: Test timeout computed to be: 10000000
2: Foo integration test
2/3 Test #2: FooIntegrationTest ............... Passed 0.01 sec
...