Spec-Zone.ru › Codeception

Настройка

В этом разделе мы объясним, как вы можете расширить и настроить структуру файлов и процедуры выполнения тестов.

Пространства имён

Чтобы избежать конфликтов имён между классами Actor и классами Helper, их следует разделить по пространствам имён. Для создания наборов тестов с пространствами имён вы можете добавить опцию --namespace к команде bootstrap:

php vendor/bin/codecept bootstrap --namespace frontend

Это создаст новый проект с параметром namespace: frontend в файле codeception.yml. Классы Helper будут находиться в пространстве имён frontend\Codeception\Module, а классы Actor — в пространстве имён frontend.

После того, как каждое из ваших приложений (пакетов) получит своё пространство имён и разные классы Helper или Actor, вы можете запустить все тесты в одном исполнителе. Запустите тесты Codeception как обычно, используя ранее созданную мета-конфигурацию:

php vendor/bin/codecept run

Это запустит наборы тестов для всех трёх приложений и объединит отчёты из них. Это очень полезно, когда вы запускаете свои тесты на сервере непрерывной интеграции и хотите получить один отчёт в формате JUnit и HTML. Отчёт о покрытии кода также будет объединён.

Если вы хотите запустить конкретный набор из приложения, вы можете выполнить:

 vendor/bin/codecept run unit -c frontend

Где unit — имя набора, а опция -c указывает путь к файлу конфигурации codeception.yml для использования. В этом примере мы будем предполагать, что существует файл конфигурации frontend/codeception.yml и что мы будем запускать unit-тесты только для этого приложения.

Bootstrap

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

Глобальный Bootstrap

Чтобы запустить скрипт bootstrap перед всеми наборами, поместите его в каталог tests (также поддерживаются абсолютные пути). Затем задайте ключ конфигурации bootstrap в codeception.yml:

yml
# file will be loaded from tests/bootstrap.php
bootstrap: bootstrap.php

Bootstrap набора

Чтобы запустить скрипт для определённого набора, поместите его в каталог набора и добавьте в конфигурацию набора:

yml
# inside <suitename>.suite.yml
# file will be loaded from tests/<suitename>/bootstrap.php
bootstrap: bootstrap.php

Bootstrap "на лету"

Скрипт bootstrap может быть выполнен с опцией --bootstrap для команды codecept run:

 vendor/bin/codecept run --bootstrap bootstrap.php

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

Bootstrap — это классический способ выполнения пользовательского PHP-кода перед тестами. Однако мы рекомендуем использовать расширения вместо скриптов bootstrap для большей гибкости. Если вам нужна конфигурация, условное включение или отключение скрипта bootstrap, расширения будут работать для вас лучше.

Расширение

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

По умолчанию одно расширение RunFailed уже включено в вашей глобальной конфигурации codeception.yml. Оно позволяет повторно запускать не пройденные тесты, используя опцию -g failed:

 vendor/bin/codecept run -g failed

В комплекте с Codeception есть встроенные расширения, расположенные в каталоге ext. Например, вы можете включить расширение Logger, чтобы регистрировать выполнение тестов с помощью Monolog:

extensions:
    enabled:
        - Codeception\Extension\RunFailed # default extension
        - Codeception\Extension\Logger: # enabled extension
            max_files: 5 # logger configuration

Но что такое расширения? По сути, это всего лишь обработчики событий, основанные на компоненте Symfony Event Dispatcher.

События

Вот события и классы событий. События упорядочены в том порядке, в котором они происходят во время выполнения. Все перечисленные события доступны как константы в классе Codeception\Events.

Событие Когда? Вызывается
suite.before Перед выполнением набора Набор, Настройки
test.start Перед выполнением теста Тест
test.before В самом начале выполнения теста Тест Codeception
step.before Перед шагом Шаг
step.after После шага Шаг
step.fail После не пройденного шага Шаг
test.fail После не пройденного теста Тест, Ошибка
test.error После завершения теста с ошибкой Тест, Ошибка
test.incomplete После выполнения неполного теста Тест, Ошибка
test.skipped После выполнения пропущенного теста Тест, Ошибка
test.success После выполнения успешного теста Тест
test.after В конце выполнения теста Тест Codeception
test.end После выполнения теста Тест
suite.after После выполнения набора Набор, Результат, Настройки
test.fail.print При выводе сообщений об ошибках теста Тест, Ошибка
result.print.after После вывода результата Результат, Печатающий компонент

Может возникнуть путаница между test.start/test.before и test.after/test.end. События начала и конца вызываются PHPUnit, а события перед и после — Codeception. Таким образом, при использовании классических тестов PHPUnit (расширенных от PHPUnit\Framework\TestCase) события перед/после для них не будут вызваны. Во время события test.before вы можете отметить тест как пропущенный или неполный, что невозможно в test.start. Подробнее об этом можно узнать из внутренних обработчиках событий Codeception.

Сам класс расширения наследуется от Codeception\Extension:

<?php
use \Codeception\Events;

class MyCustomExtension extends \Codeception\Extension
{
    // list events to listen to
    // Codeception\Events constants used to set the event

