Swift Testing #3: 组织、分类和过滤测试使用 @Tag

发布: (2025年12月5日 GMT+8 06:03)
3 min read
原文: Dev.to

Source: Dev.to

引言

一个项目可能拥有数百甚至数千个测试和测试套件。这些测试的子集可能共享某些共同特性,例如是 关键不稳定 的。Swift 的测试库包含一个名为 tags 的 trait,用于对测试进行分组和分类。

标签(Tags)不同于测试套件:套件在代码层面组织测试,而标签则添加可以在不同套件、文件甚至测试 target 之间共享的语义信息。

标签是一个 Tag 实例,使用宏 @TagTag 的扩展中声明为静态变量。此声明必须位于 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() { /* ... */ }

测试浏览器

Navegador de pruebas

测试报告

Reporte con etiquetas

按标签过滤

Filtrado por etiquetas

参考文献

  • 视频 “Mastering Swift Testing: Organize and Filter Tests with @Tag”(Swift and Tips),这里
  • 播放列表 “Swift Testing”(Swift and Tips),这里
  • Swift Testing 文档,这里
  • 文档:Adding tags to tests这里
Back to Blog

相关文章

阅读更多 »