Введение в автоматизированное тестирование WordPress-плагинов с помощью PHPUnit

Основной причиной, почему WordPress имеет множество плагинов, является то, что разработчикам легко их создавать. При этом большинство программистов не имеют достаточного опыта для тестирования своих плагинов.

В этой статье мы расскажем, что такое автоматическое тестирование, познакомимся с PHPUnit и WP-CLI, научимся создавать тесты и настроим непрерывное автоматическое тестирование с помощью Travis CI.

Что такое автоматизированное тестирование?

Согласно Википедии, автоматическое тестирование – это использование специального программного обеспечения для контролирования выполнения тестов и сравнения полученных результатов с прогнозируемыми. Оно позволяет автоматизировать некоторые повторяющиеся задачи. А также выполнить дополнительное тестирование, которое трудно осуществить вручную.

Существует несколько типов тестирования. Самое популярное из них – модульное. Модульные тесты позволяют проверить, что блок кода, функция или метод класса делает то, что и задумывалось. В этом руководстве мы проведем именно модульное тестирование.

Автоматическое тестирование помогает выявлять ошибки, чтобы они не проявились в готовом продукте. Написание и тестирование займет больше времени, чем просто создание плагина. Но в результате плагин будет содержать меньше ошибок.

Рассмотрим простой пример того, насколько бесценны модульные тесты, и для чего их можно использовать.

Мой плагин для привлечения клиентов включает в себя класс OptinThemesRepository, в котором есть метод add() для добавления новых шаблонов форм регистрации и метод get() для извлечения шаблона формы.

Чтобы функции add() и get() работали корректно, я создал тест, исходный код которого приведен ниже.

public function testAddGetMethods()
{
    $kick_optin_form = array(
        'name' => 'Kick',
        'optin_class' => 'kick',
        'optin_type' => 'kick',
        'screenshot' => MAILOPTIN_ASSETS_URL . 'img/kick.png'
    );
    // добавляем тему kick optin 
    OptinThemesRepository::add($kick_optin_form);
    $result = OptinThemesRepository::get('kick');
    $this->assertEquals($kick_optin_form, $result);
}

Если в будущем этот тест перестанет работать, я узнаю, что есть проблема, и где она возникла: в каком методе класса, функции и строке кода.

Преимущества автоматизированного тестирования

Теперь, когда мы знаем, что такое автоматизированное тестирование, рассмотрим его преимущества более подробно.

Раннее обнаружение ошибок

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

Более высокое качество программного обеспечения

Автоматическое тестирование не только предоставляет точные результаты, но и экономит время.

Простая и надежная отчетность

Автоматизированные средства тестирования позволяют отслеживать каждый тестовый скрипт. В файлах журнала отчетности отображается количество выполненных тестовых сценариев и их статус (например, успешно пройден, не пройден или пропущен), сведения о выявленных ошибках и подсказки о том, как их исправить.

Создание WordPress-плагина

Мы собираемся создать плагин для проверки метатегов Google и Bing в административной панели WordPress. Исходный код плагина размещен в моей учетной записи GitHub.

Код этого плагина, приведенный ниже, находится в файле wp-meta-verify.php.

<?php 
class WP_Meta_Verify 
{
    public function __construct()
    {
        add_action('wp_head', [$this, 'header_code']);
}
    public function header_code()
    {
        $google_code = get_option('wpmv_google_code');
        $bing_code = get_option('wpmv_google_code');
        echo $this->google_site_verification($google_code);
        echo $this->bing_site_verification($bing_code);
    }
    public function google_site_verification($code)
    {
        return "<meta name="google-site-verification" content="$code">";
    }
    public function bing_site_verification($code)
    {
        return "<meta name="msvalidate.01" content="$code">";
    } 
} 
new WP_Meta_Verify();

Обратите внимание, что мы не включили в плагин страницу настроек, на которой обычно сохраняется код подтверждения Google и Bing. Я сделал это специально, чтобы сделать пример простым. Но использование get_option ('wpmv_google_code') и get_option ('wpmv_bing_code') предполагают, что есть страница настроек, и они извлекают с нее коды проверки.

Модульное тестирование WordPress плагина

PHPUnit – стандартный инструмент для тестирования PHP.WP-CLI является интерфейсом командной строки для WordPress.

До WP-CLI установка PHPUnit-тестирования для плагинов WordPress приносила много боли. WP-CLI имеет отличное руководство по настройке. Но мы все равно рассмотрим эти шаги в рамках данной статьи.

Устанавливаем PHPUnit

Для установки PHPUnit выполните следующие команды.

composer global require phpunit/phpunit:5.*

Запустите команду phpunit –version, чтобы подтвердить установку.

Устанавливаем WP-CLI

Для установки WP-CLI, выполните следующие команды.

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar 
chmod +x wp-cli.phar 
sudo mv wp-cli.phar /usr/local/bin/wp

Запустите команду wp –info для подтверждения установки.

После установки PHPUnit и WP-CLI мы будем использовать последний инструмент, чтобы настроить модульный тест для плагина.

Настройка модульного теста для плагина

Измените каталог терминала на корневую папку WordPress и выполните приведенную ниже команду для создания тестовых файлов.

