Почему 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 МБ во вложении дефекта.
С чего начать
- Добавьте
tojunitв шаг тестов и выгрузку сwhen: always. - Проставьте ключи кейсов у widget-тестов критичных экранов.
- Заведите две конфигурации и стартуйте план по обеим.
- Дефект из упавшей строки ставьте разработчику задачей в Битрикс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 — один драйвер, два прогона, честный отчёт