Привет, Хабр! На связи снова Максим из ATI.SU.

В первой части цикла мы разложили нативную автоматизацию iOS на винтики: разобрались, какое место UI-тесты занимают в пирамиде тестирования, познакомились с фреймворками, раннерами и артефактами сборки и собрали всё в единый алгоритм создания автотеста. Теперь пора переходить к практике.

Но прежде чем написать первую строчку теста, нужно подготовить рабочее место. Как в мастерской: прежде чем крутить винтики, стоит разложить инструменты по местам. В Xcode таким рабочим местом служит отдельный таргет для UI-тестов. Без него тесты просто не скомпилируются и не запустятся, сколько бы кода мы ни написали.

В этой статье разберём:

  • что такое таргет в Xcode и зачем он нужен;

  • какие настройки важно проверить перед началом работы;

  • как добавить UI Testing Bundle в новый и существующий проект;

  • на что обратить внимание при настройке подписи и сертификатов.

Что такое таргет и зачем он нужен

Таргет — это инструкция для сборки продукта: самого приложения, набора тестов, виджета или расширения. Если проект — это кухня, то таргет — рецепт конкретного блюда: из каких ингредиентов (файлов) его готовить и с какими настройками.

Каждый проект в Xcode состоит как минимум из одного таргета — таргета самого приложения, который создаётся автоматически вместе с проектом. Это основной таргет: он компилирует код приложения и собирает исполняемый файл .app.

Общие настройки таргета (General)

На вкладке General находятся основные параметры таргета.

  • Supported Destinations — определяет, на каких платформах и устройствах может запускаться приложение (напр., iPhone, iPad и т. д.).

  • Minimum Deployments — задаёт минимальную версию iOS, которую поддерживает приложение.

  • Identity — базовая информация о продукте: имя приложения, версия, номер сборки. Но больше всего здесь нас интересует Bundle Identifier — уникальный идентификатор приложения в экосистеме Apple. На одном устройстве не может быть двух приложений с одинаковым Bundle Identifier.

  • Deployment Info — настройки, связанные с развёртыванием приложения: поддерживаемые ориентации экрана, вид статус-бара и другие параметры запуска.

Как правило, настройки основного таргета уже сконфигурированы разработчиками, и трогать их не нужно. Исключение — Bundle Identifier: если такой идентификатор уже используется, Xcode сообщит об ошибке. Это может случиться как в основном, так и в тестовом таргете. Решение простое: измените идентификатор на уникальный, например, добавив суффикс с вашим именем (напр., Maxim-Makarov.TestProject).

Остальные вкладки, такие как Info и Build Settings, содержат более тонкие настройки, которые на начальном этапе можно оставить без изменений.

Добавление таргета для UI-тестов

С основным таргетом разобрались. Теперь добавим ему «напарника» — отдельный таргет для UI-тестов. Код теста можно написать и без него, но скомпилировать и запустить UI-тесты не получится. Как мы помним из первой части, UI-тесты живут в отдельном таргете типа UI Testing Bundle: он собирается рядом с приложением и запускает его как отдельный процесс.

Способ добавления зависит от того, создаёте вы проект с нуля или работаете с уже существующим.

Новый проект

Если проект создаётся с нуля, таргет для тестов можно добавить сразу при первичной настройке. В окне "Choose options for your new project" есть поле "Testing System" с двумя вариантами:

  • Swift Testing with XCTest UI Tests — unit-тесты создаются на Swift Testing, а UI-тесты на XCTest. Swift Testing Apple представила на WWDC24 вместе с Xcode 16, и UI-тесты он пока не поддерживает.

  • XCTest for Unit and UI Tests — и unit-, и UI-тесты на классическом фреймворке XCTest.

Таргет для UI-тестов появится в обоих случаях, и в обоих случаях он будет на XCTest. Разница только в unit-тестах. Мы выберем XCTest for Unit and UI Tests, чтобы весь тестовый код был на одном фреймворке.

Существующий проект

В существующем проекте сначала проверяем, нет ли там уже нужного таргета. Для этого:

  1. В навигаторе проекта слева выберите сам проект (самый верхний элемент).

  2. В центральной части окна обратите внимание на раздел TARGETS.

