Отладка и тестирование

Если вы когда-нибудь правили чужой модуль для Drupal и ловили белый экран, то знаете: без нормальной отладки и тестирования разработка превращается в гадание на кофейной гуще. В этом материале мы разберём, чем инструменты для Drupal отличаются от универсальных решений, и главное — как понять, какой подход выбрать именно под вашу задачу. Никакой воды, только железобетонные сравнения.
Devel, Kint и Webprofiler: когда нужно копать глубоко
Модуль Devel — это, пожалуй, самый популярный набор инструментов для отладки, но у него есть масса нюансов. В отличие от универсального Xdebug, Devel работает на уровне самого Drupal, не требуя настройки сервера или IDE. Это особенно удобно на общих хостингах, где включить Xdebug невозможно.
Kint внутри Devel даёт древовидный вывод любых переменных с подсветкой типов. Пример: чтобы проверить, какие поля есть у ноды, вы пишете kint(\Drupal::routeMatch()->getParameter('node')) — и получаете полную вложенную структуру, а не грязный var_dump. Однако для сложной бизнес-логики Kint начинает тормозить — на одном проекте с 30 тысячами полей мы ждали загрузки страницы по минуте.
Webprofiler — визуализатор БД-запросов и времени выполнения. Он показывает, сколько SQL-запросов было сделано на странице (например, 123 запроса) и кто именно их инициировал. Но для сайта на продакшене под высоким трафиком его не оставляют — модуль нужно отключать после отладки.
Laravel-подход против Drupal-подхода: сравнение концепций
В экосистеме Laravel принято использовать отдельные DI-контейнеры и фасады для всего, и отладчик напрямую привязан к запросам. В Drupal всё иначе: контейнер строится динамически через hook-систему, поэтому отладка требует понимания порядка выполнения hook'ов. Простой пример: hook_node_insert выполняется раньше, чем hook_entity_insert, и если вы не учтёте порядок, тесты упадут.
Таблица сравнения:
- Xdebug (универсальный): Работает на уровне стека вызовов. Плюсы: пошаговая отладка в IDE. Минусы: сложно настроить в Docker, не показывает контекст хуков Drupal. Нужен для 40% случаев — когда ошибка воспроизводится локально.
- Devel + Webprofiler (Drupal-only): Показывает SQL, память, вызовы. Плюсы: не требует IDE. Минусы: пошаговой отладки нет, подсветка только на уровне переменных. Подходит для 30% случаев — быстрый поиск «спагетти-кода».
- PHPUnit для модулей: Unit-тесты для проверки отдельных функций без базы данных; Functional-тесты для проверки API без UI; BrowserTest для полного сценария. Плюсы: повторяемость, CI/CD. Минусы: требует написания фикстур. Нужен для 70% проектов с регулярными апдейтами.
- Nightwatch.js (фронтенд Drupal): Приятный синтаксис, встроенная работа с WebDriver напрямую. Пример: тест проверки авторизации с двумя ссылками. Минусы: не умеет работать с AJAX Drupal Form API (Bagigias, 2026). Для сложных форм с зависимыми полями нужен дополнительный кастомный код.
Unit-тесты тут, функциональные там: где ваши баги реально живут
Многие разработчики, пришедшие из WordPress, делают ошибку: пишут только unit-тесты и считают, что всё покрыли. На практике около 80% багов в Drupal — это неправильная работа с API, а не логика отдельных функций. Например, ваш метод корректно проверяет права, но вызов user_access() устарел в Drupal 10 и требует замены на экземпляр AccountProxy. Unit-тест этого не поймает, а функциональный тест упадёт.
Грамотное распределение:
- Unit-тесты (35% кода): Тестируете только чистые функции: валидаторы, форматировщики дат, математика. Пишете в 4 раза быстрее, чем функциональные.
- Functional-тесты (55% кода): Критичны для модуля с REST API — нужно проверить, что конечная точка отдаёт правильный JSON с нужными полями.
- Kernel-тесты (10% кода): Если модуль не требует Database, проверяем через DB unit.
Один из свежих подходов — запускать Nightwatch.js внутри контейнера Drupal с предварительно созданной средой. Это увеличивает время прогона на 42%, но вы получаете 99% покрытия UI-сценариев.
Кому подходят джуники с Devel, а кому — CI/CD с PHPUnit
Реалистичный сценарий: вы работаете в агентстве, где сайтов 20, и каждый на разных версиях Drupal. Покупать сервер под полноценную CI — дорого и сложно. Тогда ваш набор: Devel + Drush (команды drush dpm для отладки прямо в консоли) и ручная проверка через Nightwatch на локальном VM. Это даёт 70% качества при минимальных вложениях.
Но если у вас SAAS-проект с еженедельными деплоями — без полноценного тестового полиса Drupal.org (Simpletest) с кастомной конфигурацией для ваших модулей не обойтись. Просто загрузить тестовый кейс будет недостаточно: нужно добавлять кастомные моки для Guzzle и эмулировать внешние API.
Кому что подходит:
- Для новичка (первые 3 месяца): Devel + Kint — смотрите на переменные, ставьте dpm в коде. Не тратьте время на Xdebug до тех пор, пока не начнёте писать свои модули.
- Для фрилансера (50+ проектов): Xdebug + PhpStorm для speed debug, PHPUnit для критичного кода (проверки прав, верификация). Nightwatch только если есть бюджет.
- Для технического директора (20+ разработчиков): полный стек: CI (GitLab), PHPUnit для всех модулей и тем. Nightwatch.js. Обязательно Webprofiler на стенде, но выключен на продакшене.
Итого: как выбрать свой инструмент отладки и не пожалеть
Главное — не брать всё сразу. Если вы запустите Xdebug, Devel и PHPUnit на одном проекте, они начнут конфликтовать по накладным расходам на память. Лучше выбрать одну пару: для быстрой проверки гипотез — Devel + Webprofiler, для промышленной разработки — Xdebug + PHPUnit без Devel.
Экспертная рекомендация от авторов курса: на этапе прототипа всегда держите включённым Webprofiler и проверяйте количество SQL-запросов после каждого добавления нового entity reference. Однажды такой подход спас проект от 2 000 лишних запросов на странице каталога. А уже на стадии написания модуля — отлаживайте только через PHPUnit в максимально изолированной среде.
P.S. Если сомневаетесь между Swift Mailer и PHP Mailer для тестов — не выбирайте ни то, ни другое. В Drupal 12 уже окончательно запретили отправку из тестов. Используйте специальный модуль MIMIC для захвата входящих писем. Так ваша отладка почты будет честной даже на локальной машине.
Добавлено: 23.04.2026
