Загрузка...

Как безболезненно начать писать Unit тесты для WordPress

phpunit

Улучшаем комьюнити.

На оф. сайте WordPress есть инструкция о том, как правильно писать UnitTests для WP.

Однако, использовать ее можно только если, вы пользуйтесь Linux подобной системой, можете использовать баш скрипты и svn. Если нет, то вам предлагаю пойти поискать правды в другом месте, типа в cygwin или в WSL. Мне это кажется чудовищно не справедливым! Ведь писать unit-тесты это так просто! Это значительно улучшит качество написанного вами кода, и поможет избежать глупых ошибок при добавлении новых фич.

Сейчас я вам это докажу.

Подготовка

Для разработки я использую Open Server (php 7.4 +mysql 8.0) и PHPStorm.
Перед началом работы нужно сделать пару простых подготовительных шагов, адаптировать среду:

  • Сделать php доступным из консоли windows
  • Установить composer и сделать доступным его из консоли windows
  • Установить phpunit и сделать доступным его из консоли windows
  • Поставить WordPress

Поехали!

Пойдем своим путем, забив на мануалы wp. Создаем плагин для которого будем писать тесты.
Назовем его simple-plugin по традиции кладем в него simple-plugin.php c заготовкой.

<?php
/**
 * Plugin Name: Simple Plugin
 * Version:     1.0.
 */

if (!defined( 'SIMPLE_PLUGIN_FILE' ) ) {
    define( 'SIMPLE_PLUGIN_FILE', __FILE__  );
}

YmRsu9W

Все. У нас уже есть 2 строчки кода, которые мы моем протестировать.

Теперь нам нужно подключить конфиг для phpunit и создать папку test.

Создаем файл конфига phpunit.xml или phpunit.xml.dist кладем в него следующее содержание:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="tests/bootstrap.php">
<testsuites>
   <testsuite name="WP Unit Testing">
      <directory suffix="Test.php">./tests/</directory>
   </testsuite>
</testsuites>
</phpunit>

Теперь мы должны создать файл bootstrap.php и файл c классом теста, они должны заканчиваться на Test.php регистр важен, т.к. мы работаем по PSR.

Но перед этим подключим phpunit как зависимость composer. Пишем в командной строке php

composer require phpunit/phpunit --dev

nDbahkw

В bootstrap.php мы пишем подключение тестов и текущей конфигурации WP.

<?php
require_once(__DIR__ . "/../vendor/autoload.php");
require_once(__DIR__ . "/../../../../wp-load.php");

015ayhS

Создаем первый класс теста ExampleTest.php и пишем в него код, который определит задана ли константа.

<?php


class ExampleTest extends \PHPUnit\Framework\TestCase
{

    public function testPluginExample(){
        $this->assertTrue(defined('SIMPLE_PLUGIN_FILE'));
    }
}

Если коротко, то методы $this->assert что-то там и проверяют выполняется ли задуманная нами логика.

Итоговая файловая структура

g8ipcG9

Пишем в командной строке команду на запуск тестов phpunit и видим:

F 1 / 1 (100%)

Time: 00:00.001, Memory: 92.00 MB

REaYDwq

И это правильно! Как думаете почему? … Правильно, потомучто мы не активировали плагин!

Активируем плагин в админке WP

96FfreN

И повторяем проверку:

PS \wp-content\plugins\simple-plugin> phpunit
PHPUnit 9.5.28 by Sebastian Bergmann and contributors.

. 1 / 1 (100%)

Time: 00:00.001, Memory: 92.00 MB

OK (1 test, 1 assertion)

Jv7yR3b

Теперь все ок! Мы написали первый UnitTest и он работает!

В догонку

Теперь вы знаете как быстро и просто писать unit тесты для WP. Но стоит отметить несколько важных моментов:

  1. Unit-тесты должны работать с кодом, не с базой данных. Разумеется вы можете использовать результаты работы с БД, но это надо делать осторожно.
  2. Написанная нами система работает не с чистой установкой WP, а с тем, что есть. Поэтому так же могут быть неожиданные результаты с другими установками WP.
  3. Тестирование хуков может представлять проблему.

Создать плагин и конфиг для тестов так же можно не ручками, а с использованием wp cli

wp scaffold plugin-tests simple-plugin

Описание команды
Но как я и писал в начале, если дальше следовать официальным инструкциям по настройке это может привести в тупик.  Описанный же мной способ крайне прост и работает на все 100% в любой среде.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *