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

React Native — Jest и Detox в покрытие, платформы по конфигурациям

Jest с репортёром jest-junit покрывает и юнит-тесты, и e2e на Detox — оба отчёта приезжают в QA Деск одним CLI, а платформа задаётся в момент выгрузки, чтобы прогон Android и прогон iOS не смешивались.

Что общего с вебом и что нет

Команды 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 МБ на файл;
  • нет генерации автотестов из кейсов.

С чего начать

  1. Подключите jest-junit в оба конфига Jest.
  2. Проставьте ключи кейсов у e2e-сценариев входа и оплаты.
  3. Разведите выгрузку по платформам двумя заданиями.
  4. Заведите конфигурации и стартуйте план по обеим перед релизом.

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

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

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

Рядом по теме

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

Android

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

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

iOS

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

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

Appium

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

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