Swift Testing

Swift Testing 是一个全新的框架,具有表现力强且直观易用的 API,可让测试 Swift 代码变得无比轻松。

简明清晰、表现力强的 API

Swift Testing 拥有使用宏构建的简明清晰且表现力强的 API,因此你只需使用少量代码便可声明复杂的行为。#expect API 使用 Swift 表达式和运算符并采集计算的值,帮助你在测试失败时快速定位问题。参数化测试可帮助你对一系列值运行同一测试,从而减少代码编写量。所有测试都与 Swift 并发功能无缝集成,在默认情况下并行运行。

@Test("Continents mentioned in videos", arguments: [
    "A Beach",
    "By the Lake",
    "Camping in the Woods"
])
func mentionedContinents(videoName: String) async throws {
    let videoLibrary = try await VideoLibrary()
    let video = try #require(await videoLibrary.video(named: videoName))
    #expect(video.mentionedContinents.count <= 3)
}

自定测试行为

你可以使用代码中指定的特征来自定测试或测试套件的行为。特征可以描述测试的运行时条件,例如测试应该在哪台设备上运行,或者将测试的范围限定为某些操作系统版本。通过为测试指定执行时间限制,特征还可以帮助你有效使用持续集成。

@Test(.enabled(if: AppFeatures.isCommentingEnabled))
func videoCommenting() async throws {
    let video = try #require(await videoLibrary.video(named: "A Beach"))
    #expect(video.comments.contains("So picturesque!"))
}

轻松灵活的组织方式

Swift Testing 提供了多种保证测试井然有序的方法。使用组和子组层次结构来组织相关测试的结构。运用标签,灵活地管理、编辑和运行在测试套件中具有共同特征的测试,例如面向特定设备的测试或使用特定模块的测试。还可以为测试指定描述性名称,这样一眼就能知道测试的用途。

@Test("Check video metadata",
      .tags(.metadata))
func videoMetadata() {
    let video = Video(fileName: "By the Lake.mov")
    let expectedMetadata = Metadata(duration: .seconds(90))
    #expect(video.metadata == expectedMetadata)
}

强大的工具

你可以在所有 Xcode 工作流程中使用你的测试和测试套件。测试结果非常丰富,以内嵌方式呈现,可帮助你并排查看测试和详细结果。你还可以对参数化测试重新运行特定参数,以调试代码的行为。你可以在 Xcode Cloud 中运行测试,以利用并行化并获得内容丰富的结果摘要。还可以使用 Swift Package Manager 直接从命令行运行测试。

跨平台开源框架

Swift Testing 适用于 Swift 支持的所有主流平台,包括 Apple 平台、Linux 和 Windows,因此在平台之间迁移时,测试的行为表现更加一致。它以开源形式开发,社区会针对即将推出的功能提出意见,因此各种奇思妙想 (无论来自何处) 可帮助塑造 Swift 测试的未来。

与 XCTest 协同工作

如果你已有使用 XCTest 编写的测试,则可以将它们与使用 Swift Testing 编写的新测试并行运行。这有助于你按照自己的节奏以增量方式迁移测试。

使用入门

下载 Xcode 16 Beta 版,使用 Swift Testing 框架测试你的 Swift 代码。

下载 Xcode