Всем привет! Меня зовут Борис. Я AQA iOS-engineer в Vivid Money. Это вступительная статья, в цикле статей по iOS-автоматизации, в которых хочется рассказать о пользе ui-тестов на проекте, их эффективном использовании и написании. Данная статья будет полезна начинающим iOS-автоматизаторам, либо разработчикам, которые решили изучить XCUITest и покрыть свой проект ui-тестами. В рамках этой статьи, мы разберем такие этапы: Что такое ui-тесты и какую пользу они приносят. Установка и настройка окружения. Нахождение ui-элементов в проекте и проставление им accessibilityidentifier. Когда мы слышим слово 'тестирование', мы обычно представляем проверку приложения по тест-кейсам. А что если можно не проходить тест-кейсы на регрессе самим, а доверить это рутинное дело машине? В этом случае помогают ui-тесты. Они сокращают время проведения регресса и могут предоставлять актуальную информацию о приложении без вашего участия! Цель этих тестов — проверить, что интерфейс приложения ведет себя в соответсвии с спецификацией: кнопки имеют необходимое состояние, отображается ожидаемый текст и навигация в приложении происходит так, как мы ожидаем. Код, который вы пишете, имитирует действия пользователя с приложением, заставляя приложение отрабатывать так, как будто вы сами совершаете эти действия на своем телефоне. И в ходе этих действий мы можем проверять интересующие нас условия. Написание кода для автотестов занимает немало времени, а их поддержание в актуальном состоянии и того больше, НО в долгосрочной перспективе это сократит время проверки приложения во время регрессионного тестирования. Написание UI тестов имеет множество преимуществ, особенно в тех случаях, когда приложение разрастается, и его все сложнее поддерживать. Какие преимущества есть: Тесты выполняются быстрее, чем их проходит manual QA; Тесты можно запускать каждую ночь и получать отчет о качестве приложения к моменту выхода на работу утром; Тесты не подвержены человеческому фактору и не упустят даже самую малозаметную деталь; Берегут нервы вашего тестировщика на регрессе — ему не приходится проходить тест-кейсы по 100500 раз; Сокращают время проведения регрессионного тестирования. Выглядит все конечно классно, но неужели нет минусов, спросите вы? Они есть и весьма весомые: Пользовательский интерфейс может меняться, и ваши тесты могут устареть; Участники команды должны уметь писать ui-тесты; Тесты требуют обслуживания; Достаточно хрупкие по сравнению с unit-тестами (если изменится положение кнопки — ui-тест может не пройти); Также достаточно долго проходят по сравнению с unit-тестами (unit-тесты проходят меньше чем за секунду, ui-тесты будут запускать только приложение секунд 5). Несмотря на эти недостатки, я считаю, что если у вас крупный проект, ui-тесты имеют право на существование. Для того чтобы появилась возможность писать ui-тесты, нам нужно выполнить следующие действия. Если вы создаете новый проект, вам достаточно включить таргет с UI-тестами в момент создания проекта. Если у вас уже есть проект, то для добавления таргета с ui-тестами вам понадобится: Нажать на File > New > Target. Выбрать UI Testing Bundle. Нажать на Next и ввести название. Нажать Finish. Xcode создаст новый таргет с пустым UITest файлом. Он вам понадобится для написания и запуска тестов. Мы подготовили проект и разобрали, что за зверь такой, эти ui тесты. Теперь мы готовы разобрать пожалуй одну из базовых вещей в автотестах — это Accessibilityidentifier или как говорят в обиходе айдишник. Accessibilityidentifier — Это строка идентифицирующая ваш ui-элемент. Accessibilityidentifier позволяет найти нужный вам ui-элемент при выполнении автотеста. Взаимодействовать с ui-элементами можно не только по accessibilityidentifier, но также по индексу, координатам и другими способами. Но использование accessibilityidentifier при взаимодействии с ui делает ваши тесты более надежными и спасает вас от ситуации, когда добавили новый элемент на экран, изменили расположение текущих или изменили название элемента — вследствие чего ваши тесты начали падать. Рассмотрим несколько способов проставления accessibilityidentifier объектам в зависимости от реализации проекта. Выбрать storyboard. Развернуть the Utilities. Выбрать Identity Inspector. Выбрать ваш объект на storyboard. Активировать Enabled. Ввести название identifier (в примере: button). Выбрать нужный View. Добавить метод .accessibility(identifier: "nameOfID") к нужному объекту. Выбрать нужный ViewController. Присвоить accessibilityidentifier в viewDidLoad к необходимому объекту. Мы разобрались, как присвоить accessibilityidentifier объектам, теперь рассмотрим несколько способов, как найти нужный id объекта. Нативный инструмент Xcode. Он позволяет вам определить, есть ли у нужного объекта id без запуска самого теста. Для его использования вам необходимо: Собрать приложение на симуляторе и запустить его. Нажать Xcode. Нажать Open Developer Tools. Нажать Accesibility Inspector. В Accessibility Inspector выбрать ваш симулятор с запущенным приложением. Нажать на значок в виде мишени. Тапнуть на интересующий элемент в приложении. Дальше отобразится информация о выделенном объекте: Label — Текстовое значение, которое находится в выделенном объекте. Value — Значение, которое находится в выделенном объекте. Например, заполненый текст в TextFields. Traits — Название объкта (Например: Button, Static Text). Identifier — Название id выделенного объекта. Здесь отображаются действия, которые возможно выполнить с объектом. Это может быть свайп, нажатие и другие. Class — Класс выделенного объекта. Address — Адрес объекта в памяти. Controller — View Controller, в котором находится объект. Раздел в котором отображается иерархия объектов на экране. Этот раздел удобен когда не получается выделить этот объект курсором и можно в него провалиться по иерархии чтобы узнать id. Debug View Hierarchy в Xcode захватывает моментальный снимок пользовательского интерфейса и позволяет проверять Ui-элементы. Для его использования вам необходимо: Запустить приложение; Нажать на "Debug View Hierarchy" на интересующем вас экране; На полотне выбрать нужный вам элемент; Открыть "Inspectors" (боковая панель); Выбрать вкладку "Show the Object inspector"; В разделе "Accessibility" найти значение у "identifier". Для использования этого способа понадобится поставить breakpoint в вашем тестовом сценарии и в момент выполнения, когда breakpoint сработает, написать в дебаг консоль: Где po — print object команда, чтобы вывести информацию об объекте. XCUIApplication — класс, позволяющий запускать приложение и взаимодействовать с его ui элементами. debugDescription — свойство, отображающие иерархию элементов на экране. В этой иерархии мы видим, что за элементы есть на экране, их координаты, текст в них, значение, и, самое главное, identifier. Test recorder — нативный инструмент от Apple, который пишет тестовые сценарии за вас. Вам лишь нужно запустить его и прокликать необходимые шаги на симуляторе в запущенном приложении. Чтобы рекордер стал активным вам нужно: UI test target в вашем проекте; Тестовый класс с методом, который начинается с test. Для использования этого способа достаточно в методе вашего теста нажать на record и нажать на нужный вам объект на симуляторе. Если у этого объекта есть id — он отобразится в сгенерированом коде, если нет — можно увидеть, как альтернативным способом обратиться к нужному объекту. Ui-тесты —  это классный инструмент для повышения качества вашего продукта, но он не всегда необходим. Чтобы понять целесообразность его применения в вашем проекте, можно обратиться к статьям, в которых приводятся конкретные моменты, когда нужно или не нужно это делать. Вот пример такой статьи. В следующей статье, мы расскажем про то, какие бывают ui-элементы в iOS-приложении и как с ними взаимодействовать при написании ui-тестов. Погружение в автотестирование на iOS. Часть 2. Как взаимодействовать с ui-элементами iOS приложения в тестах Погружение в автотестирование на iOS. Часть 3. Жизненый цикл ios приложения во время прогона тестов Погружение в автотестирование на iOS. Часть 4. Ожидания в XCUITest Интересуешься автоматизацией на iOS? Подписывайся на мой телеграмм-канал, в котором я публикую материалы, которые будут полезны как начинающим, так и опытным iOS-автоматизаторам. AQA Lead & SDET