Продвинутое тестирование и отладка
Концепции тестирования
- Важность тестирования: Обеспечивает надёжность кода, предотвращает регрессии, документирует поведение и способствует лучшему архитектурному проектированию.
- Модульные тесты (Unit Tests): Тестирование отдельных компонентов в изоляции. Стандартный инструмент: PHPUnit.
- Интеграционные тесты (Integration Tests): Тестирование взаимодействия различных модулей между собой.
- Функциональные тесты (Feature Tests): Тестирование полных пользовательских сценариев или API-эндпоинтов от начала до конца.
- TDD (Test-Driven Development): Цикл Red-Green-Refactor. Тесты пишутся до кода.
- BDD (Behavior-Driven Development): Фокусируется на поведении приложения с точки зрения пользователя (часто используется синтаксис «Given, When, Then»).
- Мутационное тестирование (Mutational Testing): Изменение частей кода (мутации) для проверки, упадут ли тесты. Если нет — набор тестов слабый. Инструменты: Infection для PHP.
Покрытие кода и статический анализ
- Покрытие кода (Code Coverage): Метрика, измеряющая процент кода, выполняемого тестами.
- Измерение: Отслеживается с помощью драйверов Xdebug или PCOV.
- Методы: Line Coverage, Branch Coverage, Path Coverage.
- Статический анализ: Анализ кода без его выполнения для поиска ошибок и проблем со стилем.
- Инструменты: PHPStan, Psalm, PHP_CodeSniffer (PHPCS).
Продвинутое мокирование (PHPUnit)
- Моки vs стабы: Стабы возвращают фиксированные значения; моки ожидают определённых взаимодействий.
- Мокирование статических методов: Используйте Mockery или
createMock()из PHPUnit для некоторых случаев. Статические методы сложно мокировать, что часто указывает на необходимость рефакторинга. - Мокирование final-классов/методов: Напрямую невозможно в PHPUnit. Решения включают DG/Bypass-Finals или использование интерфейсов.
- Мокирование внутренних объектов: Рефакторинг с использованием Dependency Injection (внедрение зависимости) или применение паттерна Factory.
- Мокирование внешних API:
- Используйте Guzzle Mock Handler.
- Используйте локальный мок-сервер или сервис вроде WireMock.
Отладка: 9 незаменимых правил
Эти правила основаны на книге Дэвида Агганса «Debugging»:
- Пойми систему: Прочитай документацию, пойми, как она работает.
- Воспроизведи ошибку: Воспроизведи баг стабильно.
- Перестань гадать — смотри: Наблюдай за фактическим состоянием, не пол агайся на догадки.
- Разделяй и властвуй: Сузь область, в которой может быть баг.
- Меняй по одной вещи за раз: Изоляция переменных — ключевой принцип.
- Веди журнал аудита: Записывай, что ты пробовал и что обнаружил.
- Проверь розетку: Убедись в базовых вещах (окружение, конфигурация).
- Посмотри свежим взглядом: Попроси коллегу о помощи (метод «резиновой уточки»).
- Если ты не починил — значит, не починил: Проверь исправление несколько раз.