пятница, 31 марта 2017 г.

Как устроено модульное (Unit) тестирование кода в WordPress

Исходный код WordPress покрыт тестами. Для тестирования PHP кода используется PHPUnit, а для тестирования JavaScript — QUnit. В данной статье рассмотрим тестирование PHP кода.

Установка тестов

  1. Установите PHPUnit. Инструкция по установке доступна на сайте этого фреймворка.
  2. Выполните команды в консоли чтобы загрузить версию WordPress для разработчиков, включающую тесты: svn co https://develop.svn.wordpress.org/trunk/ wordpress-develop cd wordpress-develop
    Если у вас не установлена система управления версиями Subversion, вы можете скачать архив содержащий WordPress с тестами на этой странице. Это не удобно, т.к. нужно каждый раз скачивать архив чтобы иметь последнюю версию.
  3. Создайте пустую базу данных MySQL, которая будет использоваться для тестирования. Все данные будут удалены из всех таблиц во время исполнения тестов, поэтому нельзя использовать существующую базу данных.
  4. Скопируйте данные из файла wp-tests-config-sample.php в новый файл wp-tests-config.php и добавьте в него данные для доступа к базе данных, созданной на предыдущем шаге.
  5. В корневой директории, где расположены файлы wp-tests-config.php, phpunit.xml.dist, и папка tests/, выполните команду: phpunit
    или, добавьте путь к файлу, чтобы выполнить тесты находящиеся в нем, например: phpunit tests/phpunit/tests/dependencies/styles.php

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

Для каждого выполненного теста в консоли отображается один из следующих символов:

  • . — тест успешно выполнен
  • F — тест не выполнен успешно. Какое либо утверждение, например assertEquals ложно.
  • E — тест не выполнен успешно из за ошибки в PHP коде: E_ERROR, E_WARNING, E_NOTICE
  • S — тест пропущен, например, с помощью метода markTestSkipped(). Обычно это означает что тест нужен только при определенных обстоятельствах, например, когда включен режим Мультисайт. Если он выключен — тест пропускается.
  • I — незаконченный тест. В нем присутствует метод markTestIncomplete() или это пустой тест без утверждений (asserts).

Устройство тестов

Классы с тестами наследуются от класса WP_UnitTestCase, который в свою очередь наследуется от класса PHPUnit_Framework_TestCase. Класс WP_UnitTestCase имеет ряд методов, упрощающих тестирование в WordPress. Например, эти методы возвращают WordPress в исходное состояние после каждого теста:

  • setUp — выполняется перед каждым методом в тестовом классе
  • tearDown — выполняется после каждого метода в тестовом классе
  • setUpBeforeClass — выполняется перед первым методом в тестовом классе
  • tearDownAfterClass после последнего метода в тестовом классе
  • assertPostConditions — выполняется перед окончанием теста, перед tearDown

Фабрики

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

// создать пользователя с ролью 'editor', вернуть идентификатор $user_id = self::factory()->user->create( array( 'role' => 'editor' ) // создать пользователя с ролью 'editor', вернуть объект класса WP_User $user = self::factory()->user->create_and_get( array( 'role' => 'editor' ) // создать 5 страниц, вернуть массив идентификаторов $post_ids = self::factory()->post->create_many( 5, array( 'post_type' => 'page' ) );

Комментариев нет:

Отправить комментарий