WordPress: Unit тестирование плагинов и тем

Делюсь личным опытом создания интеграционных и юнит-тестов с учётом той среды разработки, которую чаще всего использую в своей работе.

Задача: Иметь возможность писать 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, что удобнее.

запуск Unit-теста WooCommerce в Visual Studio Code

На этом всё.

Рейтинг: 5

2025-09-12 / / 0 комментариев / WordPress / , ,