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

Ручная проверка каждого экрана iOS-приложения перед релизом отнимает дни и тормозит выпуск фич. Мы разрабатываем UI-тесты на XCUITest, которые автоматизируют регрессионные сценарии и освобождают команду для сложных задач. Наша команда реализует проект под ключ — от проектирования тестовой архитектуры до поддержки на стабильных релизах.

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

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

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

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

Почему 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.

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

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

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1009
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    902
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1331
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1179
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1106
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    713