ctest - 运行 测试有 2 个标签

ctest - run tests having 2 labels

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

好像根本不支持这种东西。因此,作为一种解决方法,我只是添加一个包含其他两个标签的第三个标签 - 然后将其传递给 ctest。所以:

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

这似乎是唯一可用的选项。

我也一直在努力解决这个问题。很遗憾不支持此功能,特别是如果您认为逻辑或有效:

ctest -L 'label1|label2'

我想到的是创建自己的 bash 函数,归结为以下内容:

ctest -R "$(echo "$(ctest -N -L label1 | awk '/Test #/ { print }')" | tr '\n' '|')" -L label2

我知道,它有点难看,但让我们分解一下。

  1. 你要求 ctest 给你所有带有 label1 的测试(-N,所以你只列出它们)。
  2. 然后使用 awk 提取测试名称(先不带字符串 Test #xyz:)。
  3. 然后将所有这些行放入一个正则表达式中,将 \n 替换为 |
  4. 您将此字符串用作 ctest 的正则表达式,合并 并请求新标签。这使得具有 label2 的 ctest 运行 测试匹配您在步骤 1 中找到的任何测试名称。

这很麻烦,特别是如果你想 运行 测试有 N 个标签。

-L 中使用正则表达式的可能性已在(至少)v3.21 中添加,参见 here