Как получить доступ к параметрам launchEnvironment и launchArguments, установленным в XCUIApplication, запустить тесты пользовательского интерфейса в XCode?
Я попытался установить атрибуты в экземпляре XCUIApplication
, в моих тестах пользовательского интерфейса setUp()
let app = XCUIApplication()
app.launchEnvironment = ["testenv" : "testenvValue"]
app.launchArguments = ["anArgument"]
app.launch()
in didFinishLaunch
Я пытался показать их на экране, когда запускаю 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()
}
}
Но я не могу найти аргументы и среду, которые я установил. Кто-нибудь знает, как их удержать?
Ответы
Ответ 1
Если вы установили launchArguments
в тест пользовательского интерфейса (Swift):
let app = XCUIApplication()
app.launchArguments.append("SNAPSHOT")
app.launch()
Затем прочитайте их в своем приложении, используя:
swift 2.x:
if NSProcessInfo.processInfo().arguments.contains("SNAPSHOT") {
// Do snapshot setup
}
Swift 3.0
if ProcessInfo.processInfo.arguments.contains("SNAPSHOT") {
}
Чтобы установить переменные среды, используйте launchEnvironment
и NSProcessInfo.processInfo().environment
, соответственно.
Ответ 2
Основываясь на ответе Джои С., я написал небольшое расширение, чтобы избежать использования необработанных строк в приложении. Таким образом, вы избегаете проблем с опечатками и получаете автозаполнение.
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")
}
}
Таким образом вы можете использовать
if NSProcessInfo.processInfo().isUITesting {
// UITesting specific behavior,
// like setting up CoreData with in memory store
}
Далее, различные аргументы должны, вероятно, перейти в перечисление, которое может быть повторно использовано в UITest при настройке параметров запуска.
Ответ 3
Вот пример с параметрами launchArguments и Objective-C:
if ([[NSProcessInfo processInfo].arguments containsObject:@"SNAPSHOT"]) {
//do snapshot;
}
Swift:
let arguments = ProcessInfo.processInfo.arguments
if arguments.contains("SNAPSHOT") {
//do snapshot
}
Ответ 4
Я знаю только, как это работает в Objective-C
NSDictionary *environment = [[NSProcessInfo processInfo] environment];
Ответ 5
Для аргументов запуска передайте их как два отдельных аргумента:
let app = XCUIApplication()
app.launchArguments.append("-arg")
app.launchArguments.append("val")
app.launch()
Взято из здесь.
Ответ 6
Обратите внимание на несколько деталей. Во-первых, XCUIAppliction не является одиночным, поэтому, если вы вызываете XCUIApplication().arguments.append("myargument")
, а затем вы вызываете XCUIApplication().launch()
, он не будет отправлять аргументы. Проверьте здесь.
Во-вторых, если вы измените аргументы после запуска приложения, это не сработает, оно отправит новые аргументы в следующее исполнение.
Ответ 7
Если вам нужно передать переменные среды из вашей схемы в XCUIT, измените объект XCTestCase → app.launchEnvironment на каждый тестовый класс следующим образом:
Swift 3
override func setUp(){
app.launchEnvironment = ProcessInfo.processInfo.environment
}