Swift 测试
Swift Testing 是一个包含富有表现力和直观的 API 的软件包,让你可以轻松测试 Swift 代码。
功能概览
清晰、富有表现力的 API
Swift Testing 具有清晰而富有表现力的 API,使用宏构建,因此你可以用少量代码声明复杂的行为。#expect
API 使用 Swift 表达式和运算符,并捕获评估的值,以便在测试失败时快速了解出错原因。
@Test func helloWorld() {
let greeting = "Hello, world!"
#expect(greeting == "Hello") // 预期失败:(greeting → "Hello, world!") == "Hello"
}
自定义测试行为
你可以使用代码中指定的特征来自定义测试或测试套件的行为。特征可以描述测试的运行时条件,比如测试应该在哪种设备上运行,或将测试限制在特定的操作系统版本。特征还可以通过为测试指定执行时间限制来帮助你有效地使用持续集成。
@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("检查视频元数据",
.tags(.metadata))
func videoMetadata() {
let video = Video(fileName: "By the Lake.mov")
let expectedMetadata = Metadata(duration: .seconds(90))
#expect(video.metadata == expectedMetadata)
}
可扩展的覆盖范围和执行
参数化测试帮助你对一系列值运行相同的测试,从而减少代码量。所有测试都与 Swift 并发无缝集成,默认并行运行。
@Test("视频中提到的大陆", 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)
}
跨平台支持
Swift Testing 适用于 Swift 支持的所有主要平台,包括 Apple 平台、Linux 和 Windows,因此在不同平台间切换时,你的测试行为可以更加一致。它作为开源项目开发,并在 Swift 论坛 上讨论,以便来自任何地方的最佳想法都能帮助塑造 Swift 测试的未来。
下表描述了 Swift Testing 当前对各种平台的支持水平:
平台 | CI 状态 (6.0) | CI 状态 (main) | 支持状态 |
---|---|---|---|
macOS | 已支持 | ||
iOS | 已支持 | ||
watchOS | 已支持 | ||
tvOS | 已支持 | ||
visionOS | 已支持 | ||
Ubuntu 22.04 | 已支持 | ||
Windows | 已支持 | ||
Wasm | 实验性 |
与 XCTest 兼容
如果你已经使用 XCTest 编写了测试,你可以将它们与使用 Swift Testing 编写的新测试并排运行。这有助于你按照自己的节奏逐步迁移测试。
文档
[!重要] 该软件包正在积极持续开发中,需要最新的 6.0 开发快照 工具链。目前其内容和接口仍被视为实验性质,可能会发生变化。有关稳定版本发布计划的详细信息,请参阅此 论坛帖子。
Swift Testing 的详细文档可以在 Swift Package Index 上找到。在那里,你可以深入研究全面的指南、教程和 API 参考,以充分利用这个软件包。要亲自尝试,请参阅 入门指南。
本项目的其他文档资源可以在 Documentation/
子目录的 README 中找到。