Что обычно болит
Symfony-проекты часто живут дольше своих команд: несколько бандлов, унаследованные интеграции, миграции, которые никто не рискует трогать. Тесты в таком проекте обычно есть — и функциональные на PHPUnit, и сценарии на Behat, — но результат каждого прогона остаётся внутри CI. Через полгода никто не скажет, какие бизнес-сценарии реально покрыты, а какие проверяются «на глаз» перед релизом.
Отдельная боль — приёмка. Заказчик хочет видеть, что проверено по функциональности, а не список из 900 зелёных юнитов.
Что даёт QA Деск
Сценарий на Gherkin и ручной кейс — в одной таблице. Behat умеет писать JUnit XML; отчёт превращается в прогон, где сценарий занимает ту же строку, что и ручная проверка с тем же ключом кейса.
Тест-план на релиз. Набор кейсов на приёмку собирается планом, прогон показывает статус каждой проверки, время и исполнителя. Это то, что можно показать заказчику, не пересказывая CI.
Дефект с контекстом. Окружение, платформа и сборка — поля, а не текст: видно, что упало именно на стейдже после свежей миграции.
Воркфлоу вместо переписки. Встроенный баг-трекинг: восемь статусов, переходы проверяются на сервере, история действий сохраняется. Внешний трекер не обязателен, но задачу разработке можно завести из карточки дефекта — например, в SourceCraft, и получить обратно статус задачи и закрывший её пул-реквест.
Рецепт: отчёты в прогон
# функциональные тесты
php bin/phpunit --log-junit reports/junit.xml
# сценарии Behat в том же каталоге
vendor/bin/behat --format junit --out reports
Оба отчёта лежат в одном каталоге — утилита склеит несколько XML-файлов в один прогон:
QADESK_TOKEN=qdit_… qadesk-cli upload --run "release regress" --env stage ./reports
Браузерные проверки на Panther пишут тот же PHPUnit-отчёт, поэтому отдельная настройка им не нужна. Если удобнее Playwright — приём от этого не меняется.
Ключ кейса в сценарии Behat
Ключ ставится прямо в заголовке сценария — так он попадёт в имя теста в отчёте:
Сценарий: QAD-C24 оформление подписки с истёкшей картой
Дано пользователь с истёкшей картой
Когда он продлевает подписку
Тогда он видит сообщение об отказе банка
Приоритет источников ключа: property qadesk.case, имя теста, класс. Несматченные результаты не записываются и печатаются поимённо — молчаливая потеря половины отчёта была бы хуже, чем честный список.
Что взять готовым
Тест-кейсы регистрации и авторизации — то место, где в Symfony-проектах с самописной security-конфигурацией регулярно находится лишнее: не инвалидируется сессия, не ограничиваются попытки, восстановление пароля работает по старой ссылке.
Приёмка, которую можно показать
Тест-план на релиз собирается из кейсов и проходится прогоном: по каждой проверке видно статус, исполнителя и время, а по упавшим — заведённые дефекты. Это документ приёмки, который формируется сам, а не пишется отдельно вечером перед сдачей.
Чего в продукте нет
- готового бандла или рецепта Flex нет — приём работает по HTTP, утилите не нужен PHP;
- QA Деск не читает ваш
phpunit.xml.distи не знает про группы тестов — связь между тестом и кейсом одна: ключ; - нет двусторонней синхронизации с Jira и Яндекс Трекером: они в дорожной карте, сегодня есть встроенный трекер, Битрикс24 и SourceCraft.
С чего начать
- Выберите десять сценариев, которые действительно решают, поедет релиз или нет, и заведите их кейсами.
- Проставьте их ключи в заголовках Behat-сценариев и в именах функциональных тестов.
- Добавьте шаг выгрузки в пайплайн — см. GitLab CI или SourceCraft CI.
- Соберите тест-план приёмки и проведите первый прогон вручную: дальше часть его строк начнёт закрываться автоматически.
Попробуйте на своём проекте
Заведите проект, загрузите первый отчёт или заведите первый дефект — бесплатный тариф без карты. Нужно демо на ваших сценариях — напишите на hello@qadesk.ru.
Создать проектРядом по теме
Laravel
Отчёт PHPUnit или Pest уезжает в QA Деск одним шагом пайплайна и превращается в прогон, где автотесты лежат в одной таблице с ручными проверками, а не в отдельной вкладке CI.
Laravel — отчёт Pest или PHPUnit становится прогономJUnit XML
Своего формата у QA Деск нет: подойдёт JUnit XML, который ваш раннер уже пишет. Один запрос из пайплайна — и отчёт становится прогоном с историей, покрытием и дефектами.
JUnit XML — формат, который умеет писать всёGitLab CI
Отчёт из GitLab CI уезжает в QA Деск шагом в пять строк: токен проекта в masked-переменной, ключ идемпотентности утилита берёт из CI_PIPELINE_ID сама.
GitLab CI — один шаг в пайплайне, прогон в деске