Введение в автоматизированное тестирование 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

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

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

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

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

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

 

Перевод статьи «An Introduction To Automated Testing Of WordPress Plugins With PHPUnit » был подготовлен дружной командой проекта  Сайтостроение от А до Я.