Отличительные особенности первого запуска при тестировании пользовательского интерфейса

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


person gerbil    schedule 06.12.2017    source источник


Ответы (1)


Вы должны использовать класс UserDefaults для сохранения данных в вашем приложении, чтобы вы могли вставить данные в свои тесты.

Если мы предположим, что ключ Bool, который вы используете для проверки первого запуска, - это isFirstTime, чтобы заглушить его в тесте пользовательского интерфейса, вы должны передать его launchArguments после значения YES или NO (для значений Bool). Обратите внимание, что я добавил знак - перед ключом, вот как это работает:

class FirstTimeLaunchTest: XCTestCase {

    let app = XCUIApplication()

    override func setUp() {
        super.setUp()
        continueAfterFailure = false

        app.launchArguments += ["-isFirstTime", "YES"]
        app.launch()
    }

    func testWelcomeScreenShown() {
        XCTAssert(app.navigationBars["Welcome"].exists)
    }
}

Для тестов, в которых вы хотели бы пропустить первый запуск, используйте этот класс:

class LaterLaunchesTest: XCTestCase {

    let app = XCUIApplication()

    override func setUp() {
        super.setUp()
        continueAfterFailure = false

        app.launchArguments += ["-isFirstTime", "NO"]
        app.launch()
    }

    func testMainAppScreenShown() {
        XCTAssert(app.navigationBars["My App"].exists)
    }
}

Одно примечание: если вы используете библиотеку SwiftyUserDefaults, это решение не будет ' т работать. В текущей версии библиотеки есть проблема, из-за которой преобразование строк YES и NO в true и false не работает должным образом. Существовал PR, который решил эту проблему (которая отклонена), но для решения этой проблемы проблемы, вы можете посмотреть решения №2 и №3 в этом ответе.

person lagoman    schedule 06.12.2017
comment
То, что определяет, будет ли это первый запуск или нет, не обязательно является аргументом запуска, скорее, если приложение уже было установлено на симуляторе. Например, у меня есть всплывающее предупреждение о разрешении местоположения, с которым нужно взаимодействовать. Если я правильно понимаю, мне пришлось бы смоделировать приложение, которое не запускается в первый раз, когда оно действительно ДЕЙСТВУЕТ. - person gerbil; 06.12.2017
comment
Невозможно узнать, было ли ваше приложение установлено на симуляторе раньше. Кроме того, ваш вопрос неуместен, поскольку вы не описали, в чем разница при запуске приложения в первый и каждый следующий раз. Но из вашего комментария, поскольку вы запрашиваете местоположение, когда пользователь запускает приложение в первый раз, насколько мне известно, невозможно имитировать отображение системного диалога более одного раза. Я пытался найти решение для этого, но безуспешно. Если хотите, можете попробовать эти два теста, если используете UserDefaults. Добавление launchArguments в приложение - это способ UserDefaults заглушить данные в тестах пользовательского интерфейса. - person lagoman; 06.12.2017