FBSnapshotTestCase)
iOSSnapshotTestCase(之前为它做什么
“快照测试用例”会获取一个配置的 UIView
或 CALayer
并使用必要的 UIKit 或 Core Animation 方法生成其内容的图像快照。它将该快照与存储在您的源代码仓库中的“参考图像”进行比较,如果这两个图像不匹配,则测试失败。
为什么?
我们编写了很多 UI 代码。在我们创建 UIView
实例时,有很多边缘情况我们想要处理。
- 如果有比可用空间更多的文本该如何处理?
- 如果图像不匹配图像视图的大小怎么办?
- 高亮状态应该是什么样子?
逻辑代码的测试比较直接,但如何测试视图则不太明显。您可以进行很多矩形断言,但这些难以理解或可视化。观察图像差异可以看到确切的变化以及它将以什么方式呈现给用户。
开发 iOSSnapshotTestCase
的目的是使快照测试变得容易。
安装
步骤 1: 将 iOSSnapshotTestCase 添加到你的项目中
CocoaPods
将以下代码行添加到你的 Podfile 中
target "Tests" do
use_frameworks!
pod 'iOSSnapshotTestCase'
end
如果你的测试目标是仅Objective-C,请使用 iOSSnapshotTestCase/Core
替代,它不包括 Swift 支持。
Carthage
将以下行添加到你的 Cartfile 中
github "uber/ios-snapshot-test-case" ~> 6.1.0
Swift 包管理器
将以下行添加到你的 Package.swift
dependencies: [
.package(url: "https://github.com/uber/ios-snapshot-test-case.git", from: "7.0.0"),
],
...或者通过 文件 -> Swift 包 -> 添加包依赖...
使用存储库的 URL 集成到 Xcode 中。我们建议使用 "升级到下一个主要版本" 与版本字段,因为我们使用了语义版本控制,并且只有破坏性变更在主要版本中。
步骤 2: 设置测试方案
将 "Tests" 替换为你的测试项目名称。
- 设置参考图像目录有三种方法,推荐的方法是在你的方案中定义
FB_REFERENCE_IMAGE_DIR
。这应该指向你希望保存参考图像的目录。我们通常使用以下内容:
名称 | 值 |
---|---|
FB_REFERENCE_IMAGE_DIR |
$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages |
IMAGE_DIFF_DIR |
$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/FailureDiffs |
将IMAGE_DIFF_DIR
定义为保存失败快照差异的目录。同样有三种方法来设置失败的图像差异目录。
创建快照测试
- 使用
FBSnapshotTestCase
子类,而不是使用XCTestCase
。 - 在测试中,使用
FBSnapshotVerifyView
。 - 在测试的
-setUp
方法中使用self.recordMode = YES;
运行测试一次。(这将在磁盘上创建参考图像。) - 删除启用记录模式的行并运行测试。
特点
- 根据测试类和选择器自动命名磁盘上的参考图像。
- 失败时向控制台打印描述性错误消息。(锦上添花:如果已安装Kaleidoscope,则失败消息中将包含用于查看图像差异的单行命令。)
- 如果您想在一个单次测试方法中执行多个快照,请提供可选的"identifier"。
- 通过
FBSnapshotVerifyLayer
支持CALayer
。 - 使用
usesDrawViewHierarchyInRect
来处理像UIVisualEffect
、UIAppearance
和Size Classes这样的情况。 - 使用
fileNameOptions
来控制将设备模型(例如iPhone
、iPad
、iPod Touch
等)、OS版本、屏幕尺寸和屏幕缩放追加到图像中(允许对同一“快照”进行具有不同OS
和设备的多个测试)。
备注
您的单元测试应该位于“应用程序”包中,而不是“逻辑/库”测试包中。(也就是说,它应在模拟器中运行,以便它可以访问UIKit。)
然而,如果您在库/框架中编写快照测试,您可能会希望将测试包保留为库测试包,而不带Test Host。
更多内容请参阅这里。
作者
iOSSnapshotTestCase
是由 Facebook 的 Jonathan Dann 编写的,并得到了 Todd Krabach 的重大贡献。
如今,它由 Uber 维护。
许可协议
iOSSnapshotTestCase
采用 MIT 许可协议。请参阅 LICENSE
。