Swift Testing #3: 组织、分类和过滤测试使用 @Tag
Source: Dev.to
引言
一个项目可能拥有数百甚至数千个测试和测试套件。这些测试的子集可能共享某些共同特性,例如是 关键 或 不稳定 的。Swift 的测试库包含一个名为 tags 的 trait,用于对测试进行分组和分类。
标签(Tags)不同于测试套件:套件在代码层面组织测试,而标签则添加可以在不同套件、文件甚至测试 target 之间共享的语义信息。
标签是一个 Tag 实例,使用宏 @Tag 在 Tag 的扩展中声明为静态变量。此声明必须位于 Tag 的扩展中,以便在测试中使用。
extension Tag {
@Tag static var legallyRequired: Self
}
注意: 如果在
Tag声明中使用let而不是var,Swift 6 会给出警告
Cannot expand accessor macro on variable declared with 'let'; this is an error in the Swift 6 language mode.
在测试中使用 tags
可以通过在测试描述后使用 .tags() trait 并以可变参数形式传入标签,为测试应用一个或多个标签。
extension Tag {
@Tag static var tag1: Self
@Tag static var tag2: Self
}
@Test("描述测试的文字", .tags(.tag1, .tag2))
func prueba() { /* ... */ }
如果使用多个标签,测试将同时属于 所有 标记的组,但 只会执行一次;结果会出现在每个对应的组中。
为整个套件打标签
Tag 也可以应用于整个 Suite,这意味着该套件中的所有测试都共享同一个标签。
extension Tag {
@Tag static var tag1: Self
@Tag static var tag2: Self
}
@Suite("FEATURE: 某功能", .tags(.tag1, .tag2))
struct FeatureX {
@Test("描述测试 1")
func prueba1() { /* ... */ }
@Test("描述测试 2")
func prueba2() { /* ... */ }
}
同名标签的命名空间
如果在不同位置声明了同名的两个标签,Swift 会将它们视为等价。若要区分它们,可以在 Tag 中创建一个 命名空间。
extension Tag {
enum SomeNamespace {}
}
extension Tag.SomeNamespace {
@Tag static var extraSpecial: Tag
}
@Test(
"Extra Special Sauce recipe is secret",
.tags(.SomeNamespace.extraSpecial)
)
func secretSauce() { /* ... */ }
测试浏览器

测试报告

按标签过滤
