【问题标题】:ctest - run tests having 2 labelsctest - 运行具有 2 个标签的测试
【发布时间】:2019-10-18 14:36:22
【问题描述】:

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

【问题讨论】:

标签: label ctest


【解决方案1】:

似乎根本不支持这样的事情。因此,作为一种解决方法,我只是添加了一个包含其他两个标签的第三个标签 - 然后将其传递给 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

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

【讨论】:

    【解决方案2】:

    我也一直在为此苦苦挣扎。很遗憾,不支持这样的功能,特别是如果您认为合乎逻辑的 or 有效:

    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 个标签的测试。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • nice :) 下次会记得的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 2022-07-27
      • 2020-01-27
      • 2019-09-04
      • 1970-01-01
      相关资源
      最近更新 更多