Улучшаем комьюнити.
На оф. сайте WordPress есть инструкция о том, как правильно писать UnitTests для WP.
Однако, использовать ее можно только если, вы пользуйтесь Linux подобной системой, можете использовать баш скрипты и svn. Если нет, то вам предлагаю пойти поискать правды в другом месте, типа в cygwin или в WSL. Мне это кажется чудовищно не справедливым! Ведь писать unit-тесты это так просто! Это значительно улучшит качество написанного вами кода, и поможет избежать глупых ошибок при добавлении новых фич.
Сейчас я вам это докажу.
Подготовка
Для разработки я использую Open Server (php 7.4 +mysql 8.0) и PHPStorm.
Перед началом работы нужно сделать пару простых подготовительных шагов, адаптировать среду:
- Сделать php доступным из консоли windows
- Установить composer и сделать доступным его из консоли windows
- Установить phpunit и сделать доступным его из консоли windows
- Поставить WordPress
Поехали!
Пойдем своим путем, забив на мануалы wp. Создаем плагин для которого будем писать тесты.
Назовем его simple-plugin по традиции кладем в него simple-plugin.php c заготовкой.
<?php /** * Plugin Name: Simple Plugin * Version: 1.0. */ if (!defined( 'SIMPLE_PLUGIN_FILE' ) ) { define( 'SIMPLE_PLUGIN_FILE', __FILE__ ); }
Все. У нас уже есть 2 строчки кода, которые мы моем протестировать.
Теперь нам нужно подключить конфиг для phpunit и создать папку test.
Создаем файл конфига phpunit.xml или phpunit.xml.dist кладем в него следующее содержание:
<?xml version="1.0" encoding="UTF-8"?> <phpunit bootstrap="tests/bootstrap.php"> <testsuites> <testsuite name="WP Unit Testing"> <directory suffix="Test.php">./tests/</directory> </testsuite> </testsuites> </phpunit>
Теперь мы должны создать файл bootstrap.php и файл c классом теста, они должны заканчиваться на Test.php регистр важен, т.к. мы работаем по PSR.
Но перед этим подключим phpunit как зависимость composer. Пишем в командной строке php
composer require phpunit/phpunit --dev
В bootstrap.php мы пишем подключение тестов и текущей конфигурации WP.
<?php require_once(__DIR__ . "/../vendor/autoload.php"); require_once(__DIR__ . "/../../../../wp-load.php");
Создаем первый класс теста ExampleTest.php и пишем в него код, который определит задана ли константа.
<?php class ExampleTest extends \PHPUnit\Framework\TestCase { public function testPluginExample(){ $this->assertTrue(defined('SIMPLE_PLUGIN_FILE')); } }
Если коротко, то методы $this->assert что-то там и проверяют выполняется ли задуманная нами логика.
Итоговая файловая структура
Пишем в командной строке команду на запуск тестов phpunit и видим:
F 1 / 1 (100%)
Time: 00:00.001, Memory: 92.00 MB
И это правильно! Как думаете почему? … Правильно, потомучто мы не активировали плагин!
Активируем плагин в админке WP
И повторяем проверку:
PS \wp-content\plugins\simple-plugin> phpunit
PHPUnit 9.5.28 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
Time: 00:00.001, Memory: 92.00 MB
OK (1 test, 1 assertion)
Теперь все ок! Мы написали первый UnitTest и он работает!
В догонку
Теперь вы знаете как быстро и просто писать unit тесты для WP. Но стоит отметить несколько важных моментов:
- Unit-тесты должны работать с кодом, не с базой данных. Разумеется вы можете использовать результаты работы с БД, но это надо делать осторожно.
- Написанная нами система работает не с чистой установкой WP, а с тем, что есть. Поэтому так же могут быть неожиданные результаты с другими установками WP.
- Тестирование хуков может представлять проблему.
Создать плагин и конфиг для тестов так же можно не ручками, а с использованием wp cli
wp scaffold plugin-tests simple-plugin
Описание команды
Но как я и писал в начале, если дальше следовать официальным инструкциям по настройке это может привести в тупик. Описанный же мной способ крайне прост и работает на все 100% в любой среде.