wp scaffold plugin-tests wp-meta-verify

Ниже приведен пример структуры плагина после того, как приведенная выше команда создаст файлы теста.

|-bin/
|----install-wp-tests.sh
|-tests/
|----bootstrap.php
|----test-sample.php
|-.travis.yml
|-phpcs.xml.dist
|-phpunit.xml.dist
|-wp-meta-verify.php

Примечание: по умолчанию команда для проведения тестов wp scaffold генерирует файл конфигурации Travis CI. Вы можете указать флаг --ci для создания файла конфигурации для сервиса CI, который вы используете. Например: wp scaffold-plugin-tests --c gitlab.

Измените каталог своего терминала на директорию вашего плагина и запустите скрипт установки:

cd path-to-wordpress-plugin
bin/install-wp-tests.sh wordpress_test root '' localhost latest

Предположим, что имя пользователя MySQLhomestead, а пароль – secret. Тогда ваш сценарий установки будет выглядеть следующим образом:

bin/install-wp-tests.sh wordpress_test homestead 'secret' localhost latest
Выполните команду phpunit для запуска теста по умолчанию в tests/test-sample.php.
Настройка модульного теста для плагина

Результат теста PHPUnit test result

Создаем собственные тесты для плагина

Создайте файл test-wp-meta-verify.php в папке с тестами. Он будет содержать тесты плагина с классом setUp.

<?php 
 
class WP_Meta_VerifyTest extends WP_UnitTestCase
{
    public function setUp()
    {
        parent::setUp();
        $this->class_instance = new WP_Meta_Verify();
    }
    public function test_google_site_verification()
    {
    }
    public function test_bing_site_verification()
    {
    }
}

Чтобы метод считался модульным тестом, он должен иметь префикс test. Лучшей практикой является добавление окончания Test к каждому тестовому классу, хотя это не требуется.

Неясно, что делает setUp ()?PHPUnit запускает его один раз перед каждым тестовым методом и в новых экземплярах тестового класса.

Также существует метод tearDown(), но он запускается после каждого метода тестирования. Кроме этого есть setUpBeforeClass() и tearDownAfterClass(), которые выполняются до и после каждого тестового примера, соответственно. Тестовый пример – это класс, который содержит несколько методов тестирования. Дополнительную информацию смотрите в руководстве по WordPress и документации PHPUnit.

Из кода приведенного выше класса видно, что мы собираемся создавать тесты методов google_site_verification и bing_site_verification.

public function test_google_site_verification()
{
    $meta_tag = $this->class_instance->google_site_verification('B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g');
    $expected = '<meta name="google-site-verification" content="B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g">';
    $this->assertEquals($expected, $meta_tag);
}
public function test_bing_site_verification()
{
    $meta_tag = $this->class_instance->bing_site_verification('B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g');
    $expected = '<meta name="msvalidate.01" content="B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g">';
    $this->assertEquals($expected, $meta_tag);
}

Эти тесты гарантируют, что оба метода вернут правильный метатег, когда в качестве аргументов им будут переданы коды проверки Google и Bing.

Запустите команду phpunit, и вы увидите результат, схожий со скриншотом, приведенным ниже.

Создаем собственные тесты для плагина

Результат работы PHPUnit

Непрерывное автоматизированное тестирование с помощью Travis CI

Travis CI – это сервис, используемый для создания и тестирования программных проектов, размещенных на GitHub. Поэтому, чтобы использовать Travis CI, нужно опубликовать плагин на GitHub. Делаем это сейчас. Смело можете обращаться к моему проекту. Благодаря WP-CLI мы добавили Travis CI в наш плагин с помощью файла .travis.yml.

Придерживаясь рекомендаций и стандартов PHP, для плагинов необходима как минимум версия PHP 5.4. Чтобы сборки работали корректно, мне пришлось заменить их матрицу следующим кодом, размешенным в файле .travis.yml.

matrix:
    include:
        - php: 7.1
        env: WP_VERSION=latest
        - php: 7.0
        env: WP_VERSION=latest
        - php: 5.6
        env: WP_VERSION=latest
        - php: 5.6
        env: WP_VERSION=trunk
        - php: 5.5
        env: WP_VERSION=latest
        - php: 5.4
        env: WP_VERSION=latest

Перейдите в Travis CI и войдите в свой аккаунт на GitHub. Следуйте инструкциям, появляющимся на экране, чтобы добавить репозиторий GitHub. После синхронизации учетной записи с GitHub зайдите в репозиторий и активируйте свой плагин.

Непрерывное автоматизированное тестирование с помощью Travis CI

Настройка репозитория Travis CI

В следующий раз, когда измените код и передадите данные на GitHub, будет запущена сборка на Travis CI.

Настройка репозитория Travis CI

Результат сборки Travis CI

Предоставляю успешный результат сборки на ваше рассмотрение.

Краткое заключение

Надеюсь, теперь вы осознаете важность тестирования и знаете, как создать тест для собственного WordPress-плагина.

МЛМария Логутенкоавтор-переводчик статьи «An Introduction To Automated Testing Of WordPress Plugins With PHPUnit»