令人愉悦的 Swift 快照测试。
一旦安装完成,无需额外配置。您可以导入 SnapshotTesting
模块并调用 assertSnapshot
函数。
import SnapshotTesting
import XCTest
class MyViewControllerTests: XCTestCase {
func testMyViewController() {
let vc = MyViewController()
assertSnapshot(of: vc, as: .image)
}
}
当第一次运行断言时,快照会自动记录到磁盘,并且测试将会失败,并打印出任何新记录的引用的文件路径。
❌ 失败 - 在磁盘上未找到引用。自动记录快照:…
打开 "…/MyAppTests/__Snapshots__/MyViewControllerTests/testMyViewController.png"
重新运行 "testMyViewController" 以针对新记录的快照进行测试。
重复的测试运行将会加载这个引用并将其与运行时值进行比较。如果它们不匹配,测试将会失败并描述差异。 可以从 Xcode 的 Report Navigator 中检查失败,或通过检查失败的文件 URL。
您可以通过自定义断言中的快照或使用 withSnapshotTesting
工具来记录新的引用。
// Record just this one snapshot
assertSnapshot(of: vc, as: .image, record: .all)
// Record all snapshots in a scope:
withSnapshotTesting(record: .all) {
assertSnapshot(of: vc1, as: .image)
assertSnapshot(of: vc2, as: .image)
assertSnapshot(of: vc3, as: .image)
}
// Record all snapshots in an XCTestCase subclass:
class FeatureTests: XCTestCase {
override func invokeTest() {
withSnapshotTesting(record: .all) {
super.invokeTest()
}
}
}
虽然 Swift 社区中的大多数快照测试库仅限于 UIImage
的 UIView
,但 SnapshotTesting 可以处理任何平台上任何值的任何格式!
assertSnapshot
函数接受一个值以及该值支持的任何快照策略。 这意味着可以针对图像表示和针对其属性和子视图层次结构的文本表示来测试视图或视图控制器。
assertSnapshot(of: vc, as: .image)
assertSnapshot(of: vc, as: .recursiveDescription)
视图测试是高度可配置的。您可以覆盖特性集合(对于特定的大小类和内容大小类别)并生成设备无关的快照,所有这些都来自单个模拟器。
assertSnapshot(of: vc, as: .image(on: .iPhoneSe))
assertSnapshot(of: vc, as: .recursiveDescription(on: .iPhoneSe))
assertSnapshot(of: vc, as: .image(on: .iPhoneSe(.landscape)))
assertSnapshot(of: vc, as: .recursiveDescription(on: .iPhoneSe(.landscape)))
assertSnapshot(of: vc, as: .image(on: .iPhoneX))
assertSnapshot(of: vc, as: .recursiveDescription(on: .iPhoneX))
assertSnapshot(of: vc, as: .image(on: .iPadMini(.portrait)))
assertSnapshot(of: vc, as: .recursiveDescription(on: .iPadMini(.portrait)))
警告 必须使用最初拍摄引用的完全相同的模拟器来比较快照,以避免图像之间的差异。
更好的是,SnapshotTesting 不仅限于视图和视图控制器! 有许多可用的快照策略可供选择。
例如,您可以快照测试 URL 请求(例如,您的 API 客户端准备的请求)。
assertSnapshot(of: urlRequest, as: .raw)
// POST https://:8080/account
// Cookie: pf_session={"userId":"1"}
//
// email=blob%40pointfree.co&name=Blob
您可以快照测试 Encodable
值及其 JSON 和属性列表表示。
assertSnapshot(of: user, as: .json)
// {
// "bio" : "Blobbed around the world.",
// "id" : 1,
// "name" : "Blobby"
// }
assertSnapshot(of: user, as: .plist)
// <?xml version="1.0" encoding="UTF-8"?>
// <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
// "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
// <plist version="1.0">
// <dict>
// <key>bio</key>
// <string>Blobbed around the world.</string>
// <key>id</key>
// <integer>1</integer>
// <key>name</key>
// <string>Blobby</string>
// </dict>
// </plist>
事实上,默认情况下可以使用它的镜像来快照测试任何值!
assertSnapshot(of: user, as: .dump)
// ▿ User
// - bio: "Blobbed around the world."
// - id: 1
// - name: "Blobby"
如果您的数据可以表示为图像、文本或数据,您可以为其编写快照测试!
最新的文档可在此处获取:here。
警告 默认情况下,Xcode 将尝试将 SnapshotTesting 包添加到您项目的主要应用程序/框架目标中。请确保按照以下最后一步的文档,将 SnapshotTesting 添加到测试目标中。
https://github.com/pointfreeco/swift-snapshot-testing
。如果您想在任何其他使用 SwiftPM 的项目中使用 SnapshotTesting,请将该包作为 Package.swift
中的依赖项添加。
dependencies: [
.package(
url: "https://github.com/pointfreeco/swift-snapshot-testing",
from: "1.12.0"
),
]
接下来,将 SnapshotTesting
添加为测试目标的依赖项
targets: [
.target(name: "MyApp"),
.testTarget(
name: "MyAppTests",
dependencies: [
"MyApp",
.product(name: "SnapshotTesting", package: "swift-snapshot-testing"),
]
)
]
UIView
和 CALayer
。 针对任何值编写快照。isRecording
模式是否为 true
,都会记录新的快照。Codable
支持。 将可编码数据结构快照到它们的 JSON 和属性列表表示中。SnapshotTesting.diffToolCommand = { "ksdiff \($0) \($1)" }
AccessibilitySnapshot 为 iOS 可访问性添加了简单的回归测试。
AccessibilitySnapshotColorBlindness 为 iOS 视图、视图控制器和图像添加了用于色盲模拟的快照策略。
GRDBSnapshotTesting 添加了用于测试使用 GRDB 进行的 SQLite 数据库迁移的快照策略。
Nimble-SnapshotTesting 为 SnapshotTesting 添加了 Nimble 匹配器,供 Swift Package Manager 使用。
Prefire 通过使用 SwiftUI Preview
的 Swift Package Plugins 生成快照测试
PreviewSnapshots 在 SwiftUI 预览和快照测试之间共享 View
配置,并使用单个测试断言生成多个快照。
swift-html 是一个用于类型安全、可扩展和可转换 HTML 文档的 Swift DSL,并包含一个 HtmlSnapshotTesting
模块来快照测试其 HTML 文档。
swift-snapshot-testing-nimble 为 SnapshotTesting 添加了 Nimble 匹配器。
swift-snapshot-testing-stitch 增加了在单个测试中将多个 UIView 或 UIViewController 拼接在一起的能力。
SnapshotTestingDump 增加了通过使用 Any
的 customDump
策略来使用 swift-custom-dump 的支持
SnapshotTestingHEIC 增加了使用 HEIC 存储格式的图像支持,与 PNG 相比,该格式可减小文件大小。
SnapshotVision 增加了对视图和图像上的文本识别的快照策略。 使用 Apples Vision 框架。
您是否编写了自己的 SnapshotTesting 插件? 在此处添加 并提交拉取请求!
iOSSnapshotTestCase
帮助将屏幕截图测试引入了 iOS 社区的广大受众。 使用它的经验启发了此库的创建。
Jest 通过改进的用户体验将通用快照测试引入了 JavaScript 社区。 此库的几个功能(差异、自动捕获新快照)受到了直接影响。
SnapshotTesting 是使用面向见证者的编程设计的。
这一概念(以及更多)在一系列 Point-Free 剧集中进行了彻底探讨,Point-Free 是由 Brandon Williams 和 Stephen Celis 主持的视频系列,探讨函数式编程和 Swift。
以下 Point-Free 剧集探讨了面向见证者的编程和此库的设计
此库在 MIT 许可证下发布。 有关详细信息,请参见 LICENSE。