- Теоретические основы тестирования
- Зачем необходимо тестирование?
- Какие виды тестирования бывают?
- Чем юнит-тестирование отличается от других видов тестирования?
- Кто и как должен тестировать продукт?
- Библиотеки для тестирования
- PHPUnit
- Базовые команды
- Фикстуры (Fixtures)
- Бутстрап (bootstrap.php)
- Утверждения (Asserts)
- Создания конфигов (phpunit.xml)
- Code coverage
- Mockery
- Стабы/Моки/Шпионы
- Частичные моки
- Моки для типов данных
- Абстрактные классы
- Hard dependencies
- Тестирования WordPress: Brain Monkey или WP_Mock
- Моки для WordPress функций
- Замена глобальных переменных
- Function Mockery для тестирования функций PHP
- Тестирование php-функций
- Создание patchwork.json
- PHPUnit
- Проблемы с тестированием:
- Слишком большие юниты
- Hard Dependency
- Контроль тестов
- Continuous Integration
Теоретические основы тестирования
Чтобы куда-то идти, нужно понять, зачем это делать.
Тесты нужны для долгосрочных проектов, в которых постоянно меняется бизнес-логика, работает большая команда, продукт уже вышел на стадию окупаемости и в целом может выделять деньги, на дополнительную проверку кода.
Про цели, виды и преимущества автоматизированного тестирования я уже писал в статье: Автоматизиция тестирования. Довольно скучный, но в тоже время очень важный этап.
Библиотеки для тестирования
Необходимо изучить набор библиотек для ускорения написания тестов. Зачем изобретать велосипед, если за вас уже все придумали?
PHPUnit
Конечно же основой для написания юнит тестов в PHP будет библиотека PHPUnit, на изучения ее уйдет достаточно много времени, а самое страшное, что примеры из документации не дают ответов, а вызывают еще больше вопросов, ведь код на реальных проектах намного сложнее. Читайте быстрый обзор самых важных вещей в PHPUnit.
Mockery
В современных реалиях невозможно представить большой проект в PHP без использования объектно-ориентированной парадигмы. Объекты взаимодействуют между собой, а программисту нужно как-то умело управлять этой большой оргией. В модульном тестировании же, нам нужно выдернуть объект из его окружения и изолировать его от всех внешних и внутренних объектов. Для этого поможет библиотека Mockery, которая отлично с этим справляется. Подробнее можно прочитать в статье Чудо Mockery для заглушек в unit тестах.
Тестирования WordPress: Brain Monkey или WP_Mock
Так же в процессе написания тестов, необходимо как-то избавиться от зависимостей ядра WordPress. Функции, объекты, глобальные переменные и прочие радости WordPress нужно заменить на заглушки. Для этого есть отличные библиотеки Brain Monkey и WP_Mock. Делают они примерно тоже самое, но имеют немного разный синтаксис, так что выбирайте ту, которая вам понравится больше. Про них можно прочитать в статьях: Модульное тестирование WordPress с помощью Brain Monkey и Модульное тестирование WordPress (PHPUnit, WP_Mock). Библиотеки очень простые, разобраться с ними хватит несколько дней.
Function Mockery для тестирования функций PHP
Иногда приходиться сталкивать с тем, что нужно как-то изменить поведение PHP-функций. И это основная задача Function Mockery. Примеры можно посмотреть в статье Подмена встроенных php-функций.
Проблемы с тестированием
Написания тестов очень сильно улучшает качество написания кода, ведь тестирование своего кода очень сильно изменяет мышление и подход к разработке. В средних и крупных проектах написание функционала занимает во много раз меньше времени, чем его поддержка. Обязательное покрытие тестами новой функциональности решить большинство проблем с некачественным кодом, со сложной архитектурой и с бальным человеческим фактором.
Слишком большие юниты
Большие функции/методы/классы несут в себе огромную логику вашего приложения и тем сложнее с ними разобраться. Диагноз: нарушение самого важного принципа в разработке это keep it stupid simple или принципов SOLID. По началу придется очень много рефакторить, разбивать логику на более мелкие части, но это улучшить качество кода и простоту поддержки.
Hard Dependencies
Жесткие зависимости объектов друг от друга очень сильно влияют на возможность вашего приложения расширяться, а это самое важное для бизнеса и для вашего «пресса» 🙂 Что такое зависимости и как с ними правильно работать можно прочитать в статье: Dependency Injection (Внедрение зависимостей).
Контроль тестов
В завершении, свою работу очень важно всегда проверять, проверять и еще раз проверять. Для этого идеальный инструмент continuous integration, где вы используя любую систему контроля версий перед или после отправки данных в репозиторий проверите, что тесты выполнились успешно еще раз.