-
Notifications
You must be signed in to change notification settings - Fork 0
XCode samples
Derek Clarkson edited this page Nov 16, 2022
·
2 revisions
Cut-n-paste this to a swift file in you UI tests. It provides the core setup needed to run Voodoo in a XCTest UI test suite.
import XCTest
import Voodoo
/// Simple UI test suite base class that can be used to start a mock server instance before
/// running each test.
open class UITestCase: XCTestCase {
/// The mock server.
private(set) var server: Voodoo!
/// Local app reference.
private(set) var app: XCUIApplication!
/// Launch arguments to be passed to your app. These can be augmented
/// in each test suite to control feature flags and other things for the test.
open var launchArguments: [String] {
[
"--server", server.url.absoluteString,
]
}
// Overridden tear down that ensures the server is unloaded to free the allocated port.
override open func tearDown() {
server = nil
super.tearDown()
}
/// Call to launch the server. This should be done before ``launchApp()``
///
/// - parameter endpoints: The end points needed by the server.
func launchServer(@EndpointBuilder endpoints: () -> [Endpoint]) throws {
server = try VoodooServer(verbose: true, endpoints: endpoints)
}
/// Launches your app, passing the common launch arguments and any additional
/// arguments.
///
/// - parameter additionalLaunchArguments: Allows you to add additional arguments
/// to a launch. Note that if you specify an argument twice, the later argument will
/// override any prior ones.
func launchApp(additionalLaunchArguments: [String] = []) {
app = XCUIApplication()
app.launchArguments = launchArguments + additionalLaunchArguments
app.launch()
}
}
This example launches the server from the setup which means the same setup is used by all the tests.
import XCTest
import Nimble
class SimpleUITests: UITestCase {
override open func setUpWithError() throws {
try super.setUpWithError()
try launchServer {
Endpoint(.GET, "/config", response: .ok(body: .json(["configVersion": 1.0])))
}
launchApp()
}
func testConfigIsLoaded() throws {
let configText = app.staticTexts["config-message"].firstMatch
_ = configText.waitForExistence(timeout: 5.0)
expect(configText.label) == "Config version: 1.00"
}
// ... and other tests.
}
This example allows each test to configure it's own setup before launching. This is most useful when doing things like testing feature flags which may vary from test to test in the same suite.
import XCTest
import Nimble
class IndividualUITests: UITestCase {
func testConfigIsLoaded() throws {
try launchServer {
Endpoint(.GET, "/config", response: .ok(body: .json(["configVersion": 1.0])))
}
launchApp(additionalLaunchArguments: ["-someFeatureFlag", "YES"])
let configText = app.staticTexts["config-message"].firstMatch
_ = configText.waitForExistence(timeout: 5.0)
expect(configText.label) == "Config version: 1.00"
}
// ... and other tests.
}