运行具有 2 个标签的测试



以免假设我有一些由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

我知道,这有点丑,但让我们分解一下。

  1. 你要求 ctest 给你所有带有 label1 (-N,所以你只列出它们(的测试。
  2. 然后使用 awk 提取测试名称(不先提取字符串Test #xyz:(。
  3. 然后,通过将n替换为|来将所有这些行放入单个正则表达式中。
  4. 您可以使用此字符串作为 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+

相关内容

  • 没有找到相关文章

最新更新