Что общего с вебом и что нет
Команды React Native обычно приходят из веба и приносят Jest. Хорошая новость: отчёты у Jest уже готовы для тест-менеджмента, репортёр jest-junit даёт JUnit XML и для юнит-тестов, и для e2e на Detox. Плохая новость та же, что у любого мобильного приложения: результат зависит от платформы, а кейсы дублировать нельзя.
QA Деск разводит платформы конфигурациями прогона, а не копиями кейсов.
Репортёр
// jest.config.js
module.exports = {
reporters: [
'default',
['jest-junit', { outputDirectory: 'reports', outputName: 'junit.xml',
classNameTemplate: '{classname}', titleTemplate: '{title}' }],
],
};
Для Detox тот же репортёр подключается в e2e/jest.config.js. Ключ кейса — в описании теста:
it('QAD-C42 вход с верным паролем открывает главный экран', async () => {
await element(by.id('login')).typeText('user');
// …
});
Приём ищет ключ в имени теста, затем в classname. Без ключа результат не записывается и возвращается поимённо — так видно, где разметка ещё не проставлена.
Выгрузка по платформам
Detox запускается отдельно под каждую платформу, и выгружать отчёты стоит отдельно, с правильным --platform:
e2e-android:
script:
- detox test -c android.emu.release
- ./qadesk-cli upload --run "App e2e" --env stage --platform android --build "$BUILD" reports
when: always
e2e-ios:
script:
- detox test -c ios.sim.release
- ./qadesk-cli upload --run "App e2e" --env stage --platform ios --build "$BUILD" reports
when: always
Два задания — два прогона одного плана: в каждом видно, что прошло именно на этой платформе. Повтор задания второй прогон не создаёт.
Параллельные запуски и ретраи Detox подчиняются общим правилам приёма: разные шарды одного пайплайна — разное содержимое под одним ключом, поэтому у каждого свой --attempt или --ci-run-id; одинаковый ключ с другим отчётом получит отказ, а не тихую перезапись. Кейс, встретившийся дважды, получает худший из исходов — ретраи не красят прогон зелёным.
Ручные проверки, которые не закрывает Detox
- поведение при обновлении JS-бандла (OTA через CodePush или аналог) без переустановки приложения;
- нативные модули: камера, биометрия, платежи — то, что в симуляторе или не работает, или работает не так;
- жест «назад» и системная навигация на Android;
- масштаб шрифта и тёмная тема — стили в RN не наследуют системные настройки автоматически.
Для них заводятся кейсы в общей библиотеке и прогоняются по конфигурациям {platform: Android, …} и {platform: iOS, …}. Библиотека при этом одна: кейс «оплата картой» существует в единственном экземпляре, а его результаты на двух платформах лежат в двух прогонах одного плана. Когда сценарий закрывается автотестом Detox, ручная строка не удаляется — она начинает получать результат из отчёта, и история кейса не рвётся.
Время исполнения считается по строкам, поэтому руководитель видит, во что обходится ручной регресс на двух платформах, и может решать, что автоматизировать первым, по цифрам, а не по ощущениям.
Дефект
Из упавшей строки дефект наследует платформу, сборку, среду и конфигурацию; ссылка на прогон прикладывается. Скриншот из Detox (artifacts/) прикладывается вложением. Краш в проде из Sentry становится дефектом без рук — Sentry. Задача разработчику — в Битрикс24 или SourceCraft из карточки.
Чего в продукте нет
- нет запуска тестов и фермы устройств;
- нет хранения артефактов Detox — видео и логи остаются в CI, в дефект прикладывается то, что выбрал человек, до 8 МБ на файл;
- нет генерации автотестов из кейсов.
С чего начать
- Подключите
jest-junitв оба конфига Jest. - Проставьте ключи кейсов у e2e-сценариев входа и оплаты.
- Разведите выгрузку по платформам двумя заданиями.
- Заведите конфигурации и стартуйте план по обеим перед релизом.
Попробуйте на своём проекте
Заведите проект, загрузите первый отчёт или заведите первый дефект — бесплатный тариф без карты. Нужно демо на ваших сценариях — напишите на hello@qadesk.ru.
Создать проектРядом по теме
Android
Gradle пишет JUnit XML для каждого инструментального теста — QA Деск принимает его как есть и кладёт в покрытие рядом с ручными кейсами; конфигурации прогона превращают план в матрицу «устройство × версия ОС».
Android — отчёт с эмулятора и устройства, прогон по матрицеiOS
Xcode складывает результаты в бандл xcresult, а QA Деск принимает JUnit XML — между ними один шаг конвертации в пайплайне; после него автотесты и ручные проверки на устройствах живут в одном покрытии.
iOS — результаты XCTest в покрытие, ручной регресс по версиямAppium
Appium — самый частый выбор для мобильных автотестов вне кода приложения; отчёт даёт тот раннер, из которого вы его запускаете, а QA Деск принимает JUnit или Allure и кладёт результат в прогон нужной платформы.
Appium — один драйвер, два прогона, честный отчёт