在我的CMakeLists中.txt我有这样的东西:
set_property(TEST testX APPEND PROPERTY DEPENDS testY)
set_property(TEST testX APPEND PROPERTY DEPENDS testZ)
我想要某种方式来自动运行testX
及其所有依赖项。像这样:
ctest <options> testX
因此,CTest 将运行 textY
、 testZ
和 testX
。有什么办法可以做到这一点吗?
或者,如果现在不可能,有没有办法通过脚本从 CMake 构建目录中提取有关依赖项的信息?
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)
然后,您可以要求ctest
仅运行testX
,它会自动将testY
和testZ
添加到要执行的测试集中:
ctest -R testX
它还将确保testX
仅在通过testY
和testZ
后运行。如果testY
或testZ
中的任何一个失败,则将跳过testX
。CMake 3.9 的ctest
中还添加了-FS
、-FC
和-FA
的新选项,允许在ctest
命令行自动添加夹具设置/清理测试。例如,要暂时跳过向测试集添加testY
但仍自动添加testZ
,可以这样做:
ctest -R testX -FS testY
CMake 文档中介绍了夹具属性,以下文章更全面地介绍了夹具功能:
https://crascit.com/2016/10/18/test-fixtures-with-cmake-ctest/
据我所知,没有内置的方法可以做到这一点。
我能想到的实现目标的最好方法是在测试中使用 LABELS
属性。 可以使用get_property
或get_test_property
检索依赖项列表,并将相同的标签应用于testX
及其每个依赖项测试:
get_test_property(testX DEPENDS DependenciesOfTestX)
set_tests_properties(testX ${DependenciesOfTestX} PROPERTIES LABELS LabelX)
然后,您可以告诉 CTest 仅运行具有该标签的测试:
ctest -L LabelX