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.
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()
}
}
}
}
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()
}
}
}