    public static $events = array(
        Events::SUITE_AFTER  => 'afterSuite',
        Events::TEST_BEFORE => 'beforeTest',
        Events::STEP_BEFORE => 'beforeStep',
        Events::TEST_FAIL => 'testFailed',
        Events::RESULT_PRINT_AFTER => 'print',
    );

    // methods that handle events

    public function afterSuite(\Codeception\Event\SuiteEvent $e) {}

    public function beforeTest(\Codeception\Event\TestEvent $e) {}

    public function beforeStep(\Codeception\Event\StepEvent $e) {}

    public function testFailed(\Codeception\Event\FailEvent $e) {}

    public function print(\Codeception\Event\PrintResultEvent $e) {}
}

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

  • write - выводит в консоль
  • writeln - выводит в консоль с символом новой строки в конце
  • getModule - позволяет получить доступ к модулю
  • hasModule - проверяет, включён ли модуль
  • getModuleNames - список всех включенных модулей
  • _reconfigure - может быть реализован вместо переопределения конструктора

Включение расширения

После реализации простого класса расширения вы можете потребовать его в tests/_bootstrap.php, загрузить его с помощью автозагрузчика Composer, определённого в composer.json, или сохранить класс внутри каталога tests/_support.

Затем вы можете включить его в codeception.yml.

extensions:
    enabled: [MyCustomExtension]

Расширения также могут быть включены по наборам внутри конфигураций наборов (например, acceptance.suite.yml) и для определённой среды.

Чтобы динамически включить расширение, выполните команду run с опцией --ext и передайте имя класса в качестве параметра:

php vendor/bin/codecept run --ext MyCustomExtension
php vendor/bin/codecept run --ext "\My\Extension"

Если класс находится в пространстве имён Codeception\Extension, вы можете пропустить его и указать только короткое имя. Так, расширение Recorder может быть запущено следующим образом:

php vendor/bin/codecept run --ext Recorder

Настройка расширения

В расширении вы можете получить доступ к текущим переданным параметрам через свойство options. Вы также можете получить доступ к глобальной конфигурации через метод \Codeception\Configuration::config(). Если вы хотите иметь пользовательские параметры для своего расширения, вы можете передать их в файл codeception.yml:

extensions:
    enabled: [MyCustomExtension]
    config:
        MyCustomExtension:
            param: value

Переданная конфигурация доступна через свойство config: $this->config['param'].

Посмотрите очень простое расширение Notifier.

Пользовательские команды

Вы можете добавить свои собственные команды в Codeception.

Ваши пользовательские команды должны реализовывать интерфейс Codeception\CustomCommandInterface, потому что должна быть функция для получения имени команды.

Вы должны зарегистрировать свою команду в файле codeception.yml:

extensions:
    commands: [Project\Command\MyCustomCommand]

Если вы хотите активировать команду глобально, потому что используете более одного файла codeception.yml, вы должны зарегистрировать свою команду в codeception.dist.yml в корневой папке вашего проекта.

См. полный пример

Объекты групп

Объекты групп — это расширения, которые отслеживают события тестов, принадлежащих к определенной группе. Когда тест добавляется в группу:

<?php
/**
 * @group admin
 */
public function testAdminCreatingNewBlogPost(\AcceptanceTester $I)
{
}

Этот тест сработает следующие события:

  • test.before.admin
  • step.before.admin
  • step.after.admin
  • test.success.admin
  • test.fail.admin
  • test.after.admin

Объект группы создается для отслеживания этих событий. Он полезен, когда для некоторых тестов требуется дополнительная настройка. Предположим, вы хотите загрузить фикстуры для тестов, которые принадлежат к группе admin:

<?php
namespace Group;

class Admin extends \Codeception\GroupObject
{
    public static $group = 'admin';

    public function _before(\Codeception\Event\TestEvent $e)
    {
        $this->writeln('inserting additional admin users...');

        $db = $this->getModule('Db');
        $db->haveInDatabase('users', ['name' => 'bill', 'role' => 'admin']);
        $db->haveInDatabase('users', ['name' => 'john', 'role' => 'admin']);
        $db->haveInDatabase('users', ['name' => 'mark', 'role' => 'banned']);
    }

    public function _after(\Codeception\Event\TestEvent $e)
    {
        $this->writeln('cleaning up admin users...');
        // ...
    }
}

Объекты групп также могут использоваться для обновления конфигурации модуля перед запуском теста. Например, для группы nocleanup мы предотвращаем обертывание модуля Doctrine2 теста в транзакцию:

<?php
    public static $group = 'nocleanup';

    public function _before(\Codeception\Event\TestEvent $e)
    {
        $this->getModule('Doctrine2')->_reconfigure(['cleanup' => false]);
    }

Класс группы можно создать с помощью команды php vendor/bin/codecept generate:group groupname. Классы групп будут храниться в каталоге tests/_support/Group.

Класс группы можно включить так же, как и класс расширения. В файле codeception.yml:

extensions:
    enabled: [Group\Admin]

