Catch2如何在运行无标签测试时额外执行指定标签测试?
问题:Catch2 如何在默认运行无标签测试的基础上,可选额外执行特定标签测试?
我尝试给所有发送真实网络请求的测试用例添加.network标签,使其默认不运行。希望能在运行所有无标签测试的基础上,可选额外执行特定标签的测试,但尚未找到实现方法。
我的测试用例组织如下:
TEST_CASE("Foo") { ... } TEST_CASE("Bar") { ... } TEST_CASE("Baz", [.optional]) { ... } TEST_CASE("Qux", [.different-optional]) { ... }
无参数运行测试程序时,仅运行Foo和Bar,此功能正常。但我希望通过参数调用实现:
- 执行
./tests include:[.optional]时,运行Foo、Bar和Baz - 执行
./tests include:[.different-optional]时,运行Foo、Bar和Qux - 执行
./tests include:[.optional],include:[.different-optional]时,运行所有四个测试用例
(注:include:并非真实关键字,仅用于演示期望行为)
请问无需给其他测试添加[all]或[default]标签的前提下,能否实现该需求?
补充:我发现Catch2支持空标签[],执行./tests []可运行Foo和Bar,但将其与逗号分隔的其他标签组合时,空标签会被忽略,如./tests [],[.optional]仅运行Baz。
解决方法
可以实现,利用Catch2的标签表达式特性就能搞定,不需要给无标签测试额外加标签。
直接使用标签表达式的命令
对应你要的三种场景,执行命令分别是:
- 运行无标签测试 +
.optional标签测试:
./tests "!~[.*] || [.optional]"
- 运行无标签测试 +
.different-optional标签测试:
./tests "!~[.*] || [.different-optional]"
- 运行无标签测试 + 两个可选标签测试:
./tests "!~[.*] || [.optional] || [.different-optional]"
原理说明
!~[.*]:~表示匹配任意标签,[.*]匹配所有带标签的测试,取反!就筛选出没有任何标签的测试用例。||是逻辑或操作,将无标签测试集合和指定标签的测试集合合并,实现同时运行两部分测试的效果。
简化命令:自定义标签别名
如果觉得每次输入完整表达式太繁琐,可以在测试代码中定义自定义标签表达式别名,减少重复输入:
#define CATCH_CONFIG_RUNNER #include <catch2/catch_all.hpp> int main(int argc, char* argv[]) { Catch::Session session; // 给无标签测试的表达式定义别名"default" session.config().addAlias("default", "!~[.*]"); return session.run(argc, argv); }
之后就可以用更简洁的命令调用:
./tests "default || [.optional]"./tests "default || [.different-optional]"./tests "default || [.optional] || [.different-optional]"
这种方式完全符合你的需求,不需要修改原有测试用例的标签设置。
内容的提问来源于stack exchange,提问作者Frank O'Brien
相关产品推荐
相关产品推荐

