PHPUnit для тестирования WordPress плагинов. Часть1: Установка
PHPUnit — это фреймворк для Unit тестирования приложений на PHP. Он позволяет создавать тесты для различных частей приложения, проверять их выполнение и обнаруживать ошибки. PHPUnit предоставляет множество инструментов для управления тестами, таких как запуск тестов, отладка и анализ результатов. И всё это можно применять для тестирования WordPress плагинов
Для начала работы понадобятся:
- SVN – система контроля версий, которую использует WordPress
- GIT – самая популярная система контроля версий
- Bash (GIT bash) — оболочка для запуска .sh скриптов
- PHP – требуется актуальная версия 7.4+
- Composer – менеджер зависимостей для PHP
- Apache/nginx – для запуска сервера/сайта перед тестированием
- WP-CLI – интерфейс командной строки для WordPress
WP-CLI можно установить глобально, но удобно использовать его локально, добавив в composer.json как зависимость. Для этого инициализируем Composer в папке с проектом командой composer init
, если еще этого не сделано устанавливаем WP-CLI командой
composer require wp-cli/wp-cli-bundle
Теперь можно запускать WP-CLI
bash ./vendor/bin/wp <command>
Далее просто
wp <command>
Теперь установим phpunit в наш проект. Перед установкой требуется определиться с версией phpunit, это можно сделать по таблице с сайта WordPress здесь. Мне понадобится 8 версия:
composer require --dev phpunit/phpunit ^8
А также установим полифил от Yoast для того чтобы даже неподходящие по таблице версии WordPress и PHPUnit могли работать вместе
composer require --dev yoast/phpunit-polyfills:"^2.0"
Для генерации Unit тестов понадобится набор команд scaffold (строительные леса), который используется для генерации кода. С его помощью можно генерировать типы записей, таксономии, темы и другие WordPress сущности, нам же понадобится генерация тестов. Для добавления Unit тестов в плагин, требуется запустить в директории с плагином команду
wp scaffold plugin-tests <plugin name>
После этого в плагине будет создано несколько файлов. Сразу о тех, которые в этой статье нам не понадобятся (о них расскажу в другой раз):
- .phpcs.xml.dist – файл от WordPress для статического анализа кода
- .travis.yml – файл для автоматического запуска тестов
Понадобятся сейчас:
- phpunit.xml.dist – конфиг phpunit, о нем можно почитать здесь
- /tests/bootstrap.php – загрузочный файл для запуска тестов, путь до него указан в конфиге
- /tests/test-sample.php – файл с примером теста
- /bin/install-wp-tests.sh – файл для установки тестовый среды WordPress.
Последний файл сейчас и надо запустить:
bash bash bin/install-wp-tests.sh wordpress_test root ''
localhost latest
- wordpress_test — имя базы данных, в которой будет храниться тестовая база данных WordPress
- root – пользователь базы данных
-
''
– пароль - localhost – адрес базы данных
- latest – требуемая версия WordPress
Скрипт установит в директорию temp WordPress указанной версии и WordPress Test Suite – дополнения к PHPUnit для тестирования WordPress (подробнее о нем в следующий раз)
Отдельный пункт для пользователей Windows. Как уже было сказано скрипт install-wp-tests.sh
устанавливает WordPress и WordPress Test Suite в директорию /temp
, на Windows машинах такой директории нет. Есть несколько способов решения этой проблемы, в этой статье мы получим временную директорию из PHP.
Измененный файл install-wp-tests.sh
можно найти здесь, пояснения к изменениям далее
Сначала нужно в скрипте install-wp-tests.sh
перед строкой:
TMPDIR=${TMPDIR-/tmp}
Разместить строку:
TMPDIR=$(php -r 'echo sys_get_temp_dir();')
Теперь TMPDIR будет устанавливаться из PHP. На моей Windows машине PHP подключается из Open Server и поэтому временная директория располагается по пути d:/ospanel/userdata/temp
Но после этого появляется новая проблема – в пути есть двоеточие из-за этого нужно изменить использование пары команд:
- В функции
install_wp
нужно добавить флаг--force-local
- В функции
install_test_suite
в команде sed нужно заменить двоеточие (:) на решетку (#)
Теперь установка пройдет успешно и на Windows устройстве
Другим решением является использование Docker’а для тестирования c Linux образом, но это тема для отдельной будущей статьи
Теперь, когда тесты могут запустить все, пора приступать:
php ./vendor/bin/phpunit
Во время запуска возможно возникновение PHP ошибок, например с подключением файлов, но их исправление индивидуально, и не представляет сложности. Но если появились вопросы, можно оставить вопрос под постом в нашем телеграмм канале
При успешном запуске в консоли выведется:
No tests executed!
Чтобы запустить пример теста от WordPress надо в файле .phpunit.xml.dist убрать строку:
13: <exclude>./tests/test-sample.php</exclude>
Теперь при запуске тестов выведется:
OK (1 test, 1 assertion)
На этом установка PHPUnit для WordPress окончена. Но базовую конфигурацию можно расширять, например, если требуется запускать тесты с установленными плагинами. Это может быть WooCommerce с аддонами, плагины мультиязычности и т.п.
Писать тесты мы будем в следующей статье, но один пробный напишем сейчас прямо в файле test-sample.php:
public function test_add_query_vars() {
$url = 'https://www.google.com';
$this->assertSame(
$url . '?foo=bar', //expected value
add_query_arg( 'foo', 'bar', $url ) //real value
);
}
Теперь при запуске тестов выведется:
OK (2 test, 2 assertion)
Можем сломать тест, заменим ( 'foo', 'bar', $url )
на ( 'bar', 'foo', $url )
и получим:
1) SampleTest::test_add_query_vars
Failed asserting that two strings are identical.
--- Expected
+++ Actual
@@ @@
-'https://www.google.com?foo=bar'
+'https://www.google.com?bar=foo'
FAILURES!
Tests: 2, Assertions: 2, Failures: 1.
Тест показал ошибку и полную информацию о ней.
Теперь вы умеете устанавливать PHPUnit для тестирования WordPress плагинов даже под Windows. В следующей статье обсудим как добавлять плагины к ядру WordPress перед тестированием. Спойлер всё одновременно просто и не очень
Полезные ссылки:
- Гайд по установке PHPUnit от WP-CLI , но меньше информации чем в этом гайде
- Официальная документация PHPUnit
- Репозиторий полифила от Yoast
Комментирование этой и других статей доступно в нашем Телеграм канале