PHPUnit для тестирования WordPress плагинов. Часть1: Установка

5 минут
phpunit-dlya-testirovaniya-v-wordpress.-chast-1_-ustanovka-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 перед тестированием. Спойлер всё одновременно просто и не очень

Полезные ссылки:

Комментирование этой и других статей доступно в нашем Телеграм канале