Расширение PHPUnit
PHPUnit можно расширить различными способами, чтобы упростить написание тестов и настроить обратную связь при их выполнении. Ниже приведены общие начальные точки для расширения PHPUnit.
Подкласс PHPUnit\Framework\TestCase
Создавайте пользовательские утверждения и вспомогательные методы в абстрактном подклассе PHPUnit\Framework\TestCase и наследуйте свои тестовые классы от этого класса. Это один из самых простых способов расширить PHPUnit.
Написание пользовательских утверждений
При написании пользовательских утверждений рекомендуется следовать тому, как реализованы утверждения PHPUnit. Как вы можете видеть в Примере 11.1, метод assertTrue() является обёрткой вокруг методов isTrue() и assertThat(): isTrue() создаёт объект-матчер, который передаётся в assertThat() для оценки.
<?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;
}
// ...
}
Пример 11.2 демонстрирует, как PHPUnit\Framework\Constraint\IsTrue расширяет абстрактный базовый класс для объектов-матчеров (или ограничений), PHPUnit\Framework\Constraint.
<?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 можно расширить, зарегистрировав объекты, реализующие один или несколько из следующих интерфейсов:
AfterIncompleteTestHookAfterLastTestHookAfterRiskyTestHookAfterSkippedTestHookAfterSuccessfulTestHookAfterTestErrorHookAfterTestFailureHookAfterTestWarningHookAfterTestHookBeforeFirstTestHookBeforeTestHook
Каждый «хук», то есть каждый из перечисленных интерфейсов, представляет собой событие, которое может произойти во время выполнения тестов.
См. Элемент <extensions> для получения подробной информации о том, как регистрировать расширения в конфигурации PHPUnit XML.
Пример 11.3 показывает пример расширения, реализующего BeforeFirstTestHook и AfterLastTestHook:
<?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, если расширение принимает значения конфигурации.
Пример 11.4 демонстрирует, как сделать расширение настраиваемым, добавив определение __constructor() в класс расширения:
<?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 необходимо обновить с значениями конфигурации, как показано в Примере 11.5:
<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/8.5/extending-phpunit.html