Snapshot is awesome.
Now it uses UI Testing.
UI Testing is massively better than UI Automation - but sometimes, you just want to cheat.
HSTestingBackchannel gives you a simple method to send messages from your UITesting tests directly to your running app in the form of notifications.
Install with CocoaPods
pod 'HSTestingBackchannel', :configuration => 'Debug'
# Dependency of HSTestingBackchannel - include this line to install it only in debug
pod 'GCDWebServer', :configuration => 'Debug'
#if DEBUG
import HSTestingBackchannel
#endif
And then, in application(_:didFinishLaunchingWithOptions:)
:
#if DEBUG
HSTestingBackchannel.installReceiver()
#endif
HSTestingBackchannel.sendNotification("SnapshotTest")
or
HSTestingBackchannel.sendNotification("SnapshotTest", with: ["aKey": "aValue"])
#if DEBUG
NotificationCenter.default.addObserver(
forName: NSNotification.Name("SnapshotTest"),
object: nil,
queue: .main) { _ in
// Do Something
})
#endif
Within a test method (or in setUp), call something like
HSTestingBackchannel.installFiles(from: "..pathTo/fastlane/DummyImages",
to: HSTestingResources)
This will install the contents of DummyImages in the resources folder of your running app. You can also install directly to the Documents directory in the app.
By default, Fastlane now runs multiple simulators simultaneously. This means you need to make sure that the server for each simulator is running on a different test.
Use the setup method to do the following
let app = XCUIApplication()
HSTestingBackchannel.port = UInt.random(in: 8000...60000)
app.launchArguments.append(
contentsOf: ["-HSTestingBackchannelPort", "\(HSTestingBackchannel.port)"])
Snapshot.setupSnapshot(app, waitForAnimations: true)
app.launch()
HSTestingBackchannel installs a web server in your main app (GCDWebServer).
You simply send requests directly to that - and it recognises them and broadcasts NSNotifications