Мокинг API и поддержка тестов с помощью объектной модели страницы

Важность тестирования пользовательского интерфейса

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

Однако с точки зрения пользователя не имеет значения, не приведет ли нажатие кнопки подтверждения к ожидаемому экрану. Таким образом, UI-тестирование не заменяет модульное тестирование в вашем наборе тестов, а просто завершает его.

Проблемы тестирования пользовательского интерфейса

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

Тестирование пользовательского интерфейса может быть сложно настроить, чтобы избежать разрыва с течением времени, по следующим причинам:

  • Наше приложение работает с внутренним сервером, поэтому тесты становятся очень противоречивыми: проблемы с сетью или проблемы с сервером. Мы не контролируем запросы, возвращаемые с сервера.
  • Написание сценариев тестирования пользовательского интерфейса занимает много времени. Поиск кнопок или управление перемещением между экранами для одного теста. И затем нам нужно продублировать код, когда мы хотим создать новый тестовый пример.
  • Тесты не только долго писать, они еще и не очень удобочитаемы. Попытайтесь понять их через два дня после их создания, и вы поймете, о чем я.
  • UI постоянно меняется. Мы добавляем и удаляем кнопки, экраны, прокрутки и многое другое. Обновление тестов становится кошмаром каждый раз, когда мы хотим внести небольшое изменение.

Смоделируйте свой бэкэнд

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

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

Но если вы будете следовать SoC (разделение задач), вы можете смоделировать свой внутренний сервер, создав фиктивный сервер, внедрив его на свой сетевой уровень и сделав свой тест полностью надежным и предсказуемым.

Многие инструменты могут помочь вам имитировать ваш сервер, но принципы всегда одни и те же - замените свой сервер локальным компонентом, который возвращает предсказуемые и надежные объекты ответа на ваши сетевые запросы.

Чтобы протестировать свое приложение в различных случаях (вход, выход, синхронизация данных и т. Д.), Вы можете сохранить фиктивные данные запрос-› ответ в разные файлы JSON , где каждый файл представляет разные сценарии (журнал- в, зарегистрируйтесь).

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

Но чтобы собрать все насмешливые данные, нужно время!

Вы разработчик, творите чудеса! Записывайте запросы и ответы при однократном запуске приложения. Вы можете сделать это с помощью Charles Proxy или написать код, сохраняющий все сетевые данные в файл.

Мокинг других API

Этот метод не обязательно заканчивается издевательством над вашим сервером. Вы также можете издеваться над другими API.

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

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

То же самое касается календарей, напоминаний и других системных API.

Ведение тестов с помощью объектной модели страницы

Написание сценариев тестирования пользовательского интерфейса требует времени и усилий, но настоящая проблема заключается в том, как поддерживать его с течением времени.

Самый простой способ решить эту проблему - создать нечто, называемое объектной моделью страницы.

Объектная модель страницы - это объект, прикрепленный к экрану. В нем есть ссылка на XCUIApplication, и в его обязанности входит выполнение действий на странице, поиск элементов и возврат объекта следующей страницы, если это необходимо.

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

Принципы объектов страницы заключаются в том, что мы отделяем тестовый сценарий от обработки макета.

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

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

Заключение

Это было краткое введение о том, как решить проблемы с тестированием пользовательского интерфейса.

Как я уже сказал, существуют дополнительные и более сложные инструменты, такие как настройка локального сервера для имитации, Шаблон сценария или файлы конфигурации Xcode. Я постараюсь рассказать об этом в следующих статьях.

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