Разработка E2E-тестов для мобильного приложения (Maestro)
Мы используем Maestro, потому что это самый быстрый способ покрыть приложение E2E-тестами без танцев с сервером. За 5 лет мы автоматизировали более 50 мобильных проектов — от банковских приложений до маркетплейсов. Недавно для финтех-стартапа с 30 экранами написали 15 YAML-флоу за 4 дня. Регресс сократился с двух дней до четырёх часов, заказчик экономит около 400 000 руб. в год на обслуживании тестов. Maestro — black-box инструмент, он общается с устройством через Accessibility API и не требует модификации кода. Это идеально для регресса ключевых пользовательских путей: регистрация, каталог, оформление заказа. Средний проект сокращает время регрессии на 70%, а стоимость поддержки тестов — на 40% по сравнению с Appium. Гарантируем: каждый тест проходит ревью и запускается на реальных устройствах.
Как Maestro упрощает жизнь мобильному разработчику?
Главное — нулевая конфигурация. Установил через curl, написал YAML, запустил maestro test. Не нужно поднимать Appium-сервер, встраивать агент или разбираться с XCUITest. Maestro сам находит элементы по тексту, accessibilityLabel или id. Для типовых приложений это покрывает 80–90% сценариев.
Как написать тест на Maestro: пошаговая инструкция
- Создайте YAML-файл в папке
flows/. - Укажите
appIdвашего приложения (bundle ID для iOS, package name для Android). - Напишите последовательность действий:
launchApp,tapOn,inputText,assertVisible. - Используйте переменные и
runFlowдля переиспользования (см. пример ниже). - Запустите тест командой
maestro test flows/.
YAML-сценарии: просто, но есть нюансы
Минимальный флоу авторизации:
appId: com.example.myapp --- - launchApp: clearState: true - tapOn: "Email" - inputText: "[email protected]" - tapOn: "Пароль" - inputText: "password123" - tapOn: "Войти" - assertVisible: "Главная" tapOn ищет элемент по тексту, accessibilityLabel, testID или id. Если на экране два элемента с одинаковым текстом — Maestro нажмёт на первый. В таких случаях используем tapOn с уточнением: index или id.
- tapOn: text: "Добавить" index: 1 - tapOn: id: "add_to_cart_button" id на Android — resource-id, на iOS — accessibilityIdentifier. Maestro определяет платформу автоматически.
Переменные и подфлоу
Без переменных и runFlow большие тест-сьюты превращаются в копипасту. Создаём переиспользуемые блоки:
# flows/login.yaml appId: com.example.myapp --- - tapOn: "Email" - inputText: ${EMAIL} - tapOn: "Пароль" - inputText: ${PASSWORD} - tapOn: "Войти" # flows/checkout_test.yaml appId: com.example.myapp env: EMAIL: [email protected] PASSWORD: password123 --- - runFlow: flows/login.yaml - tapOn: "Каталог" - tapOn: "Купить" - assertVisible: "Оформление заказа" Переменные переопределяются при запуске: maestro test --env [email protected].
Запуск: локально и в CI
Локальный запуск — главное преимущество Maestro. Установка и запуск:
curl -Ls "https://get.maestro.mobile.dev" | bash maestro test flows/ maestro studio maestro studio — браузерный UI для интерактивного выбора элементов.
Maestro Cloud
Для CI без собственных устройств используем Maestro Cloud. В GitHub Actions:
- name: Run Maestro tests on Maestro Cloud uses: mobile-dev-inc/action-maestro-cloud@v1 with: api-key: ${{ secrets.MAESTRO_CLOUD_API_KEY }} app-file: app/build/outputs/apk/debug/app-debug.apk flows-file: flows/ Для собственного CI — локальный эмулятор + maestro test.
Почему Maestro, а не Appium или Detox?
Мы часто слышим этот вопрос. Сравним в таблицах:
| Критерий | Maestro | Appium | Detox |
|---|---|---|---|
| Конфигурация | Нет | Нужен сервер | Встраивание агента |
| Язык тестов | YAML | Java/Python/JS | JS |
| Облачные устройства | Maestro Cloud | AWS Device Farm | Firebase |
| Кастомные жесты | Нет | Да | Да |
| Доступ к JS | Нет | Нет | Да |
Для стандартных CRUD-приложений Maestro выигрывает по скорости написания и поддержки.
| Сценарий | Срок (дни) | Сложность |
|---|---|---|
| 5–7 флоу (регистрация, каталог, заказ) | 3 | Низкая |
| Сложные многоэкранные сценарии | 5 | Средняя |
| Полный регресс (20+ флоу) | 10 | Высокая |
Ограничения, которые надо знать
Maestro не умеет в кастомные жесты: pinch, rotate, multi-touch. Для приложений с картами или галереей, где нужен зум — Appium или Detox. Нет прямого доступа к JavaScript-контексту (в отличие от Detox). Assertions ограничены видимостью (assertVisible, assertNotVisible). Проверить точное значение атрибута или координату элемента — нельзя.
Несмотря на это, для стандартных CRUD-приложений, маркетплейсов, сервисных приложений Maestro покрывает 80–90% нужных E2E-сценариев с минимальными затратами на поддержку.
Типичные ошибки новичков
- Использование текста, который меняется (дата, время). Лучше использовать testID.
- Забыли очистить состояние между тестами — используйте
clearState: true. - Неправильный appId — проверьте bundle ID или package name.
- Зависимость от порядка экранов — используйте
runFlowс авторизацией.
Что входит в работу под ключ
- Написание YAML-флоу для ключевых пользовательских сценариев
- Настройка переменных и переиспользуемых подфлоу
- Интеграция с CI (GitHub Actions / GitLab CI)
- Настройка запуска через Maestro Cloud или локальный эмулятор
- Документация по добавлению новых тестов
Сроки и стоимость
3–5 дней в зависимости от количества сценариев. 5–7 флоу для типичного CRUD-приложения — 3 дня. Сложные многоэкранные сценарии с переменными и вложенными флоу — 5 дней. Стоимость рассчитывается индивидуально. Оценим ваш проект за 1 день. Мы гарантируем качество: каждый тест проходит ревью и запускается на реальных устройствах.
Закажите разработку E2E-тестов — напишите нам, мы ответим в течение 2 часов. Получите консультацию по автоматизации регресса для вашего проекта.







