Делюсь личным опытом создания интеграционных и юнит-тестов с учётом той среды разработки, которую чаще всего использую в своей работе.
Задача: Иметь возможность писать Unit-тесты (по факту интеграционные тесты) для WordPress с использованием PHPUnit. В самих тестах иметь возможность использовать функции ядра WordPress и любых установленных плагинов. В примере мы будем тестировать функцию из WooCommerce.
Исходные данные: OS Windows 11 на которой установлены: PHP 8.3, Composer, Git, XAMPP, Visual Studio Code.
Установка перечисленных компонентов выходит за рамки данной инструкции. Изучить эти вопросы предлагаю самостоятельно.
PS. Чтобы у вас было настроено также как у меня, смотрите инструкцию по установке Composer и PHP в Windows.
Проверка необходимых PHP-библиотек
Для использования юнит-тестов нужно будет кое-что донастроить (проверить). Откройте php.ini и убедитесь, что в нём есть строки:
extension=php_pdo_mysql.dll
extension=php_mysqli.dll
Если таких строк нет или они закомментированы (начинаются с точки с запятой), то добваьте/раскомментируйте их.
Также не лишним будет сразу добавить в php.ini вот этот код:
[XDebug]
zend_extension = C:\php8\ext\php_xdebug-3.3.1-8.3-vs16-x86_64.dll
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.2
xdebug.remote_port=9000
xdebug.remote_autostart=on
xdebug.remote_handler=dbgp
xdebug.profiler_enable=1
xdebug.profiler_output_dir="C:\xampp\tmp"
xdebug.remote_log ="C:\xampp\tmp\xdebug.log"
Сохраните файл и перезагрузите компьютер, чтобы изменения вступили в силу.
Установка WP-CLI
Скачайте wp-cli.phar вручную (ссылка на скачивание) и сохраните его в папку "C:\wp-cli".
Создайте файл wp.bat в папке C:\wp-cli со следующим содержимым:
@ECHO OFF
php "c:/wp-cli/wp-cli.phar" %*
Добавьте C:\wp-cli в переменную окружения path. Для этого откройте консоль в Windows и выполните команду:
setx path "%path%;c:\wp-cli"
Теперь вы можете использовать WP-CLI из любого места командной строки Windows.
Создание проекта
Приступаем к созданию проекта. Тк я использую XAMPP, то создаю в папке "C:\xampp\htdocs\www" папку с название проекта. В моём случае это "new-site.ru". Тут всё стандартно. Скачиваю из репозитория WordPress свежий дистрибутив, запускаю сервер XAMPP, открываю в браузере http://localhost/www/new-site.ru и устанавливаю WordPress. Поскольку я собираюсь взаимодействовать с WooCommerce, то через админку WP загружаю и активирую этот плагин.
Настройка PHP Unit в проекте WordPress
Далее переходим непосредственно к настройки и созданию тестов PHP Unit.
Структура проекта будет такой:
new-site.ru/
├── composer.json
├── phpunit.xml
├── vendor/
│ └── autoload.php
├── tests/
│ ├── bootstrap.php
│ └── integration-tests/
│ └── WooCommerceProductTest.php
└── wp-load.php (и прочие WP-шные файлы и папки)
Соответственно все, кроме вп-шных файлов мы сейчас и создадим. Поехали.
Первым делом создаём в корне нашего сайта composer.json с практически пустым содержимым:
{ }
Теперь устанавливаем phpunit. Открываем консоль, переходим в корневую папку проекта и выполняем команду:
composer require phpunit/phpunit --dev
После этого должна появиться папка vendor.
Создаём файл phpunit.xml с таким содержимым:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Первая строка объявляет версию XML-документа и используемую кодировку UTF-8. -->
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
bootstrap="tests/bootstrap.php"
colors="true">
<!-- Основное тело документа начинается с тега <phpunit>. -->
<!-- Атрибуты элемента <phpunit>: -->
<!-- xmlns:xsi - объявление пространства имён XSI для схемы XSD. -->
<!-- xsi:noNamespaceSchemaLocation - путь к схеме XSD для валидации файла. -->
<!-- bootstrap - путь к файлу начальной загрузки (bootstrap.php), который должен исполняться перед тестами. -->
<!-- colors - включать вывод результата тестов цветом (красный-зелёный), для лучшей визуализации успеха или ошибок. -->
<testsuites>
<!-- Контейнер для определения наборов тестов (test suites). -->
<testsuite name="Application Test Suite">
<!-- Один набор тестов, который называется "Application Test Suite". -->
<directory suffix="Test.php">tests/integration-tests</directory>
<!-- Директория, содержащая тесты. Указан путь до каталога integration-tests. -->
<!-- Суффикс "Test.php" означает, что PHPUnit будет искать только файлы, оканчивающиеся на "Test.php". -->
</testsuite>
</testsuites>
<!-- Завершаем набор тестов. -->
<php>
<!-- Блок для установки переменных окружения и серверных настроек. -->
<server name="APP_ENV" value="testing"/>
<!-- Устанавливает переменную окружения APP_ENV со значением "testing". -->
<!-- Это полезно, если ваше приложение имеет разные режимы работы в зависимости от значения этой переменной. -->
<env name="DB_CONNECTION" value="testing"/>
<!-- Устанавливает переменную окружения DB_CONNECTION со значением "testing". -->
<!-- Например, если ваше приложение использует различные базы данных для разработки и тестирования. -->
</php>
</phpunit>
<!-- Конец основного блока. -->
В корне сайта создаём папку tests. В ней создаём файл bootstrap.php и папку integration-tests в которую будем складывать наши тесты.
Содержимое файла bootstrap.php:
<?php
// Файл bootstrap.php
require_once dirname( __DIR__ ) . '/wp-load.php';
В папке integration-tests создаём первый файл с тестами. Согласно требованиями библиотеки PHPUnit имя нашего файла должно заканчиваться на Test.php и содержать внутри класс с таким же именем. Следуя данному правилу я создаю файл WooCommerceProductTest.php с таким содержимым:
<?php
// Файл WooCommerceProductTest.php
// namespace Tests\IntegrationTests;
use PHPUnit\Framework\TestCase;
class WooCommerceProductTest extends TestCase {
protected function setUp(): void {
parent::setUp();
// Удаляем все продукты перед каждым тестом.
global $wpdb;
$product_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE post_type='product'" );
foreach ( $product_ids as $id ) {
wp_delete_post( $id, true );
}
}
/**
* Проверяет создание нового товара.
*/
public function testCreateNewProduct() {
$product = new WC_Product_Simple();
$product->set_name( 'Тестовый продукт' );
$product->save();
$products = wc_get_products( [ 'name' => 'Тестовый продукт' ] );
$this->assertCount( 1, $products ); // Проверяем наличие одного продукта
}
}
Теперь, для запуска теста достаточно находясь в корне нашего проекта выполнить в консоли команду:
php vendor/bin/phpunit
или:
./vendor/bin/phpunit
Или пользоваться графическим интерфейсом редактора Visual Studio Code, что удобнее.
На этом всё.