Spec-Zone.ru › PHPUnit 9

Расширение PHPUnit

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

Подкласс PHPUnit\Framework\TestCase

Напишите пользовательские утверждения и утилитарные методы в абстрактном подклассе PHPUnit\Framework\TestCase и получите классы своих тестовых случаев из этого класса. Это один из самых простых способов расширения PHPUnit.

Написание пользовательских утверждений

При написании пользовательских утверждений рекомендуется следовать тому, как реализованы утверждения самого PHPUnit. Как вы можете видеть в Примере 10.1, метод assertTrue() является оболочкой вокруг методов isTrue() и assertThat(): isTrue() создает объект-сопоставитель, который передается методу assertThat() для оценки.

Пример 10.1 Методы assertTrue() и isTrue() класса PHPUnit\Framework\Assert
<?php declare(strict_types=1);
namespace PHPUnit\Framework;

use PHPUnit\Framework\Constraint\IsTrue;

abstract class Assert
{
    // ...

    public static function assertTrue($condition, string $message = ''): void
    {
        static::assertThat($condition, static::isTrue(), $message);
    }

    // ...

    public static function isTrue(): IsTrue
    {
        return new IsTrue;
    }

    // ...
}

Пример 10.2 демонстрирует, как PHPUnit\Framework\Constraint\IsTrue расширяет абстрактный базовый класс для объектов-сопоставителей (или ограничений), PHPUnit\Framework\Constraint.

Пример 10.2 Класс PHPUnit\FrameworkConstraint\IsTrue
<?php declare(strict_types=1);
namespace PHPUnit\Framework\Constraint;

use PHPUnit\Framework\Constraint;

final class IsTrue extends Constraint
{
    public function toString(): string
    {
        return 'is true';
    }

    protected function matches($other): bool
    {
        return $other === true;
    }
}

Усилия по реализации методов assertTrue() и isTrue(), а также класса PHPUnit\Framework\Constraint\IsTrue, дают преимущество, что assertThat() автоматически выполняет оценку утверждения и задачи учета, такие как подсчет для статистики. Кроме того, метод isTrue() может использоваться в качестве сопоставителя при настройке объектов-моков.

Расширение TestRunner

Тестовый запуск PHPUnit можно расширить, зарегистрировав объекты, реализующие один или несколько из следующих интерфейсов:

  • AfterIncompleteTestHook
  • AfterLastTestHook
  • AfterRiskyTestHook
  • AfterSkippedTestHook
  • AfterSuccessfulTestHook
  • AfterTestErrorHook
  • AfterTestFailureHook
  • AfterTestWarningHook
  • AfterTestHook
  • BeforeFirstTestHook
  • BeforeTestHook

Каждый «хук», то есть каждый из перечисленных выше интерфейсов, представляет собой событие, которое может произойти во время выполнения тестов.

См. Элемент <extensions> для получения подробной информации о том, как регистрировать расширения в XML-конфигурации PHPUnit.

Пример 10.3 показывает пример расширения, реализующего BeforeFirstTestHook и AfterLastTestHook:

Пример 10.3 Пример расширения TestRunner
<?php declare(strict_types=1);
namespace Vendor;

use PHPUnit\Runner\BeforeFirstTestHook;
use PHPUnit\Runner\AfterLastTestHook;

final class MyExtension implements BeforeFirstTestHook, AfterLastTestHook
{
    public function executeBeforeFirstTest(): void
    {
        // called before the first test is being run
    }

    public function executeAfterLastTest(): void
    {
        // called after the last test has been run
    }
}

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

Вы можете настроить расширения PHPUnit, если расширение принимает значения конфигурации.

Пример 10.4 показывает пример того, как сделать расширение настраиваемым, добавив определение __constructor() в класс расширения:

Пример 10.4 Расширение TestRunner с конструктором
<?php declare(strict_types=1);
namespace Vendor;

use PHPUnit\Runner\BeforeFirstTestHook;
use PHPUnit\Runner\AfterLastTestHook;

final class MyConfigurableExtension implements BeforeFirstTestHook, AfterLastTestHook
{
    protected $config_value_1 = '';

    protected $config_value_2 = 0;

    public function __construct(string $value1 = '', int $value2 = 0)
    {
        $this->config_value_1 = $config_1;
        $this->config_value_2 = $config_2;
    }

    public function executeBeforeFirstTest(): void
    {
        if (strlen($this->config_value_1) {
            echo 'Testing with configuration value: ' . $this->config_value_1;
        }
    }

    public function executeAfterLastTest(): void
    {
        if ($this->config_value_2 > 10) {
            echo 'Second config value is OK!';
        }
    }
}

Чтобы ввести конфигурацию в расширение через XML, необходимо обновить раздел extensions файла XML-конфигурации, добавив значения конфигурации, как показано в Примере 10.5:

Пример 10.5 Конфигурация расширения TestRunner
<extensions>
    <extension class="Vendor\MyUnconfigurableExtension" />
    <extension class="Vendor\MyConfigurableExtension">
        <arguments>
            <string>Hello world!</string>
            <int>15</int>
        </arguments>
    </extension>
</extensions>

См. Элемент <arguments> для получения подробной информации о том, как использовать конфигурацию arguments.

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

© 2005–2020 Sebastian Bergmann
Licensed under the Creative Commons Attribution 3.0 Unported License.
https://phpunit.readthedocs.io/en/9.5/extending-phpunit.html

Spec-Zone.ru

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