Как запустить код в приложении iOS из теста пользовательского интерфейса в Xcode 7?

Есть ли способ запустить код в приложении из теста пользовательского интерфейса в Xcode 7? Это возможно с тестами приложений (поскольку тесты выполняются в приложении), но с тестами пользовательского интерфейса простого способа не существует.

Кто-нибудь придумал обходной путь?


person Hilton Campbell    schedule 29.11.2015    source источник


Ответы (3)


Самый простой способ запустить код в приложении, которое вы выполняете, из тестов пользовательского интерфейса — предоставить launchArguments через XCUIApplication.

тестовый код пользовательского интерфейса

import XCTest

class UITestUITests: XCTestCase {

    override func setUp() {
        super.setUp()
        let app = XCUIApplication()
        app.launchArguments += ["-anargument", "false","-anotherargument","true"]
        app.launch()
    }

}

код приложения

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    print("All arguments: \(NSProcessInfo.processInfo().arguments)\n\n")
    print("anargument: \(NSUserDefaults.standardUserDefaults().boolForKey("anargument"))")
    print("anotherargument: \(NSUserDefaults.standardUserDefaults().boolForKey("anotherargument"))")
    return true
}

вывод приложения при запуске из теста пользовательского интерфейса:

All arguments: ["/...../AnApp.app/UITest", "-anargument", "false", "-anotherargument", "true"]

anargument: false
anotherargument: true
person nacross    schedule 10.07.2016

Тестирование пользовательского интерфейса выполняется в отдельном процессе от вашего приложения. В настоящее время, начиная с Xcode 7.1.1, нет возможности напрямую взаимодействовать с кодом производственного приложения из фреймворка.

Каждое взаимодействие должно проходить через доступность. Это означает, что вы можете подключить кнопку, которая запускает код в вашем приложении, а тесты будут вызывать эту кнопку. Это, очевидно, не масштабируется, и я бы не рекомендовал этого делать.

Может быть, есть другой способ достичь своих целей? Чего именно вы пытаетесь достичь?

person Joe Masilotti    schedule 29.11.2015
comment
Есть пара вещей, которые я пытаюсь выполнить. Например, я хочу, чтобы тесты управлялись данными, поэтому они должны иметь доступ к данным приложения. Я также хочу использовать короткие пути (у меня есть огромное количество существующих KIF-тестов, которые я хотел бы переключить — на их выполнение уходят часы). - person Hilton Campbell; 29.11.2015

Я думаю передать переменную среды в приложение при тестировании, которое запускает встроенный HTTP-сервер. Затем я могу общаться с приложением через сервер. Сумасшедший, верно? И все же, я не могу поверить, что никто еще не сделал этого.

Больше всего при таком подходе меня беспокоит то, что встроенный сервер будет находиться в рабочем приложении. Я не уверен, является ли это проблемой или есть простой способ включить его только при запуске тестов пользовательского интерфейса.

person Hilton Campbell    schedule 29.11.2015
comment
Вы в итоге сделали это? я тоже обдумываю - person Joe Flateau; 31.03.2020
comment
Да, я использовал эту технику в нескольких проектах. У меня сервер включен только в отладочные сборки приложения. - person Hilton Campbell; 01.04.2020
comment
Я тоже пошел по этому пути. Запустил приложение узла за пределами тестовых/фактических приложений. - person Joe Flateau; 01.04.2020