ctest:默认情况下禁用一组标记的测试,但在明确目标时运行它们



我想默认禁用一组测试,但可以在明确目标时运行它们。

例如,假设我有一个项目,通过add_test(NAME SomeNameHere COMMAND SomeCommandHere)命令添加了许多快速运行的单元测试。进一步假设还有一堆长期运行的集成测试应该从默认的ctest运行中排除,但当明确性成为目标时,应该可以用一个命令运行所有集成测试。

作为一个具体的例子:

  • TestThatShouldAlwaysRun-我希望在用户运行$ ctest时运行
  • FooIntegrationTest-当用户运行$ ctest --some-option-here integration时,我希望仅运行
  • BarIntegrationTest-当用户运行$ ctest --some-option-here integration时,我希望仅运行

以下是我实现这一目标的尝试。

cmake_minimum_required (VERSION 3.1)
project (HOW_TO_RUN_DISABLED_TESTS NONE)
enable_testing()
# Add a fast running test
# This test should be run when a user runs: 'ctest'
add_test(NAME TestThatShouldAlwaysRun COMMAND echo 'I am always enabled')
# Add a long-running integration test
# This test should be run when a user runs: 'ctest --label-regex my_integration_tests'
add_test(NAME FooIntegrationTest COMMAND echo 'Foo integration test')
set_tests_properties(FooIntegrationTest PROPERTIES DISABLED True)
set_tests_properties(FooIntegrationTest PROPERTIES LABELS my_integration_tests)
# Add another long-running integration test
# This test should be run when a user runs: 'ctest --label-regex my_integration_tests'
add_test(NAME BarIntegrationTest COMMAND echo 'Bar integration test')
set_tests_properties(BarIntegrationTest PROPERTIES DISABLED True)
set_tests_properties(BarIntegrationTest PROPERTIES LABELS my_integration_tests)

现在,让我们通过运行

$ mkdir build
$ cd build/
$ cmake ..
$ ctest -V

正如我们在输出(如下所示(中看到的,ctest确实排除了集成测试(很棒!(。

1: Test command: /bin/echo "'I" "am" "always" "enabled'"
1: Test timeout computed to be: 10000000
1: 'I am always enabled'
1/3 Test #1: TestThatShouldAlwaysRun ..........   Passed    0.00 sec
test 2
Start 2: FooIntegrationTest
2/3 Test #2: FooIntegrationTest ...............***Not Run (Disabled)   0.00 sec
test 3
Start 3: BarIntegrationTest
3/3 Test #3: BarIntegrationTest ...............***Not Run (Disabled)   0.00 sec
100% tests passed, 0 tests failed out of 1
Label Time Summary:
my_integration_tests    =   0.00 sec*proc (2 tests)
Total Test time (real) =   0.05 sec
The following tests did not run:
2 - FooIntegrationTest (Disabled)
3 - BarIntegrationTest (Disabled)

但是,我不知道现在如何通过ctest运行标有my_integration_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_test调用提供参数CONFIGURATIONS my_integration_tests。但我认为这样我在语义上滥用CONFIGURATIONS。此外,这不允许我在目标时仅运行集成测试
  • 通过add_custom_target添加集成测试。此外,我认为我滥用API。add_custom_target是针对自定义目标的,而不是作为运行测试的一种方式,对吧

我相信一个更简单的方法就是通过cmake配置选项。

# 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 fixture(。(我通常在项目中看到像SOMETHING_BUILD_TESTING这样命名的变量,所以它类似于BUILD_TESTINGcmake变量。(

我的另一个想法是使用环境变量,用SKIP_RETURN_CODE(甚至不使用SKIP_RETURN_CODE,如果不应该运行集成测试,只返回成功(将测试封装在脚本中:

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
...

您可以使用LABELS属性执行此操作。将您一直想要运行的测试标记为";GOLD";测试,并始终以ctest-L GOLD的身份运行ctest。您想要默认禁用的其他测试可以用其他标签进行分类,例如";EXPFAIL"DISABLED";等等。当你想运行这些时,你可以使用适当的-L标签。这甚至不需要您重新配置测试。配置一次,然后运行您想要运行的内容。

唯一的缺点是默认情况下我们必须使用ctest-L";GOLD";而不是ctest。

相关内容

  • 没有找到相关文章

最新更新