Ответ
Мой процесс проверки кода многослоен и включает как автоматические инструменты, так и ручные практики:
1. Статический анализ кода (до запуска)
- PHPStan / Psalm: Запускаю на максимальном уровне строгости, который позволяет проект. Они находят type errors, возможные null-исключения, недостижимый код.
vendor/bin/phpstan analyse --level=max src/ - Линтер (PHP_CodeSniffer): Слежу за соответствием стандартам кодирования (PSR-12).
2. Автоматическое тестирование
- Unit-тесты (PHPUnit): Пишу тесты для критической бизнес-логики, сервисов, утилит. Цель — изолированно проверить конкретный метод.
// Пример простого unit-теста public function test_calculator_adds_correctly(): void { $calc = new Calculator(); $this->assertEquals(5, $calc->add(2, 3)); $this->assertEquals(0, $calc->add(0, 0)); $this->assertEquals(-1, $calc->add(2, -3)); // Проверка edge case } - Feature-тесты (Laravel): Тестирую целые сценарии, например, регистрацию пользователя или создание заказа, эмулируя HTTP-запросы.
3. Ручное тестирование в локальном окружении
- После написания функционала прохожу по основным и альтернативным сценариям (happy path, edge cases, обработка ошибок) прямо в браузере или через API-клиент (Postman).
- Проверяю, что изменения не сломали существующий функционал (регрессионное тестирование).
4. Отладка (когда что-то идёт не так)
- Xdebug + IDE (PhpStorm): Основной инструмент для пошаговой отладки сложной логики.
- Логирование (Monolog): Добавляю контекстные логи в местах, где важно отследить состояние (
Log::info('Processing order', ['order_id' => $order->id])). - Для быстрой проверки в development-окружении иногда использую
dd()илиdump(), но никогда не оставляю их в коде для мержа.
5. Интеграция в CI/CD Все вышеперечисленные автоматические шаги (статика, тесты) запускаются в пайплайне GitLab CI/GitHub Actions при каждом пулл-реквесте. Мерж невозможен, если пайплайн не проходит.
Этот подход позволяет отловить большинство ошибок до того, как код попадёт даже на ревью, не говоря уже о production.