快照测试 3.0.0

快照测试 3.0.0

Pär Strindevall 维护。



  • Pär Strindevall 和 André Stenvall

master

快照测试 是一个完全用Swift编写的简单视图测试工具,旨在帮助开发Apple平台。它就像视图的单元测试。

如何使用

record mode(记录模式)激活时,快照断言会记录视图的图像并将其保存到指定目录。这将导致测试失败。当记录模式关闭时,快照断言将记录视图的图像并将其与保存的参考图像进行比较。如果它们不同,测试将失败。

配置

所有快照测试需要的只是知道保存参考图像的位置。此目录使用键通过测试方案环境变量指定

REFERENCE_IMAGE_DIR

推荐参考图像目录路径是

$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages

它应该看起来像这样

Test scheme arguments.

使用方法

如果您熟悉 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)
    }
    
}

目前支持 UIViewUIViewControllerCALayer

记录模式

记录模式记录当前作用域内视图的快照并将其存储在参考目录中,以供与任何后续断言比较。

请注意,记录模式会导致测试失败,并将参考图像路径输出到控制台。

🔴 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 许可,非常欢迎通过拉取请求和问题形式进行贡献。