Почему Playwright
Браузерный автотест не зависит от того, на чём написан бэкенд. Портал на Битрикс24, конфигурация 1С в веб-клиенте, Laravel-админка, SPA на React — для Playwright это одинаковые страницы. Поэтому в разнородном портфеле проектов он окупается быстрее прочего: одна технология автотестов на все продукты сразу.
QA Деск тесты не запускает. Он принимает результат и делает из него то, чего у отчёта в CI нет: историю, покрытие вместе с ручными кейсами и дефект с контекстом.
Настройка репортёра
Playwright умеет писать JUnit XML из коробки:
// playwright.config.ts
export default defineConfig({
reporter: [
['list'],
['junit', { outputFile: 'reports/junit.xml' }],
],
});
Если в команде принят Allure, подойдёт allure-playwright — приём поддерживает оба формата, выбирать по удобству, а не по нашим требованиям.
Ключ кейса
Результат ложится в строку покрытия только через ключ кейса вида QAD-C17. Проще всего держать его в имени теста:
test('QAD-C17 вход с верным паролем', async ({ page }) => {
await page.goto('/login');
// …
});
Приоритет источников для JUnit: property с именем qadesk.case, затем имя теста, затем classname. Для Allure — label qadesk_case, затем fullName, затем name. Регистр не важен: qad-c17 в имени будет распознан. Ключ дефекта (QAD-17) с ключом кейса (QAD-C17) не пересекается — буква C их разводит.
Тесты без ключа не записываются и возвращаются поимённо с причиной. Это осознанно: тихо принять 162 результата и записать восемь — самый неприятный вид зелёного.
Выгрузка из пайплайна
report:
stage: test
when: always # отчёт нужен именно тогда, когда тесты упали
script:
- curl -fsSL https://qadesk.ru/cli/qadesk-cli-linux-amd64 -o qadesk-cli && chmod +x qadesk-cli
- ./qadesk-cli upload --run "$CI_PROJECT_NAME e2e" --env stage --platform web ./reports
QADESK_TOKEN — токен приёма проекта (qdit_…), только из переменных окружения: флагом утилита его не принимает, чтобы он не попал в лог CI.
Код выхода утилиты честный и отвечает за доставку, а не за тесты: 0 — отчёт принят, 1 — не дошёл, 2 — ошибка данных, 3 — только с --strict, если часть тестов не легла в прогон. Гейт «релизить или нет» остаётся за вашим пайплайном.
Шарды, ретраи и повторы
Playwright часто гоняют шардами и с ретраями. Три правила, которые стоит знать заранее:
- приём идемпотентен по паре «прогон CI + попытка»: перезапуск задания не создаёт второй прогон;
- разные шарды одного пайплайна — это разное содержимое под одним ключом, поэтому задайте каждому свой
--attemptили свой--ci-run-id; одинаковый ключ с другим отчётом получит отказ, а не тихую перезапись; - если один кейс встретился дважды (ретрай прошёл со второго раза), в прогон попадает худший исход. Иначе ретраи красили бы прогон зелёным.
Что дальше в деске
Из упавшего результата заводится дефект: окружение, платформа и сборка — поля, к дефекту прикладывается ссылка на прогон. Дальше он идёт по воркфлоу из восьми статусов с проверкой переходов на сервере, а разработке задача ставится в Битрикс24 или SourceCraft — там, где команда уже живёт.
Чего в продукте нет
- нет запуска тестов и своих раннеров — QA Деск не заменяет CI;
- нет хранения трейсов и видео Playwright: они остаются артефактами сборки, в дефект прикладывается то, что приложил человек;
- нет генерации автотестов из кейсов.
С чего начать
- Включите репортёр
junitрядом с тем, что уже настроено. - Проставьте ключи кейсов у пяти-десяти самых важных сценариев.
- Добавьте шаг выгрузки с
when: always— см. GitLab CI или SourceCraft CI. - Посмотрите список несматченных в выводе первого запуска: он честно покажет, где разметка ещё не проставлена.
Попробуйте на своём проекте
Заведите проект, загрузите первый отчёт или заведите первый дефект — бесплатный тариф без карты. Нужно демо на ваших сценариях — напишите на hello@qadesk.ru.
Создать проектРядом по теме
React / Vue
Отчёты Vitest, Jest, Playwright или Cypress становятся прогоном в одном проекте с бэкендом, а не отдельной вкладкой CI, и упавший сценарий превращается в дефект со сборкой и окружением.
React и Vue — фронтенд-прогон рядом с бэкендомJUnit XML
Своего формата у QA Деск нет: подойдёт JUnit XML, который ваш раннер уже пишет. Один запрос из пайплайна — и отчёт становится прогоном с историей, покрытием и дефектами.
JUnit XML — формат, который умеет писать всёAllure
Каталог allure-results уезжает в QA Деск одним шагом. Отличие от отчёта-артефакта в том, что прогон остаётся: с историей, покрытием вместе с ручными кейсами и дефектами из упавших шагов.
Allure — результаты, которые не пропадают вместе со сборкой