Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake ctest:默认情况下禁用一组带标签的测试,但在明确指定目标时运行它们_Cmake_Ctest - Fatal编程技术网

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
    。但我认为这样我在语义上滥用了
    配置。此外,这也不允许我在有目标时只运行集成测试
  • 通过
    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夹具))。(我通常在项目中看到名为
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
...