Если там только один таргет с названием вашего проекта и нет таргета с припиской UITests, значит, его нужно создать.

Таргет с припиской Tests (без UI) — это таргет для unit-тестов. Для UI-тестов он не подойдёт.

Процесс создания UI Testing Bundle

1. В центральной части окна в разделе TARGETS нажмите на кнопку +.

2. В открывшемся окне выберите нужную платформу (напр., iOS) и найдите шаблон UI Testing Bundle.

3. Нажмите Next.

4. Откроется окно "Choose options for your new target" с настройками нового таргета. Большинство полей можно оставить без изменений:

  • Product Name — по умолчанию Xcode предложит имя проекта с суффиксом UITests. Рекомендуется оставить это имя.

  • Team — выберите вашу учётную запись (Apple ID).

  • Organization Identifier — можно оставить по умолчанию или указать свой.

  • Target to be Tested — убедитесь, что здесь выбран основной таргет вашего приложения.

  • Language — Swift.

5. Нажмите Finish.

В разделе TARGETS появится новый таргет для компиляции и запуска UI-тестов.

Также в структуре проекта появится новая папка для UI-тестов (например, TestProjectUITests) и два файла внутри:

  • с припиской UITests — основной файл с UI-тестами. Именно здесь мы будем писать сценарии тестов. Xcode сразу кладёт в него шаблонный тест testExample и тест testLaunchPerformance, который замеряет время запуска приложения.

  • с припиской UITestsLaunchTests — файл с тестом testLaunch: он запускает приложение и делает скриншот стартового экрана. Для наших задач он не понадобится, поэтому этот файл можно удалить.

Таргет создан, но радоваться пока рано: прежде чем что-то запускать, стоит убедиться, что Xcode не споткнётся о его настройки.

Проверка конфигурации нового таргета

После создания таргета обязательно проверьте его настройки:

  1. Выберите новый таргет ...UITests.

  2. Перейдите во вкладку Signing & Capabilities.

  3. Убедитесь, что в поле Team выбрана ваша учётная запись и активна опция Automatically manage signing. Если поле пустое или в нём висит ошибка — переходите к следующему разделу.

  4. Проверьте, что Xcode не выдаёт ошибок, связанных с Bundle Identifier. Если ошибка есть — измените идентификатор на уникальный.

Настройка подписи и сертификатов (Signing & Capabilities)

При попытке запустить приложение можно столкнуться с ошибкой, которая связана с отсутствием сертификата подписи. Это ключевой раздел, с которым часто возникают проблемы при первом запуске проекта. Чтобы это исправить, необходимо привязать вашу учётную запись разработчика Apple. Для этого:

  1. Перейдите во вкладку Signing & Capabilities в настройках таргета.

  2. В поле Team вы увидите ошибку. Нажмите на него и выберите Add an Account....

  3. Введите логин и пароль от вашего Apple ID. После этого ваша учётная запись появится в Xcode.

  4. Выберите добавленную учётную запись в поле Team.

  5. Активируйте опцию Automatically manage signing. Это позволит Xcode автоматически управлять сертификатами и профилями, что избавляет от большинства ручных действий.

Эти шаги нужно выполнить как для таргета приложения, так и для таргета с тестами.

Что дальше

В этой части мы подготовили проект к написанию UI-тестов. Разобрались, что такое таргет и зачем он нужен, и какие настройки на вкладке General стоит проверить. Затем добавили UI Testing Bundle в новый и существующий проект и настроили подпись, чтобы Xcode не остановил нас ошибкой при первом же запуске.

Если вернуться к алгоритму создания UI-автотестов из первой части, то сейчас мы подготовили почву для самого первого шага: проект собирается, а тестовый таргет готов к работе.

Следующий шаг алгоритма — найти локаторы. Тест не сможет нажать на кнопку или проверить текст, пока не знает, где этот элемент находится на экране. Поэтому в следующей части разберём все способы найти accessibilityIdentifier, начиная с уже знакомого Accessibility Inspector.

Больше пишу про мобильное тестирование и не только в своём тг-канале.

Если есть вопросы или темы, которые хочется разобрать подробнее, — пишите в комментариях. Отвёртки не убираем, продолжение следует.

Комментарии (0)