快照测试 是一个完全用Swift编写的简单视图测试工具,旨在帮助开发Apple平台。它就像视图的单元测试。
如何使用
当record mode
(记录模式)激活时,快照断言会记录视图的图像并将其保存到指定目录
。这将导致测试失败。当记录模式关闭时,快照断言将记录视图的图像并将其与保存的参考图像进行比较。如果它们不同,测试将失败。
配置
所有快照测试需要的只是知道保存参考图像的位置。此目录使用键通过测试方案环境变量指定
REFERENCE_IMAGE_DIR
推荐参考图像目录路径是
$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages
它应该看起来像这样
使用方法
如果您熟悉 XCTest,使用 SnapshotTest 将会非常简单。您只需继承 SnapshotTestCase 而不是 XCTestCase,并使用 AssertSnapshot()
来测试视图。
class ViewTests: SnapshotTestCase {
func testView_withAlteration() {
// Given
let view = View(frame: CGRect(x: 0, y: 0, width: 375, height: 100))
// When
view.alter()
// Then
AssertSnapshot(view)
}
}
目前支持 UIView、UIViewController 和 CALayer。
记录模式
记录模式记录当前作用域内视图的快照并将其存储在参考目录中,以供与任何后续断言比较。
请注意,记录模式会导致测试失败,并将参考图像路径输出到控制台。
🔴 RECORD MODE: Reference image saved to /Users/snap/App/AppTests/ReferenceImages/View/testView_withAlteration.png
测试用例
要设置测试用例为记录模式,只需将 recordMode
属性更改为 true。
class ViewTests: SnapshotTestCase {
override func setUp() {
super.setUp()
recordMode = true
}
}
断言将记录并保存一个参考图像。
全局
要全局设置记录模式并记录每个断言的所有快照,请设置类变量 recordMode
。
SnapshotTestCase.recordMode = true
请注意,您可能需要设置一个 主类 来确保记录模式在您的测试套件运行之前被激活。
语句
要明确记录单个快照,您可以使用 RecordSnapshot()
函数。
class ViewTests: SnapshotTestCase {
func testView_withAlteration() {
// Given
let view = View(frame: CGRect(x: 0, y: 0, width: 375, height: 100))
// When
view.alter()
// Then
RecordSnapshot(view)
}
}
主类
主类在您的测试包加载时由 XCTest
自动实例化。将主类视为放置全局 setUp()
和 tearDown()
的好地方。一个简单的主类可能如下所示
import SnapshotTest
class TestObserver : NSObject {
override init() {
SnapshotTestCase.recordMode = true
}
}
在您的测试包的 Info.plist
中添加一个键值对
<key>NSPrincipalClass</key>
<string>YourAppTests.TestObserver</string>
其中 YourAppTests
是您的测试包名称。
这将在全局激活记录模式,并保证在您的测试套件之前运行。
选项
SnapshotTest 提供了多种方式来使用几个选项比较快照。
选项 | 描述 |
---|---|
device | 比较特定设备的快照。 |
osVersion | 比较特定 OS 版本的快照。 |
要使用一个或多个选项,只需将它们传递给断言的选项参数。
AssertSnapshot(view, options: [.device, .osVersion])
平台
以下平台和最低版本受到支持
- iOS 8.0
- tvOS 9.0
分发
可以使用SnapshotTest通过手工构建并将其集成到您的项目中,或者通过使用依赖管理器完成。目前仅支持CocoaPods,未来将有更多支持。
CocoaPods
只需将以下行添加到您的Podfile中,在您的 测试目标 范围内
target "MyAppTests" do
use_frameworks!
pod 'SnapshotTest' ~> 'X.Y.Z'
end
将 X.Y.Z
替换为您希望使用的初始版本。破坏版本的向后兼容性将是最后的手段,但指定版本仍然建议。
贡献
SnapshotTest遵循 BSD 2-clause License 许可,非常欢迎通过拉取请求和问题形式进行贡献。