Мобильные приложения

Flutter — один код, два прогона и одно покрытие

У кроссплатформенного приложения один набор кейсов и две платформы исполнения — конфигурации прогона в QA Деск позволяют не заводить кейсы дважды, а отчёты flutter test приезжают тем же CLI после конвертации в JUnit.

Почему Flutter отдельная страница

Кроссплатформенность решает проблему разработки и создаёт проблему тестирования: один код надо проверить на двух платформах, а дефект часто воспроизводится только на одной. Если вести кейсы отдельно для Android и iOS, библиотека удваивается и расходится через месяц. Если вести один набор — нужен способ отметить, на какой платформе проверка прошла, а на какой упала.

В QA Деск это делается конфигурациями прогона: план один, прогонов — по одному на платформу, результат каждой строки фиксируется отдельно.

Отчёты flutter test

flutter test не пишет JUnit XML сам, но отдаёт машиночитаемый поток, который конвертируется одной командой:

dart pub global activate junitreport
flutter test --machine | tojunit --output build/junit/unit.xml

Интеграционные тесты (integration_test/) запускаются на устройстве или эмуляторе тем же способом с -d <device>. Для Android их можно гонять и как инструментальные тесты через Gradle — тогда JUnit XML появится в androidTest-results без конвертации.

Загрузка — по платформе, на которой прошёл запуск:

./qadesk-cli upload --run "App integration" --env stage --platform android \
  --build "$BUILD_NUMBER" build/junit

Ключ кейса в описании теста

testWidgets('QAD-C42 экран входа принимает верный пароль', (tester) async {
  await tester.pumpWidget(const App());
  // …
});

Ключ ищется в имени теста; для группы тестов (group()) он попадёт в classname — приём проверяет оба поля. Тесты без ключа не записываются и возвращаются поимённо.

Один план — две конфигурации

Заведите в проекте конфигурации {platform: Android, device: Pixel 8, os: 14} и {platform: iOS, device: iPhone 15, os: 17.5}. Старт плана по обеим создаст два прогона с одинаковым составом строк. Ручные проверки — жесты, клавиатура, системные диалоги разрешений, глубокие ссылки — выполняются на каждой платформе отдельно, а автотесты кладут результат в тот прогон, чья платформа указана в --platform.

Так дефект «на iOS не открывается ссылка из письма» лежит в прогоне iOS, а в прогоне Android та же строка зелёная — и это видно без раскопок. Дефект из строки наследует платформу, сборку, среду и конфигурацию; ссылка на прогон прикладывается сама, а задача разработчику ставится в Битрикс24 или SourceCraft из карточки. Краш в проде из Sentry становится дефектом без участия тестировщика — см. Sentry.

Что стоит проверять руками во Flutter-приложении

  • системные шрифты и масштаб текста — Flutter рендерит сам, и увеличенный шрифт в настройках телефона ломает вёрстку чаще, чем в нативных приложениях;
  • жест «назад» на Android и свайп на iOS — навигация одна, поведение платформ разное;
  • разрешения камеры, геолокации и уведомлений — диалоги системные, тексты и порядок запросов на платформах отличаются;
  • обновление с предыдущей версии с сохранением локальных данных — миграция локальной базы ломается чаще, чем кажется, и на обеих платформах по-разному.

Эти проверки одинаково нужны на обеих платформах, поэтому кейсы для них — общие, а результаты — по конфигурациям.

Чего в продукте нет

  • нет запуска тестов и фермы устройств — QA Деск принимает результаты;
  • нет хранения золотых скриншотов (golden файлы) — они остаются в репозитории;
  • нет видео больше 8 МБ во вложении дефекта.

С чего начать

  1. Добавьте tojunit в шаг тестов и выгрузку с when: always.
  2. Проставьте ключи кейсов у widget-тестов критичных экранов.
  3. Заведите две конфигурации и стартуйте план по обеим.
  4. Дефект из упавшей строки ставьте разработчику задачей в Битрикс24 или SourceCraft — из карточки, одним действием.

Попробуйте на своём проекте

Заведите проект, загрузите первый отчёт или заведите первый дефект — бесплатный тариф без карты. Нужно демо на ваших сценариях — напишите на hello@qadesk.ru.

Создать проект

Рядом по теме

Мобильные приложения

Android

Gradle пишет JUnit XML для каждого инструментального теста — QA Деск принимает его как есть и кладёт в покрытие рядом с ручными кейсами; конфигурации прогона превращают план в матрицу «устройство × версия ОС».

Android — отчёт с эмулятора и устройства, прогон по матрице
Мобильные приложения

iOS

Xcode складывает результаты в бандл xcresult, а QA Деск принимает JUnit XML — между ними один шаг конвертации в пайплайне; после него автотесты и ручные проверки на устройствах живут в одном покрытии.

iOS — результаты XCTest в покрытие, ручной регресс по версиям
Мобильные приложения

Appium

Appium — самый частый выбор для мобильных автотестов вне кода приложения; отчёт даёт тот раннер, из которого вы его запускаете, а QA Деск принимает JUnit или Allure и кладёт результат в прогон нужной платформы.

Appium — один драйвер, два прогона, честный отчёт