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
我知道,它有点难看,但让我们分解一下。
- 你要求 ctest 给你所有带有 label1 的测试(-N,所以你只列出它们)。
- 然后使用 awk 提取测试名称(先不带字符串
Test #xyz:
)。
- 然后将所有这些行放入一个正则表达式中,将
\n
替换为 |
。
- 您将此字符串用作 ctest 的正则表达式,合并 并请求新标签。这使得具有 label2 和 的 ctest 运行 测试匹配您在步骤 1 中找到的任何测试名称。
这很麻烦,特别是如果你想 运行 测试有 N 个标签。
在 -L
中使用正则表达式的可能性已在(至少)v3.21 中添加,参见 here
以免假设我有一些包含 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
我知道,它有点难看,但让我们分解一下。
- 你要求 ctest 给你所有带有 label1 的测试(-N,所以你只列出它们)。
- 然后使用 awk 提取测试名称(先不带字符串
Test #xyz:
)。 - 然后将所有这些行放入一个正则表达式中,将
\n
替换为|
。 - 您将此字符串用作 ctest 的正则表达式,合并 并请求新标签。这使得具有 label2 和 的 ctest 运行 测试匹配您在步骤 1 中找到的任何测试名称。
这很麻烦,特别是如果你想 运行 测试有 N 个标签。
在 -L
中使用正则表达式的可能性已在(至少)v3.21 中添加,参见 here