Что обычно болит
В 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 в раннере; - нет автоматического заведения дефекта на каждый упавший тест: дефект заводит человек, иначе трекер за неделю превращается в свалку флаки-тестов.
С чего начать
- Выпустите токен приёма на проект: Настройки → Интеграции → CI / автотесты.
- Добавьте
--log-junitв команду тестов и шаг выгрузки в пайплайн. - Проставьте ключи кейсов у десяти самых важных тестов — остальные пока приедут как несматченные, это нормально.
- Заведите тест-план на ручную часть релиза и проведите один прогон — дальше сравнивать будет с чем.
Попробуйте на своём проекте
Заведите проект, загрузите первый отчёт или заведите первый дефект — бесплатный тариф без карты. Нужно демо на ваших сценариях — напишите на hello@qadesk.ru.
Создать проектРядом по теме
Symfony
Отчёты PHPUnit, Behat и Panther приезжают в один прогон, сценарии на Gherkin ложатся рядом с ручными кейсами, а дефект несёт окружение, сборку и ссылку на упавший шаг.
Symfony — регресс, который видно целикомJUnit XML
Своего формата у QA Деск нет: подойдёт JUnit XML, который ваш раннер уже пишет. Один запрос из пайплайна — и отчёт становится прогоном с историей, покрытием и дефектами.
JUnit XML — формат, который умеет писать всёSentry
Ошибка уровня error или fatal становится дефектом выбранного проекта — с типом исключения, местом и ссылкой на issue. Одна ошибка — один дефект, повторные срабатывания дублей не плодят.
Sentry — ошибка у пользователя приходит дефектом