Unit tests matter или Roadmap для Unit тестов на WordPress

Теоретические основы тестирования Зачем необходимо тестирование? Какие виды тестирования бывают? Чем юнит-тестирование отличается от других видов тестирования? Кто и как должен тестировать продукт? Библиотеки для тестирования PHPUnit Базовые команды Фикстуры (Fixtures) Бутстрап (bootstrap.php) Утверждения (Asserts) Создания конфигов (phpunit.xml) Code coverage Mockery Стабы/Моки/Шпионы Частичные моки Моки для типов данных Абстрактные классы Hard dependencies Тестирования WordPress: Brain …

Подробнее

Чудо Mockery для заглушек в unit тестах

Потрясающая библиотека Mockery, которая сделает вашу жизнь лучше во время написания тестов. Она помогает создавать быстрее и проще стабы и моки и так же используется в большинстве тестовых фрейморков. И что самое приятное, библиотека очень простая. Его основная цель состоит в том, чтобы предложить тестовую двойную инфраструктуру с лаконичным API, способным четко определять все возможные …

Подробнее

Модульное тестирование WordPress с помощью Brain Monkey

Кто еще не знаком с тестированием и модульным тестированием можете ознакомится: Автоматизация тестирования, Модульное тестирование с помощью PHPUnit. Тестирование тем и плагинов под WordPress имеет одну большую проблему — взаимодействие с ядром. Решить ее можно с помощью библиотек Brain-WP/BrainMonkey или 10up/WP_Mock. Как писать тесты с помощью 10up/WP_Mock вы можете прочитать в статье: Модульное тестирование WordPress (PHPUnit, WP_Mock), но …

Подробнее

Не за#буйте с вашей пагинацией!!!

Почему не работает пагинация? Один из самых популярных вопрос у разработчиков WordPress Так почему же? Для начала нужно разобраться с тем, на какой странице вы хотите вывести пагинацию. Существуют страницы постов (постов/страниц/кастомных типов постов(CPT)) или архивные страницы(архивные/терминов страницы и страница поиска). Пагинация на странице постов В целом пагинацию можно разбить на 3 небольших этапа: Делаем …

Подробнее

Как с помощью husky улучшить качество работы с Git?

Библиотека husky может предотвращать плохие git commit, git push и еще что-то) Установка husky npm install husky —save-dev В package.json добавим секцию scripts в которой создадим команду для проверки WPCS: { … «scripts»: { «cs»: «vendor/bin/phpcs —standard=WordPress .» }, … } Добавим саму библиотеку WPCS: composer require —dev wp-coding-standards/wpcs Добавим секцию husky в package.json: { … …

Подробнее

Подмена встроенных php-функций

Часто при написании тестов необходимо протестировать внешнюю функцию или функцию, которая встроенная в php. Рассмотрим для примера сохранение метаполей для постов в WordPress: class Metabox { public function save( int $post_id ) { $nonce = filter_input( INPUT_POST, ‘_nonce’, FILTER_SANITIZE_STRING ); if ( ! wp_verify_nonce( $nonce, ‘very-secret-nonce’ ) ) { return; } $field = filter_input( INPUT_POST, …

Подробнее

Тестирование абстрактных методов

Объект абстрактного класса мы не можем создать напрямую. Поэтому работать с ним будем через stub. Что такое stub можно прочитать в статье про Модульное тестирование. Пример абстрактного класса Abstract_Suit: abstract class Abstract_Suit { abstract public function abstract_method(); } Тестируем с помощью метода getMockForAbstractClass use PHPUnitFrameworkTestCase; class Test_Suit extends TestCase { public function test_abstract_class() { $stub …

Подробнее

Вызов защищенных и приватных методов

Если вам понадобился данный трюк то скорее всего вы имеете проблему в архитектуре вашего класса/приложения. Его использование это крайняя мера. Лучше всего тестировать приватные свойства и методы через публичные методы. Использование данного трюка оправдано в случае экономии времени и при полном понимании зачем вы это делаете. Пример тестируемого класса: class Duck { private function idea( …

Подробнее

Подмена защищенных и приватных свойств для тестирования

Иногда в тестах нам нужно заменить protected или private свойство объекта, чтобы ускорить тест или более качественно протестировать объект. Пример тестируемого класса: class Suit { private $private_property = ‘private property’; public function method(): string { return $this->private_property; } } Чтобы заменить свойство $private_property на другое нам поможет ReflectionProperty: use PHPUnitFrameworkTestCase; use ReflectionProperty; class Test_Suit extends …

Подробнее

Тестирование объектов с извращениями в конструкторе

Иногда разработчики добавляют в конструктор какие-то нежелательные эффекты, вызовы различных методов или зависимости с другими объектами. Например: class Duck { public function __construct() { $this->life = new Life(); } public function say() { echo ‘quack’ . PHP_EOL; } } Для того, чтобы протестировать метод say() нам нужно как-то замокать new Life с помощью заглушек для …

Подробнее

Все что нужно знать про WP Cron в WordPress

Что такое cron и в чем его отличие от wp-cron? Cron — команда UNIX, которая используется для выполнение периодических задач, через заданный промежуток времени. Wp-cron — псевдо-крон, который необходим для выполнение функционала обычного крона, но в рамках wordpress. Он необходим для следующих задач: проверка обновлений ядра, плагинов, тем функционал сторонних плагинов, которые используют cron. Особенности …

Подробнее

Принципы SOLID и с чем их едят?

SOLID — мнемонический акроним, введённый Майклом Фэзерсом (Michael Feathers) для первых пяти принципов, названных Робертом Мартином в начале 2000-х, которые означали пять основных принципов объектно-ориентированного программирования и проектирования. Для чего нужны принципы SOLID? Принципы SOLID — это набор правил, которые необходимо применять во время работы над программным обеспечением(ПО) для его улучшения. Удивительно то, что принципы …

Подробнее

Dependency Injection (Внедрение зависимостей)

Проблема class Order { public $id; } class Order_Processing { public function create_new_order(): void { /* Логика выполнения заказа */ $this->log(‘Order created!’); } private function log( string $message ): void { echo «Save log with message: {$message}» . PHP_EOL; } } $order_processing = new Order_Processing(); $order_processing->create_new_order(); В классе Order_Processing принцип Single Responsibility т.к. кроме обработки …

Подробнее

DOMDocument

DOMDocument — класс для работы с XML-документами. Данный инструмент удобно использовать, когда вам необходимо парсить xml/html-документы. Простой пример использования класса DOMDocument: $dom = new DOMDocument(); $dom->loadHTML( $html ); $dom->saveHTML(); Рассмотрим основные ошибки и сложности с которыми можно столкнуться: Кодировка Невалидный документ Выбор елементов Удаление елементов Кодировка Для начала документ нужно загрузить с корректной кодировка. В …

Подробнее

Как подружить WordPress и Twig

Что такое шаблонизатор? Шаблонизатор (в web) — программное обеспечение, позволяющее использовать html-шаблоны для генерации конечных html-страниц. Основная цель использования шаблонизаторов — это отделение представления данных от исполняемого кода. Часто это необходимо для обеспечения возможности параллельной работы программиста и дизайнера-верстальщика. Использование шаблонизаторов часто улучшает читаемость кода и внесение изменений во внешний вид, когда проект целиком выполняет один человек. Wikipedia Самая важная функция …

Подробнее