Перейти к основному содержимому

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

Концепции тестирования​

  • Важность тестирования: Обеспечивает надёжность кода, предотвращает регрессии, документирует поведение и способствует лучшему архитектурному проектированию.
  • Модульные тесты (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:
    1. Используйте Guzzle Mock Handler.
    2. Используйте локальный мок-сервер или сервис вроде WireMock.

Отладка: 9 незаменимых правил​

Эти правила основаны на книге Дэвида Агганса «Debugging»:

  1. Пойми систему: Прочитай документацию, пойми, как она работает.
  2. Воспроизведи ошибку: Воспроизведи баг стабильно.
  3. Перестань гадать — смотри: Наблюдай за фактическим состоянием, не полагайся на догадки.
  4. Разделяй и властвуй: Сузь область, в которой может быть баг.
  5. Меняй по одной вещи за раз: Изоляция переменных — ключевой принцип.
  6. Веди журнал аудита: Записывай, что ты пробовал и что обнаружил.
  7. Проверь розетку: Убедись в базовых вещах (окружение, конфигурация).
  8. Посмотри свежим взглядом: Попроси коллегу о помощи (метод «резиновой уточки»).
  9. Если ты не починил — значит, не починил: Проверь исправление несколько раз.