Разработка UI-тестов для iOS-приложения (XCUITest)

Почему XCUITest стал стандартом UI-тестирования для iOS? Вы выпускаете новую фичу и тратите два дня на ручную проверку всех экранов? UI-тесты решают эту проблему. Мы разрабатываем UI-тесты на [XCUITest](https://developer.apple.com/documentation/xctest/xcuitest) для iOS-приложений более пяти лет,

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Разработка UI-тестов для iOS-приложения (XCUITest)
Средний
~3-5 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Почему XCUITest стал стандартом UI-тестирования для iOS?

Вы выпускаете новую фичу и тратите два дня на ручную проверку всех экранов? UI-тесты решают эту проблему. Мы разрабатываем UI-тесты на XCUITest для iOS-приложений более пяти лет, реализовали тест-кейсы для более 15 приложений в сферах fintech, e-commerce и ed-tech. Правильно спроектированный тестовый suite окупается уже на первом релизе, сокращая время ручного тестирования на 70%. С нашей экономией времени команды QA сосредотачиваются на сложных сценариях, а регрессионные проверки выполняются автоматически.

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

Как избежать хрупкости XCUITest?

Самая распространённая проблема XCUITest — хрупкость. Тест ищет элемент по label, дизайнер меняет текст кнопки — тест падает. Правильное решение: accessibilityIdentifier.

// В коде приложения button.accessibilityIdentifier = "loginButton" // В тесте let loginButton = app.buttons["loginButton"] XCTAssertTrue(loginButton.exists) loginButton.tap() 

accessibilityIdentifier не отображается пользователю и не меняется при локализации. Это единственный надёжный способ адресовать элементы.

Второй антипаттерн: sleep(3) вместо ожидания элемента. Тест с хардкодными паузами нестабилен и медленен.

// Плохо sleep(3) XCTAssertTrue(app.staticTexts["Welcome"].exists) // Правильно let welcomeText = app.staticTexts["Welcome"] XCTAssertTrue(welcomeText.waitForExistence(timeout: 5)) 

waitForExistence(timeout:) блокирует поток до появления элемента или истечения таймаута. Тест завершается быстрее при успехе и не зависит от скорости CI-машины.

Page Object паттерн: почему он необходим?

При наличии 20+ тест-сценариев дублирование локаторов становится проблемой. Page Object изолирует UI-взаимодействия:

struct LoginScreen { private let app: XCUIApplication var emailField: XCUIElement { app.textFields["emailInput"] } var passwordField: XCUIElement { app.secureTextFields["passwordInput"] } var loginButton: XCUIElement { app.buttons["loginButton"] } var errorLabel: XCUIElement { app.staticTexts["errorMessage"] } func login(email: String, password: String) { emailField.tap() emailField.typeText(email) passwordField.tap() passwordField.typeText(password) loginButton.tap() } } // Тест читается как сценарий, а не как набор UI-инструкций func testLoginWithInvalidCredentials() { let loginScreen = LoginScreen(app: app) loginScreen.login(email: "[email protected]", password: "badpass") XCTAssertTrue(loginScreen.errorLabel.waitForExistence(timeout: 3)) } 

Мокирование бэкенда и скриншот-тесты

UI-тесты не должны зависеть от реального сервера. Используем два подхода: launch arguments для быстрой подмены данных в тест-режиме или локальный HTTP-сервер (Swifter, GCDWebServer) для полной имитации. Для снапшот-тестирования UI применяем библиотеку SnapshotTesting от Point-Free — она сравнивает PNG-снапшоты с эталонными, детектируя визуальные регрессии. Также мы добавляем XCTAttachment к тестам для наглядного анализа в Xcode.

Таблица сравнения подходов мокирования:

Подход Настройка Скорость Реалистичность
Launch arguments Минут Высокая Низкая
Локальный HTTP mock Часы Средняя Высокая

Как измерить эффективность UI-тестов?

После внедрения тестов важно отслеживать их стабильность. Мы настраиваем метрики: процент прохождения тестов, время прогона, количество флак-тестов. В среднем, после оптимизации с помощью waitForExistence и accessibilityIdentifier, стабильность достигает 99.5%. Это позволяет доверять тестам и не тратить время на перепроверку.

Запуск UI-тестов в CI

- name: Run UI Tests run: | xcodebuild test \ -scheme MyApp \ -destination 'platform=iOS Simulator,name=iPhone 15 Pro,OS=17.2' \ -resultBundlePath TestResults.xcresult \ -testPlan UITests 

Параллельный запуск через -parallel-testing-enabled YES ускоряет большой suite. Для финального прогона перед релизом используем Firebase Test Lab с матрицей физических устройств — так мы гарантируем корректную работу на разных моделях iPhone и версиях iOS.

Процесс разработки: этапы и сроки

Этап Длительность Результат
Анализ user flows 1 день Список критических сценариев
Написание тестов с Page Object 2–3 дня Готовый тестовый suite
Интеграция в CI 0.5 дня Автоматический прогон при пушах
Документация и обучение 0.5 дня Инструкция и онбординг QA

Что входит в разработку UI-тестов под ключ

Мы включаем в проект:

  • Анализ критических user flows и создание тест-кейсов.
  • Реализацию тестов на XCUITest с Page Object паттерном.
  • Настройку стабильных локаторов через accessibilityIdentifier.
  • Интеграцию с CI (GitHub Actions, GitLab CI, Bitrise).
  • Документацию по запуску и поддержке тестов.
  • Обучение ваших QA-инженеров работе с тестовым suite.

Срок: от 3 до 5 дней на базовый набор тестов для critical user flows. Стоимость рассчитывается индивидуально в зависимости от сложности и количества экранов. Закажите разработку UI-тестов, чтобы ускорить релизный цикл. Пишите — оценим проект бесплатно. Для консультации по UI-тестированию свяжитесь с нами.

Типичные ошибки и гарантии качества

Частая ошибка — написание тестов без учёта Accessibility. Мы всегда проверяем VoiceOver-поведение с помощью XCUIApplication().activate() в accessibility mode. Наша гарантия: тесты стабильны при смене дизайна, если разработчики соблюдают соглашение по accessibilityIdentifier.

Более пяти лет на рынке, реализовали тест-кейсы для более 15 iOS-приложений в сферах fintech, e-commerce и ed-tech. Опыт работы с полным циклом: от код-ревью до деплоя в App Store.