Подтвердить что ты не робот

Как получить доступ к параметрам 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()
        }
    }

Но я не могу найти аргументы и среду, которые я установил. Кто-нибудь знает, как их удержать?

4b9b3361

Ответ 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
}