Теперь класс группы Admin будет отслеживать все события тестов, которые принадлежат к группе admin.

Декораторы шагов

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

Декораторы шагов используются для реализации условных утверждений. При включении условные утверждения берут все методы, префикс которых see или dontSee, и вводят новые шаги с префиксами canSee и cantSee. В отличие от стандартных утверждений, эти утверждения не остановят тест при ошибке. Это делается путем обертывания действия в блоки try/catch.

Список доступных декораторов шагов:

  • ConditionalAssertion — неудачное утверждение будет записано в журнал, но тест продолжится.
  • TryTo — неудачное действие будет проигнорировано.
  • Retry — неудачное действие будет автоматически повторено.

Декораторы шагов можно добавить в конфигурацию набора внутри блока steps:

yml
step_decorators:
    - Codeception/Step/TryTo
    - Codeception/Step/Retry
    - Codeception/Step/ConditionalAssertion

Вы можете добавить свои декораторы шагов. Посмотрите примеры классов декораторов и создайте свой класс, который реализует интерфейс Codeception\Step\GeneratedStep. Класс должен предоставить метод getTemplate, который возвращает блок кода и переменные, переданные в шаблон. Сделайте свой класс доступным через автозагрузчик, и вы сможете использовать свои собственные декораторы шагов.

Настраиваемые репортеры

Альтернативные репортеры могут быть реализованы как расширения. Доступны расширения DotReporter и SimpleReporter. Используйте их для изменения вывода или используйте их в качестве примера для создания своего собственного репортера. Их можно легко включить с помощью параметра --ext

php vendor/bin/codecept run --ext DotReporter

Если вы хотите использовать его в качестве репортера по умолчанию, включите его в codeception.yml.

Но что делать, если вам нужно изменить формат вывода XML или JSON-результатов, сгенерированных с помощью опций --xml или --json? Codeception использует принтеры PHPUnit и переопределяет их. Если вам нужно настроить один из стандартных репортеров, вы также можете переопределить их. Если вы думаете о реализации своего собственного репортера, вы должны добавить раздел reporters в codeception.yml и переопределить один из стандартных классов принтеров своим собственным:

reporters:
    xml: Codeception\PHPUnit\Log\JUnit
    html: Codeception\PHPUnit\ResultPrinter\HTML
    report: Codeception\PHPUnit\ResultPrinter\Report

Все принтеры PHPUnit реализуют интерфейс PHPUnit_Framework_TestListener. Рекомендуется прочитать код исходного репортера перед его переопределением.

Шаблоны установки

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

Codeception имеет встроенные шаблоны установки для

  • тестов принятия
  • юнит-тестов
  • тестов REST API

Они могут быть выполнены с помощью команды init:

php vendor/bin/codecept init Acceptance

Чтобы инициализировать тесты в определённой папке, используйте параметр --path:

php vendor/bin/codecept init Acceptance --path acceptance_tests

Вам будут заданы несколько вопросов, а затем будут сгенерированы конфигурационные файлы и созданы все необходимые каталоги. Изучите примеры выше, чтобы создать собственный шаблон установки. Вот основные правила, которым вы должны следовать:

  • Шаблоны должны наследоваться от класса Codeception\InitTemplate и реализовывать метод setup.
  • Класс шаблона должен располагаться в пространстве имён Codeception\Template, чтобы Codeception мог найти их по имени класса.
  • Используйте методы, такие как say, saySuccess, sayWarning, sayError, ask, для взаимодействия с пользователем.
  • Используйте методы createDirectoryFor, createEmptyDirectory для создания каталогов.
  • Используйте методы createHelper, createActor для создания помощников и актеров.
  • Используйте генераторы Codeception для создания других вспомогательных классов.

Один запуск для нескольких приложений

Если ваш проект состоит из нескольких приложений (фронтенд, админ, API) или вы используете фреймворк Symfony с его пакетами, вас может заинтересовать запуск всех тестов для всех приложений (пакетов) в одном запуске. В этом случае вы получите один отчёт, который охватывает весь проект.

Поместите файл codeception.yml в корневую папку проекта и укажите пути к другим конфигурациям codeception.yml , которые вы хотите включить:

include:
  - frontend/src/*Bundle
  - admin
  - api/rest
paths:
  output: _output
settings:
  colors: false

Вы также должны указать путь к каталогу log, где будут сохраняться отчёты и журналы.

Для указания нескольких каталогов сразу можно использовать подстановочные знаки (*).

Заключение

Каждая из упомянутых выше функций может значительно помочь при использовании Codeception для автоматизации тестирования больших проектов, хотя некоторые функции могут потребовать продвинутых знаний PHP. Нет «лучшей практики» или «случаев использования» при обсуждении групп, расширений или других мощных функций Codeception. Если вы видите, что у вас есть проблема, которую можно решить с помощью этих расширений, попробуйте их.

  • Следующая глава: Данные >
  • Предыдущая глава: < BDD

© 2011 Michael Bodnarchuk and contributors
Licensed under the MIT License.
https://codeception.com/docs/08-Customization

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API