Платформы

Laravel — отчёт Pest или PHPUnit становится прогоном

Отчёт PHPUnit или Pest уезжает в QA Деск одним шагом пайплайна и превращается в прогон, где автотесты лежат в одной таблице с ручными проверками, а не в отдельной вкладке CI.

Что обычно болит

В Laravel-проекте с автотестами дела обычно неплохи: php artisan test зелёный, покрытие растёт. Проблема начинается там, где у продукта появляется ручная часть — админка, оплата, интеграции с внешними сервисами, — и ответ на вопрос «что мы вообще проверили перед релизом» приходится собирать из трёх мест: вкладки CI, чата с тестировщиком и памяти тимлида.

Второе — судьба упавшего теста. Он мигает красным в пайплайне неделю, потому что «известно, что флакает», и в этот момент CI перестаёт быть источником правды.

Что даёт QA Деск

Одно покрытие на ручное и автоматическое. Результат автотеста ложится в ту же строку, что и ручной кейс, если тест помечен ключом кейса. Покрытие считается по всему, что проверено, а не отдельно «руками» и отдельно «машиной».

Прогон, а не лог. Загруженный отчёт становится прогоном: видно, сколько пройдено, сколько упало, что пропущено, и из упавшего результата заводится дефект — с окружением, сборкой и ссылкой на прогон.

Перезапуск джобы не портит цифры. Приём идемпотентен по ключу «прогон CI + попытка»: перезапустили задание — второго прогона не появится, дашборд не удвоится.

Зелёный дубль не прячет красный. Если один кейс встретился в отчёте дважды, побеждает худший исход.

Ошибки прода — в дефекты. sentry-laravel уже стоит у половины команд; ошибка уровня error или fatal становится дефектом со ссылкой на issue и типом исключения. См. Sentry.

Рецепт: отчёт в QA Деск за десять минут

PHPUnit и Pest умеют писать JUnit XML из коробки — ничего доустанавливать не нужно.

# PHPUnit
vendor/bin/phpunit --log-junit reports/junit.xml

# Pest
vendor/bin/pest --log-junit reports/junit.xml

Шаг пайплайна (пример для GitLab CI; QADESK_TOKEN — токен приёма проекта, masked-переменная):

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 tests" --env test ./reports

Ключ идемпотентности утилита возьмёт из CI_PIPELINE_ID сама. Без утилиты работает тот же приём одним curl — см. JUnit XML.

Как пометить тест ключом кейса

Ключ вида QAD-C17 — это идентификатор кейса в вашем проекте. Три способа, в порядке приоритета: property qadesk.case в отчёте, имя теста, класс теста. В Pest проще всего держать ключ в описании:

it('QAD-C17 не пускает с неверным паролем', function () {
    $this->post('/login', ['email' => 'a@b.c', 'password' => 'wrong'])
         ->assertSessionHasErrors();
});

Тесты без ключа не пропадают тихо: они возвращаются списком с причиной (no_key) и не записываются в прогон. Это сознательное решение — «принято 162, записано 8» без объяснений было бы худшей формой зелёного.

Что взять готовым

Пакет тест-кейсов регистрации и авторизации закрывает то, что в Laravel-проектах чаще всего покрыто хуже всего: восстановление пароля, повторная регистрация, выход со всех устройств, ограничение попыток. Добавляется в проект из каталога и правится под ваш продукт.

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

  • QA Деск не запускает ваши тесты и не хранит артефакты сборки — он про результат и про то, что вокруг него;
  • пакета для Composer нет: утилита qadesk-cli — один статический бинарник, ей не нужен PHP в раннере;
  • нет автоматического заведения дефекта на каждый упавший тест: дефект заводит человек, иначе трекер за неделю превращается в свалку флаки-тестов.

С чего начать

  1. Выпустите токен приёма на проект: Настройки → Интеграции → CI / автотесты.
  2. Добавьте --log-junit в команду тестов и шаг выгрузки в пайплайн.
  3. Проставьте ключи кейсов у десяти самых важных тестов — остальные пока приедут как несматченные, это нормально.
  4. Заведите тест-план на ручную часть релиза и проведите один прогон — дальше сравнивать будет с чем.

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

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

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