CMake 和 CTest:自动运行测试的依赖项

fgh*_*ghj 5 c c++ testing cmake ctest

在我的 CMakeLists.txt 中,我有这样的内容:

 set_property(TEST testX APPEND PROPERTY DEPENDS testY)
 set_property(TEST testX APPEND PROPERTY DEPENDS testZ)
Run Code Online (Sandbox Code Playgroud)

我想要某种方式来testX自动运行及其所有依赖项。就像是:

ctest <options> testX
Run Code Online (Sandbox Code Playgroud)

结果,CTest 将运行textYtestZtestX。有什么办法可以做到这一点吗?

或者,如果现在不可能,是否有任何方法可以通过脚本从 CMake 构建目录中提取有关依赖项的信息?

Cra*_*ott 5

CMake 3.7 中添加了对测试装置的支持,它们完全符合您的要求。您的特定场景将像这样实现:

set_property(TEST testX PROPERTY FIXTURES_REQUIRED Foo)
set_property(TEST testY PROPERTY FIXTURES_SETUP Foo)
set_property(TEST testZ PROPERTY FIXTURES_SETUP Foo)
Run Code Online (Sandbox Code Playgroud)

然后,您可以要求ctest运行 just testX,它会自动将testY和添加testZ到要执行的测试集中:

ctest -R testX
Run Code Online (Sandbox Code Playgroud)

它还将确保testX只会在testY并且testZ已经通过之后运行。如果 或testY失败testZtestX将被跳过。CMake 3.9 中还添加了新选项和-FS,允许在命令行中控制自动添加夹具设置/清理测试。例如,要暂时跳过添加到测试集但仍然自动添加,可以这样做:-FC-FActestctesttestYtestZ

ctest -R testX -FS testY
Run Code Online (Sandbox Code Playgroud)

CMake文档中描述了装置属性,以下文章更全面地介绍了装置功能:

https://crascit.com/2016/10/18/test-fixtures-with-cmake-ctest/


Fra*_*ser 3

据我所知,没有内置的方法可以做到这一点。

我能想到的实现目标的最佳方法是在测试中使用该LABELS属性。get_property您可以使用或检索依赖项列表get_test_property,并将相同的标签应用于testX其每个依赖测试:

get_test_property(testX DEPENDS DependenciesOfTestX)
set_tests_properties(testX ${DependenciesOfTestX} PROPERTIES LABELS LabelX)
Run Code Online (Sandbox Code Playgroud)

然后你可以告诉 CTest 仅运行带有该标签的测试:

ctest -L LabelX
Run Code Online (Sandbox Code Playgroud)