1

任何线索我们如何使用快照测试来测试暗模式实现?或 iOS 上暗模式的任何其他测试策略。

当 XCUITest 是 XCTest (单元测试)的选项之一。UITest 在黑暗模式下的问题意味着对于每个应用程序流,它都需要运行两次。

Unittest 用例是否足以满足暗模式的测试需求?您能想到仅使用暗模式的单元测试无法涵盖的任何用例吗?

4

1 回答 1

2

我使用FBSnapshotTestCase在单元测试目标中获取明暗快照:

final class ViewControllerSnapshotTests: FBSnapshotTestCase {
    private var sut: ViewController!

    override func setUp() {
        super.setUp()
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        sut = storyboard.instantiateViewController(
            identifier: String(describing: ViewController.self)
        )

        usesDrawViewHierarchyInRect = true
        recordMode = false // set to true to record snapshots
    }

    override func tearDown() {
        sut = nil
        super.tearDown()
    }

    func test_light() {
        sut.overrideUserInterfaceStyle = .light
        FBSnapshotVerifyViewController(sut)
    }

    func test_dark() {
        sut.overrideUserInterfaceStyle = .dark
        FBSnapshotVerifyViewController(sut)
    }
}

这产生了以下快照:

test_dark@2x.png 和 test_light@2x.png

诀窍是:

  • usesDrawViewHierarchyInRect = true在快照测试用例上设置
  • overrideUserInterfaceStyle在视图控制器上设置

快照测试相对于 UITests 的通常优势适用。快照比普通的单元测试慢,但比 UITests快得多,因为我们不必浏览应用程序即可到达每个视图控制器。

多快?这是我在 2015 MacBook Pro 上运行的时间。

Test Suite 'ViewControllerSnapshotTests' started at 2021-04-20 21:35:26.856
Test Case '-[SOTests.ViewControllerSnapshotTests test_dark]' started.
Test Case '-[SOTests.ViewControllerSnapshotTests test_dark]' passed (0.101 seconds).
Test Case '-[SOTests.ViewControllerSnapshotTests test_light]' started.
Test Case '-[SOTests.ViewControllerSnapshotTests test_light]' passed (0.029 seconds).
Test Suite 'ViewControllerSnapshotTests' passed at 2021-04-20 21:35:26.987.
   Executed 2 tests, with 0 failures (0 unexpected) in 0.130 (0.131) seconds
于 2021-04-21T04:24:25.987 回答