Stilleben

0.4.0

Modern snapshotting
aegzorz/stilleben

What's New

📦 Release 0.4.0

2022-11-17T20:29:58Z

What's Changed

  • 🔧 Using macos-12 runner and switching to Xcode 14.1 by @aegzorz in #34
  • 🐛 Intrinsic size strategy fix by @aegzorz in #35
  • ✏️ License and updated docs by @aegzorz in #36

Full Changelog: v0.3.0...v0.4.0

Build License Version

Stilleben

Modern snapshot testing written in Swift.

Used to for testing snapshots of mostly UI components but also models and other types.

It comes with a few predefined matchers:

  • UIMatcher for SwiftUI and UIKit snapshots.
  • EncodableMatcher for snapshots of models encoded to JSON.
  • ReflectionMatcher for snapshots of any type in the form of a reflection description.

Snapshots can be configured to use the following:

  • RecordingStrategy determines how snapshots are saved and read.
  • DiffingStrategy how to diff the recorded snapshot against the one generated by the test.
  • RenderingStrategy strategy used for rendering UI snapshots.
  • SizingStrategy strategy used for sizing views before snapshotting.

Examples

Example of snapshot testing a SwiftUI view:

import XCTest
import Stilleben

final class SomeViewTests: XCTestCase {
    private let matcher = UIMatcher()
        .assertSimulator(modelIdentifier: "iPhone14,7")
        .sizing(.dynamicHeight)
        .dynamicTypeSizes(.large)

    func testSomeView() async throws {
        await matcher
            .colorSchemes(.light)
            .match {
                NavigationView {
                    SomeView()
                }
            }
    }
}
Generated snapshot

It also supports snapshot testing UIKit view controllers or views:

import XCTest
import Stilleben

final class SomeViewControllerTests: XCTestCase {
    private let matcher = UIMatcher()
        .assertSimulator(modelIdentifier: "iPhone14,7")
        .sizing(.screen)
    
    func testSomeViewController() async throws {
        await matcher
            .match { @MainActor () -> UIViewController in
                SomeViewController()
            }
    }
    
    func testSomeView() async throws {
        await matcher
            .sizing(.intrinsic)
            .match { @MainActor () -> UIView in
                SomeView()
            }
    }
}

Description

  • Swift Tools 5.6.0
View More Packages from this Author

Dependencies

Last updated: Sun Nov 27 2022 02:34:19 GMT-0500 (GMT-05:00)