iOSSnapshotTestCase (之前是 FBSnapshotTestCase)

Build Status CocoaPods Compatible Carthage compatible Swift Package Manager

它的作用

“快照测试用例” 获取一个已配置的 UIViewCALayer,并使用必要的 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" ~> 8.0.0

Swift Package Manager

将以下行添加到您的 Package.swift

dependencies: [
  .package(url: "https://github.com/uber/ios-snapshot-test-case.git", from: "8.0.0"),
],

...或者通过 Xcode 的 File -> Swift Packages -> Add Package Dependency... 使用仓库的 URL 进行集成。我们建议在 Version 字段中使用 “Up to Next Major”,因为我们使用语义化版本控制,并且仅在主版本中进行破坏性更改。

步骤 2:设置测试 Scheme

将 “Tests” 替换为您的测试项目名称。

  1. 三种方法 设置参考图像目录,推荐的方法是在您的 scheme 中定义 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 到您想要存储失败快照差异的目录。还有 三种方法 设置失败图像差异目录。

创建快照测试

  1. 继承 FBSnapshotTestCase 而不是 XCTestCase
  2. 在您的测试中,使用 FBSnapshotVerifyView
  3. 在测试的 -setUp 方法中,使用 self.recordMode = YES; 运行测试一次。(这会在磁盘上创建参考图像。)
  4. 移除启用 record 模式的行并再次运行测试。

特性

注意

您的单元测试应该在 “application” bundle 内,而不是 “logic/library” 测试 bundle 内。(也就是说,它应该在 Simulator 中运行,以便它可以访问 UIKit。)

然而,如果您在库/框架中编写快照测试,您可能希望将您的测试 bundle 保留为没有 Test Host 的库测试 bundle。

在此处阅读更多信息:这里

作者

iOSSnapshotTestCase 最初由 Jonathan Dann 在 Facebook 编写,Todd Krabach 贡献了重要代码。

今天它由 Uber 维护。

许可证

iOSSnapshotTestCase 使用 MIT 许可证。请参阅 LICENSE