How to access launchEnvironment and launchArguments set in XCUIApplication, running UI tests in XCode?
I've tried setting attributes in the XCUIApplication
instance, in my UI Tests setUp()
let app = XCUIApplication()
app.launchEnvironment = ["testenv" : "testenvValue"]
app.launchArguments = ["anArgument"]
app.launch()
in didFinishLaunch
I've tried to show these on screen when I run my UITests
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if launchOptions != nil {
for (key, value) in launchOptions! {
let alertView = UIAlertView(title: key.description, message: value.description, delegate: nil, cancelButtonTitle: "ok")
alertView.show()
}
}
But I can't seem to be able to find the arguments and environment I set. Anyone know how to get a hold of them?
Solution 1:
If you set launchArguments
in a UI Test (Swift):
let app = XCUIApplication()
app.launchArguments.append("SNAPSHOT")
app.launch()
Then read them in your App using:
swift 2.x:
if NSProcessInfo.processInfo().arguments.contains("SNAPSHOT") {
// Do snapshot setup
}
Swift 3.0
if ProcessInfo.processInfo.arguments.contains("SNAPSHOT") {
}
To set environment variables, use launchEnvironment
and NSProcessInfo.processInfo().environment
, respectively, instead.
Solution 2:
Building on Joey C.'s answer, I wrote a small extension to avoid using raw strings in the app. This way you avoid any typo issue and get autocompletion.
extension NSProcessInfo {
/**
Used to recognized that UITestings are running and modify the app behavior accordingly
Set with: XCUIApplication().launchArguments = [ "isUITesting" ]
*/
var isUITesting: Bool {
return arguments.contains("isUITesting")
}
/**
Used to recognized that UITestings are taking snapshots and modify the app behavior accordingly
Set with: XCUIApplication().launchArguments = [ "isTakingSnapshots" ]
*/
var isTakingSnapshots: Bool {
return arguments.contains("isTakingSnapshots")
}
}
This way you can use
if NSProcessInfo.processInfo().isUITesting {
// UITesting specific behavior,
// like setting up CoreData with in memory store
}
Going further, the various arguments should probably go into an enum that could be reused in the UITest when setting the launchArguments.