WordPress: тестирование плагинов с PHPUnit и WP_UnitTestCase

Uehara Konen, Hatō zu 3

Статья описывает отладку плагинов в тестовом окружении WordPress Testing Framework. Это значит, что в тестах можно будет пользоваться API WordPress, переключать роли пользователей сайта, автоматически создавать категории, посты, тэги, комментарии, вложения и тому подобное.

Последний раз проверено с PHP ^7.2, PHPUnit ^6.5, WordPress 4.9.8

Работает это так: в специальном файле bootstrap.php, который указывается в конфиге phpunit.xml, перед каждым запуском тестов загружается чистое ядро вордпресса (с тестовой базой данных и тестируемым плагином), и подключаются файлы тестового фреймворка, которые поставляют API для наших тестов.

Установка

Установить окружение можно автоматически и вручную. Автоматический способ быстрее, но мне больше нравится ручной путь, как способствующий большему контролю и пониманию процесса. Кроме того, у автоматического способа есть свои минусы, об этом ниже.
Далее все команды выполняются в корневой директории тестируемого плагина.

Автоматическая установка с WP-CLI

WP-CLI — это удобный инструмент для управления сайтом из консоли (настройка опций, обновление плагинов и т.д.). 

(официальная документация по установке)

Команда установки тестового окружения:

Эта команда создаст несколько файлов:

  • .travis.yml — конфиг Travis CI.
  • phpcs.ruleset.xml — конфиг для PHP_CodeSniffer, стандарты оформления кода для утилиты phpcs.
  • bin/install-wp-tests.sh — скрипт-установщик тестового ядра вордпресса.

Последний скрипт и нужно запустить (требуется установленная subversion):

  • wordpress_test — название тестовой БД
  • root — пользователь БД
  • password — пароль пользователя
  • localhost — хост MySQL-сервера
  • latest — версия WordPress, может быть 4.7, 4.8 и так далее.
    (подробно автоматическая установка описана в официальной документации)

Я доработал скрипт таким образом, чтобы он подхватывал параметры из переменных окружения:

(отредактировать install-wp-tests.sh, вставить в начало файла)

Теперь нужно указать в файле ~/.profile параметры для тестов, и скрипт можно запускать без аргументов (то есть, не надо придумывать и добавлять в репозиторий файлы настроек вида *.conf.dist и т.д.). 

По-умолчанию файлы ставятся в /tmp, и, естественно, затираются после каждой перезагрузки — их приходится восстанавливать. Перед запуском скрипта можно указать пути установки через переменные окружения (описаны внутри скрипта), но установленный таким образом WP падал с ошибкой подключения каких-то нужных ядру файлов. Заблудившись в гугле в поиске решения этих проблем, я поставил всё вручную, и тесты заработали. Способ со значениями по умолчанию вполне рабочий, но на третий день заново скачивать тестовое ядро и править в нём конфиг надоедает.

Установка вручную

В файлах движка можно найти README, который описывает дальнейшие шаги:

  • Создать пользователя и базу данных в MySQL. Работает также копирование БД существующего сайта. НЕ рабочая БД: база данных будет очищена.
  • Переименовать wp-tests-config-sample.php в wp-tests-config.php, внутри указать параметры подключения к БД.
  • Обновить код командой: svn up
  • Запустить тесты движка: phpunit
    Если тесты проходят без ошибок, то окружение готово.

Настройка проекта

Установить в проект файлы фреймворка PHPUnit:

(официальная документация по установке)

Тесты будут лежать в Test/WP/. Чтобы запускать phpunit, нужно написать для него конфиг, в котором указать, какой файл загружать перед запуском тестов.
Пример:

(документация по настройкам)

Файл phpunit-wp.xml лежит в директории тестов, а не в корне проекта, это удобно: не нужно фильтровать файлы других тестов (например, для Selenium), там же подключается bootstrap-wp.php.

В моём случае плагин использует автозагрузку классов с дополнительной логикой, поэтому (скорее всего, из-за этого) в момент запуска падал, не найдя нужный класс. Проще всего оказалось сделать ссылку в директории тестового движка:

В итоге, тесты запускаются с правильным конфигом:

Тесты wordpress с phpunit

Тесты AJAX

Подробный туториал по написанию тестов AJAX можно найти здесь: WP Ajax Plugin Unit Testing.

У меня тесты падали с сообщением Undefined index: hook_suffix в файле wp-admin/includes/class-wp-screen.php.
Исправлять придётся сам файл, в районе 217 строки нужно заменить начало метода get:

Настройка composer

Чтобы не писать каждый раз в консоли команду для запуска тестов, добавим в composer.json секции scripts и scripts-descriptions.

Теперь тесты можно запускать так:

Дополнительно

  • Automated Testing in WordPress — презентация с введением в юнит- и функциональное тестирование приложений (плагинов и тем) на WordPress. Примеры для phpunit, Selenium, WP_UnitTestCase.
  • Writing WordPress Plugin Unit Tests — установка тестового окружения WordPress, описан процесс настройки конфигов phpunit и создание файла bootstrap.php. Примеры тестов.

Иллюстрация в шапке — Uehara Konen, Hatō zu 3.