Разработка E2E-тестов для мобильного приложения (Maestro)
Maestro — самый молодой из E2E-инструментов для мобильных приложений, но уже занял нишу благодаря одному качеству: тесты пишутся на YAML, запускаются одной командой, и не требуют настройки Appium-сервера, XCUITest-раннера или встраивания агента в приложение. Это black-box тестирование в чистом виде — инструмент общается с устройством через Accessibility API и не знает ничего о внутренней архитектуре приложения.
YAML-сценарии: просто, но есть нюансы
Минимальный флоу авторизации:
appId: com.example.myapp
---
- launchApp:
clearState: true
- tapOn: "Email"
- inputText: "[email protected]"
- tapOn: "Пароль"
- inputText: "password123"
- tapOn: "Войти"
- assertVisible: "Главная"
tapOn ищет элемент по тексту, accessibilityLabel, testID или id. Порядок поиска — слева направо в иерархии Accessibility. Если на экране два элемента с одинаковым текстом — Maestro нажмёт на первый, что может быть не то, что нужно. В таких случаях используем tapOn с уточнением:
- tapOn:
text: "Добавить"
index: 1 # второй элемент с этим текстом
Или через id:
- tapOn:
id: "add_to_cart_button"
Важно: id на Android — это resource-id (com.example.app:id/add_to_cart_button), на iOS — accessibilityIdentifier. Maestro автоматически определяет платформу.
Переменные и подфлоу
Maestro поддерживает переменные и вызов вложенных флоу — без этого большие тест-сьюты превращаются в копипасту:
# 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: "Оформление заказа"
runFlow позволяет собирать сложные сценарии из переиспользуемых блоков. Переменные через env переопределяются при запуске: maestro test --env [email protected].
Запуск: локально и в CI
Локальный запуск без лишних настроек — главное преимущество Maestro:
# Установка
curl -Ls "https://get.maestro.mobile.dev" | bash
# Запуск одного теста
maestro test flows/login_test.yaml
# Запуск всей директории
maestro test flows/
# Режим студии (UI с предпросмотром)
maestro studio
maestro studio запускает браузерный UI, который показывает иерархию Accessibility в реальном времени и позволяет интерактивно выбирать элементы. Для написания тестов — быстрее, чем ручной подбор локаторов.
Maestro Cloud
Для CI без собственных устройств — Maestro Cloud (платный сервис от создателей):
maestro cloud --apiKey $MAESTRO_CLOUD_API_KEY flows/
Загружает приложение и флоу-файлы, запускает на реальных устройствах в облаке, возвращает отчёт со скриншотами. Интеграция с 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 Cloud) — локальный эмулятор + обычный maestro test в pipeline.
Ограничения, которые надо знать
Maestro не умеет в кастомные жесты: pinch, rotate, multi-touch. Для приложений с картами или галереей, где нужен зум — Appium или Detox.
Нет прямого доступа к JavaScript-контексту (в отличие от Detox). Если нужно проверить состояние Redux store или вызвать метод — не получится без обходных путей (например, через deep link с тест-командой).
Assertions ограничены видимостью (assertVisible, assertNotVisible) и наличием текста. Проверить точное значение атрибута или координату элемента — нельзя.
Несмотря на это, для стандартных CRUD-приложений, маркетплейсов, сервисных приложений Maestro покрывает 80–90% нужных E2E-сценариев с минимальными затратами на поддержку.
Что входит в работу
- Написание YAML-флоу для ключевых пользовательских сценариев
- Настройка переменных и переиспользуемых подфлоу
- Интеграция с CI (GitHub Actions / GitLab CI)
- Настройка запуска через Maestro Cloud или локальный эмулятор
- Документация по добавлению новых тестов
Сроки
3–5 дней в зависимости от количества сценариев. 5–7 флоу для типичного CRUD-приложения — 3 дня. Сложные многоэкранные сценарии с переменными и вложенными флоу — 5 дней. Стоимость рассчитывается индивидуально.







