以免假设我有一些由N个域(D1,D2,...,DN(组成的项目。每个领域都有两种测试:免得说UT和MT。它们的定义如下:
add_test(
NAME Di_UT
COMMAND <blah>
)
add_test(
NAME Di_MT
COMMAND <blah>
)
我希望能够按标签过滤它们。所以我添加了标签:
set_tests_properties(Di_UT PROPERTIES LABELS "UT;Di")
set_tests_properties(Di_MT PROPERTIES LABELS "MT;Di")
然后我执行 ctest:
ctest -L Di
将执行域 Di 的所有测试,当然相反:
ctest -L UT
将执行所有带有UT标签的测试。
但是如何按两个标签进行过滤? 只对域 Di 执行 UT?
据我观察,传递多个-L
会导致它们覆盖。(最后一个有效果(。还有其他想法吗?我的 cmake 版本是
ctest version 3.13.4
似乎根本不支持这样的事情。因此,作为一种解决方法,我只是添加一个包含其他两个标签的第三个标签 - 然后对其进行测试。所以:
add_test(
NAME Di_UT
COMMAND <blah>
)
set_tests_properties(Di_UT PROPERTIES LABELS "UT;Di;UT-Di")
add_test(
NAME Di_MT
COMMAND <blah>
)
set_tests_properties(Di_MT PROPERTIES LABELS "MT;Di;MT-Di")
因此,我可以像这样执行:
执行所有UT:
ctest -L UT
执行域 Di 的所有测试:
ctest -L Di
仅对 Di 执行 UT
:ctest -L Ut-Di
这似乎是唯一可用的选项。
在-L
中添加了使用正则表达式的可能性(至少(v3.21,请参阅此处
我也一直在为此苦苦挣扎。很遗憾不支持这样的功能,特别是如果您认为合乎逻辑或有效:
ctest -L 'label1|label2'
我想出的是创建自己的bash函数,该函数归结为以下内容:
ctest -R "$(echo "$(ctest -N -L label1 | awk '/Test #/ { print $3}')" | tr 'n' '|')" -L label2
我知道,这有点丑,但让我们分解一下。
- 你要求 ctest 给你所有带有 label1 (-N,所以你只列出它们(的测试。
- 然后使用 awk 提取测试名称(不先提取字符串
Test #xyz:
(。 - 然后,通过将
n
替换为|
来将所有这些行放入单个正则表达式中。 - 您可以使用此字符串作为 ctest 的正则表达式,并结合对新标签的请求。这使得 ctest 运行具有 label2 的测试,并与您在步骤 1 中找到的任何测试名称匹配。
这非常麻烦,特别是如果你想运行具有 N 个标签的测试。
基于本地测试,在 CMake 3.18.2 中,不考虑多个标签,它只听最后一个
ctest -L Di -L UT <--- equivalent to ctest -L UT
这与 CMake 3.13.4 的发现一致。支持逻辑|
运算符,因为标签在后台使用正则表达式匹配:
ctest -L "Di|UT" <-- all tests that have either label
不幸的是,逻辑&
运算符不是。
在 CMake 3.21 中,他们在此议题和合并请求中添加了标签匹配行为的文档。使用 CMake+CTest 3.21.3 进行测试表明多个标签参数的默认行为已更改:
ctest -L Di -L UT <--- only tests that have both labels
与新文档匹配
使用多个
-L
选项意味着"匹配所有这些"。
tl;DR:如果可能,请升级到 CMake 3.21+