Тестирование пользовательского интерфейса Xcode — вход/выход с сохраненными учетными данными

Я хочу запустить функциональные (UI) тесты для процедуры входа в систему в моем приложении iOS (Xcode 7.2.1).

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

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

Я вижу здесь два варианта, ни один из них не подходит:

  1. Сбрасывайте содержимое и настройки iOS Simulator с помощью скрипта перед каждым запуском моих тестов. Я попытался добавить фазу Run Script в тестовую цель Build Phases с помощью: xcrun simctl shutdown booted && xcrun simctl erase all && killall "Simulator", и это, похоже, не работает (приложение «Симулятор» не запускается, и тесты зависают).
  2. Включите в -(void)tearDown некоторый код, чтобы очистить сохраненные учетные данные пользователя. Этот вариант также не годится, так как он не только запускается между каждым тестовым методом (не для каждого запуска теста), но также кажется, что у меня нет доступа к классу AuthManager, который я использую для очистки учетных данных пользователя.

Что вы делаете, когда UI-тестируете такие процедуры входа в систему?


person mllm    schedule 14.03.2016    source источник


Ответы (3)


Я столкнулся с такими же проблемами. После множества нападок моим лучшим подходом было попытаться сделать все немного проще. В своих слезах я всегда «раскручиваю» все, что я мог бы сделать. Иногда это излишне, но это все же хорошая практика. Я нашел много ошибок во время раскручивания, где я мог бы их не заметить, если бы сделал какой-то жесткий сброс. IE: я вернусь на домашнюю страницу (моя отправная точка) и, если я вошел в систему, просто выйду из нее. Для справки, на стороне приложения, когда пользователи выходят из системы, их учетные данные удаляются.

Так, например, в моих классах SignInTests.swift я помещаю все свои методы в расширение в том же файле класса. Таким образом, я могу просто вызвать SignInTests().signIn() или SignInTests().signOut(), чтобы я мог получить к ним доступ из любого другого тестового класса, из которого я мог бы вызвать signOut().

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

person Craig Fisher    schedule 15.03.2016
comment
Хороший подход. Я предполагаю, что мне не пришла в голову возможность выйти из пользовательского интерфейса. Я продолжал пытаться выйти программно, и это не сработало. Спасибо! - person mllm; 16.03.2016
comment
Тем не менее, я хотел бы увидеть способ действительно сбросить приложение/симулятор - поскольку ваш метод может обнаруживать ошибки выхода, он также может загрязнять тесты входа (поскольку мы имеем дело с некоторым состоянием, которое процедура выхода осталось) - person mllm; 16.03.2016
comment
Я абсолютно согласен. Надеемся, что такая простая опция станет доступна в будущих выпусках. - person Craig Fisher; 16.03.2016

Наш ответ (в моей компании) состоял в том, чтобы создать расширение XCTestCase под названием ContainerResettingUITest. Мы передаем серию дополнительных аргументов запуска, которые переопределяют setUp (а не tearDown), а затем в main(), если эти аргументы запуска были переданы, мы уничтожаем все в каталоге docs, связке ключей и nsuserdefaults.

Несколько ядерный вариант. Не передавайте этот аргумент запуска случайно.

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

person Aaron Sofaer    schedule 16.03.2016

Когда вы запускаете свое приложение из XCTestCase, вы можете использовать что-то вроде этого

let app = XCUIApplication()
app.launchArguments.append("--uitesting")
app.launch()

И в методе AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

if CommandLine.arguments.contains("--uitesting") {
    clear()
} 

Запустите это в первом тесте, когда вам нужно войти в систему. В следующем тесте вы можете очистить данные из launchArguments.

app.launchArguments = []
person Arek    schedule 28.02.2019