Spec-Zone.ru › PHPUnit

Атрибуты

Атрибуты — это «форма структурированных синтаксических метаданных для объявлений классов, свойств, функций, методов, параметров и констант. Атрибуты позволяют определять директивы конфигурации непосредственно в объявлении соответствующего кода».

Все атрибуты, поддерживаемые PHPUnit, объявлены в пространстве имен PHPUnit\Framework\Attributes. Они описаны в этом приложении.

Test

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Вместо того чтобы добавлять к именам тестовых методов префикс test, можно пометить метод как тестовый с помощью атрибута Test.

Пример 2.12 Использование атрибута Test
<?php declare(strict_types=1);
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;

final class ExampleTest extends TestCase
{
    #[Test]
    public function it_does_something(): void
    {
        // ...
    }
}

AllowMockObjectsWithoutExpectations

Уровень класса

Уровень метода

Повторяемый

да

нет

нет

С помощью атрибута AllowMockObjectsWithoutExpectations можно отключить проверку, которая выдает предупреждение для объектов-заглушек без ожиданий.

DisableReturnValueGenerationForTestDoubles

Уровень класса

Уровень метода

Повторяемый

да

нет

нет

Атрибут DisableReturnValueGenerationForTestDoubles отключает генерацию возвращаемых значений для тестовых двойников, созданных с помощью createMock(), createMockForIntersectionOfInterfaces(), createPartialMock(), createStub() и createStubForIntersectionOfInterfaces(), во всех тестах класса тестового сценария.

DoesNotPerformAssertions

Уровень класса

Уровень метода

Повторяемый

да

да

нет

По умолчанию PHPUnit считает рискованным тест, который не выполняет проверок и не задает ожидания для объектов-заглушек. Это поведение можно отключить с помощью атрибута DoesNotPerformAssertions.

IgnoreDeprecations

Уровень класса

Уровень метода

Повторяемый

да

да

нет

Атрибут IgnoreDeprecations позволяет настроить обработчик ошибок PHPUnit так, чтобы он не генерировал события для ошибок E_DEPRECATED и E_USER_DEPRECATED.

WithoutErrorHandler

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Атрибут WithoutErrorHandler отключает обработчик ошибок PHPUnit для тестового метода.

Предупреждение

Функции PHPUnit, для работы которых обработчик ошибок PHPUnit должен быть активен во время выполнения тестового метода, не будут работать, если обработчик ошибок PHPUnit отключен. Ошибки E_(USER_)*, вызванные PHP, не будут обрабатываться PHPUnit, когда его обработчик ошибок отключен.

Отключать обработчик ошибок PHPUnit следует только в том случае, если он мешает тестируемому коду, например когда код использует error_get_last() для реакции на ошибки E_(USER_)*, вызванные PHP.

IgnorePhpunitWarnings

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Атрибут IgnorePhpunitWarnings(null|string $messagePattern = null) позволяет подавлять предупреждения PHPUnit для тестового метода. Если задан $messagePattern, подавляются только предупреждения, сообщения которых соответствуют указанному шаблону регулярного выражения.

Покрытие кода

CoversClass

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут CoversClass(string $className) позволяет указать, что тест предназначен для покрытия указанного класса.

CoversClassesThatImplementInterface

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут CoversClassesThatImplementInterface(string $interfaceName) позволяет указать, что тест предназначен для покрытия реализаций указанного интерфейса.

CoversClassesThatExtendClass

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут CoversClassesThatExtendClass(string $className) позволяет указать, что тест предназначен для покрытия дочерних классов указанного родительского класса.

CoversTrait

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут CoversTrait(string $traitName) позволяет указать, что тест предназначен для покрытия указанного трейта.

CoversMethod

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут CoversMethod(string $className, string $methodName) позволяет указать, что тест предназначен для покрытия указанного метода.

CoversFunction

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут CoversFunction(string $functionName) позволяет указать, что тест предназначен для покрытия указанной функции.

CoversNamespace

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут CoversNamespace(string $namespace) позволяет указать, что тест предназначен для покрытия кода в указанном пространстве имен.

CoversNothing

Уровень класса

Уровень метода

Повторяемый

да

да

нет

Атрибут CoversNothing() позволяет указать, что тест не предназначен для учета покрытия кода.

UsesClass

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут UsesClass(string $className) позволяет указать, что тест допускает выполнение кода в указанном классе, но не предназначен для его покрытия. Это важно для предотвращения непреднамеренного покрытия кода.

UsesClassesThatImplementInterface

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут UsesClassesThatImplementInterface(string $interfaceName) позволяет указать, что тест допускает выполнение кода в классах, реализующих указанный интерфейс, но не предназначен для его покрытия. Это важно для предотвращения непреднамеренного покрытия кода.

UsesClassesThatExtendClass

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут UsesClassesThatExtendClass(string $className) позволяет указать, что тест допускает выполнение кода в дочерних классах, расширяющих указанный родительский класс, но не предназначен для его покрытия. Это важно для предотвращения непреднамеренного покрытия кода.

UsesTrait

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут UsesTrait(string $traitName) позволяет указать, что тест допускает выполнение кода в указанном трейте, но не предназначен для его покрытия. Это важно для предотвращения непреднамеренного покрытия кода.

UsesMethod

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут UsesMethod(string $className) позволяет указать, что тест допускает выполнение кода в указанном методе, но не предназначен для его покрытия. Это важно для предотвращения непреднамеренного покрытия кода.

UsesFunction

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут UsesFunction(string $functionName) позволяет указать, что тест допускает выполнение кода в указанной глобальной функции, но не предназначен для ее покрытия. Это важно для предотвращения непреднамеренного покрытия кода.

UsesNamespace

Уровень класса

Уровень метода

Повторяемый

да

нет

да

Атрибут UsesNamespace(string $namespace) позволяет указать, что тест допускает выполнение кода в указанном пространстве имен, но не предназначен для его покрытия. Это важно для предотвращения непреднамеренного покрытия кода.

Поставщик данных

DataProvider

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DataProvider(string $methodName, bool $validateArgumentCount = true, bool $skipWhenEmpty = false) можно использовать для тестового метода, чтобы указать статический метод, объявленный в том же классе, что и тестовый метод, в качестве поставщика данных.

По умолчанию PHPUnit сообщает об ошибке, если поставщик данных не возвращает ни одного набора данных. Если задать для skipWhenEmpty значение true, тест вместо этого будет помечен как пропущенный. Это полезно, когда поставщик данных в некоторых средах закономерно не возвращает наборы данных, например если данные зависят от необязательных тестовых фикстур или особенностей платформы.

DataProviderExternal

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DataProviderExternal(string $className, string $methodName, bool $validateArgumentCount = true, bool $skipWhenEmpty = false) можно использовать для тестового метода, чтобы указать статический метод, объявленный в другом классе, в качестве поставщика данных.

Как и в случае с DataProvider, если задать для skipWhenEmpty значение true, тест будет помечен как пропущенный, если поставщик данных не вернет наборы данных, вместо того чтобы сообщать об ошибке.

DataProviderClosure

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DataProviderClosure(Closure $closure, bool $validateArgumentCount = true) позволяет определить поставщика данных для тестового метода с помощью статической замыкающей функции вместо отдельного статического метода.

Замыкающая функция должна возвращать итерируемую структуру (массив или Traversable), содержащую массивы. Каждая запись массива задает аргументы для одного вызова тестового метода.

Пример 2.13 Использование атрибута DataProviderClosure
<?php declare(strict_types=1);
use PHPUnit\Framework\Attributes\DataProviderClosure;
use PHPUnit\Framework\TestCase;

final class DataTest extends TestCase
{
    #[DataProviderClosure(static function (): array {
        return [[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 2]];
    })]
    public function testAdd(int $a, int $b, int $expected): void
    {
        $this->assertSame($expected, $a + $b);
    }
}

Наборам данных можно присваивать имена, указав строковые ключи в возвращаемом массиве:

Пример 2.14 Использование атрибута DataProviderClosure с именованными наборами данных
#[DataProviderClosure(static function (): array {
    return [
        'zeros'        => [0, 0, 0],
        'one plus one' => [1, 1, 2],
    ];
})]
public function testAdd(int $a, int $b, int $expected): void
{
    $this->assertSame($expected, $a + $b);
}

По умолчанию PHPUnit выдает предупреждение, если набор данных содержит больше аргументов, чем принимает тестовый метод. Это предупреждение можно отключить, задав для validateArgumentCount значение false:

Пример 2.15 Отключение проверки количества аргументов
#[DataProviderClosure(static function (): array {
    return [[1, 2, 3]];
}, validateArgumentCount: false)]
public function testOne(int $a, int $b): void
{
    $this->assertGreaterThan(0, $a + $b);
}

TestWith

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут TestWith(array $data) позволяет определить поставщика данных для тестового метода без реализации статического метода-поставщика данных.

Пример 2.16 Использование атрибута TestWith
<?php declare(strict_types=1);
use PHPUnit\Framework\Attributes\TestWith;
use PHPUnit\Framework\TestCase;

final class DataTest extends TestCase
{
    #[TestWith([0, 0, 0])]
    #[TestWith([0, 1, 1])]
    #[TestWith([1, 0, 1])]
    #[TestWith([1, 1, 3])]
    public function testAdd(int $a, int $b, int $expected): void
    {
        $this->assertSame($expected, $a + $b);
    }
}

При запуске показанного выше теста выводится результат, приведенный ниже:

./tools/phpunit tests/DataTest.php
PHPUnit 13.2.0 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.2

...F                                                                4 / 4 (100%)

Time: 00:00.058, Memory: 8.00 MB

There was 1 failure:

1) DataTest::testAdd with data set #3
Failed asserting that 2 is identical to 3.

/path/to/DataTest.php:10

FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

TestWithJson

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут TestWithJson(string $json) позволяет определить поставщика данных для тестового метода без реализации статического метода-поставщика данных.

Пример 2.17 Использование атрибута TestWithJson
<?php declare(strict_types=1);
use PHPUnit\Framework\Attributes\TestWithJson;
use PHPUnit\Framework\TestCase;

final class DataTest extends TestCase
{
    #[TestWithJson('[0, 0, 0]')]
    #[TestWithJson('[0, 1, 1]')]
    #[TestWithJson('[1, 0, 1]')]
    #[TestWithJson('[1, 1, 3]')]
    public function testAdd(int $a, int $b, int $expected): void
    {
        $this->assertSame($expected, $a + $b);
    }
}

При запуске показанного выше теста выводится результат, приведенный ниже:

./tools/phpunit tests/DataTest.php
PHPUnit 13.2.0 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.2

...F                                                                4 / 4 (100%)

Time: 00:00.058, Memory: 8.00 MB

There was 1 failure:

1) DataTest::testAdd with data set #3
Failed asserting that 2 is identical to 3.

/path/to/DataTest.php:10

FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

Зависимости тестов

Depends

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут Depends(string $methodName) можно использовать, чтобы указать, что тест зависит от другого теста, объявленного в том же классе тестового случая.

Любое значение, передаваемое от производителя (теста, от которого зависит другой тест) потребителю (зависящему тесту), передаётся без клонирования.

DependsUsingDeepClone

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DependsUsingDeepClone(string $methodName) можно использовать, чтобы указать, что тест зависит от другого теста, объявленного в том же классе тестового случая.

Любое значение, передаваемое от производителя (теста, от которого зависит другой тест) потребителю (зависящему тесту), передаётся после глубокого клонирования.

DependsUsingShallowClone

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DependsUsingShallowClone(string $methodName) можно использовать, чтобы указать, что тест зависит от другого теста, объявленного в том же классе тестового случая.

Любое значение, передаваемое от производителя (теста, от которого зависит другой тест) потребителю (зависящему тесту), передаётся после поверхностного клонирования.

DependsExternal

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DependsExternal(string $className, string $methodName) можно использовать, чтобы указать, что тест зависит от другого теста, объявленного в другом классе тестового случая.

Любое значение, передаваемое от производителя (теста, от которого зависит другой тест) потребителю (зависящему тесту), передаётся без клонирования.

DependsExternalUsingDeepClone

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DependsExternalUsingDeepClone(string $className, string $methodName) можно использовать, чтобы указать, что тест зависит от другого теста, объявленного в другом классе тестового случая.

Любое значение, передаваемое от производителя (теста, от которого зависит другой тест) потребителю (зависящему тесту), передаётся после глубокого клонирования.

DependsExternalUsingShallowClone

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DependsExternalUsingShallowClone(string $className, string $methodName) можно использовать, чтобы указать, что тест зависит от другого теста, объявленного в другом классе тестового случая.

Любое значение, передаваемое от производителя (теста, от которого зависит другой тест) потребителю (зависящему тесту), передаётся после поверхностного клонирования.

DependsOnClass

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DependsOnClass(string $className) можно использовать, чтобы указать, что тест зависит от всех тестов другого класса тестового случая.

Любое значение, передаваемое от производителя (теста, от которого зависит другой тест) потребителю (зависящему тесту), передаётся без клонирования.

DependsOnClassUsingDeepClone

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DependsOnClassUsingDeepClone(string $className) можно использовать, чтобы указать, что тест зависит от всех тестов другого класса тестового случая.

Любое значение, передаваемое от производителя (теста, от которого зависит другой тест) потребителю (зависящему тесту), передаётся после глубокого клонирования.

DependsOnClassUsingShallowClone

Уровень класса

Уровень метода

Повторяемый

нет

да

да

Атрибут DependsOnClassUsingShallowClone(string $className) можно использовать, чтобы указать, что тест зависит от всех тестов другого класса тестового случая.

Любое значение, передаваемое от производителя (теста, от которого зависит другой тест) потребителю (зависящему тесту), передаётся после поверхностного клонирования.

TestDox

Подробное описание функциональности TestDox см. в разделе TestDox.

TestDox

Уровень класса

Уровень метода

Повторяемый

да

да

нет

Атрибут TestDox(string $text) можно использовать для настройки текста, выводимого для теста при включённом выводе TestDox.

Пример 2.18 Использование атрибута TestDox
<?php declare(strict_types=1);
use PHPUnit\Framework\Attributes\TestDox;
use PHPUnit\Framework\TestCase;

final class ExampleTest extends TestCase
{
    #[TestDox('It does something')]
    public function testOne(): void
    {
        // ...
    }
}

При запуске приведённого выше теста с включённым выводом TestDox получается следующий результат:

$ ./tools/phpunit --no-progress --testdox tests/ExampleTest.php
PHPUnit 13.2.0 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.2

Time: 00:00.057, Memory: 6.00 MB

Example
 ✔ It does something

OK (1 test, 1 assertion)

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

Пример 2.19 Использование атрибута TestDox вместе с поставщиками данных
<?php declare(strict_types=1);
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\TestDox;
use PHPUnit\Framework\TestCase;

final class ExampleTest extends TestCase
{
    #[DataProvider('additionProvider')]
    #[TestDox('Adding $a to $b results in $expected')]
    public function testAdd(int $expected, int $a, int $b)
    {
        $this->assertSame($expected, $a + $b);
    }

    public static function additionProvider()
    {
        return [
            'data set 1' => [0, 0, 0],
            'data set 2' => [1, 0, 1],
            'data set 3' => [1, 1, 0],
            'data set 4' => [3, 1, 1]
        ];
    }
}

При запуске приведённого выше теста с включённым выводом TestDox получается следующий результат:

$ ./tools/phpunit --no-progress --testdox tests/ExampleTest.php
PHPUnit 13.2.0 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.2

Time: 00:00.116, Memory: 8.00 MB

Example
 ✔ Adding 0 to 0 results in 0
 ✔ Adding 1 to 0 results in 1
 ✔ Adding 0 to 1 results in 1
 ✘ Adding 1 to 1 results in 3
   │
   │ Failed asserting that 2 is identical to 3.
   │
   │ /path/to/ExampleTest.php:12
   │

FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

Кроме того, доступен $_dataName, содержащий имя текущего набора данных. В приведённом выше примере это будут data set 1 и data set 4.

TestDoxFormatter

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Атрибут TestDoxFormatter(string $methodName) можно использовать для метода теста, чтобы указать статический метод, объявленный в том же классе, что и метод теста, в качестве форматировщика TestDox.

Пример 2.20 Использование атрибута TestDoxFormatter
<?php declare(strict_types=1);
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\TestDoxFormatter;
use PHPUnit\Framework\TestCase;

final class ExampleTest extends TestCase
{
    public static function provider(): array
    {
        return [
            [
                new DateTimeImmutable('2025-08-01'),
                new DateTimeImmutable('2025-08-01'),
            ]
        ];
    }

    public static function formatter(DateTimeImmutable $expected, DateTimeImmutable $actual): string
    {
        return sprintf(
            '%s is expected to be %s',
            $actual->format('Y-m-d'),
            $expected->format('Y-m-d'),
        );
    }

    #[DataProvider('provider')]
    #[TestDoxFormatter('formatter')]
    public function testOne(DateTimeImmutable $expected, DateTimeImmutable $actual): void
    {
        $this->assertEquals($expected, $actual);
    }
}

При запуске приведённого выше теста с включённым выводом TestDox получается следующий результат:

$ ./tools/phpunit --no-progress --testdox tests/ExampleTest.php
PHPUnit 13.2.0 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.4.10

Time: 00:00.224, Memory: 25.77 MB

Example
 ✔ 2025-08-01 is expected to be 2025-08-01

OK (1 test, 1 assertion)

TestDoxFormatterExternal

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Атрибут TestDoxFormatterExternal(string $className, string $methodName) можно использовать для метода теста, чтобы указать статический метод, объявленный в другом классе, в качестве форматировщика TestDox.

Группы тестов

Group

Уровень класса

Уровень метода

Повторяемый

да

да

да

Атрибут Group(string $name) можно использовать для добавления тестов в группы тестов.

Группы, например, можно использовать, чтобы выбрать, какие тесты следует запускать.

Строки small, medium и large нельзя использовать в качестве имён групп.

Small

Уровень класса

Уровень метода

Повторяемый

да

нет

нет

Атрибут Small помечает тесты класса тестового случая как небольшие. Эти тесты добавляются в специальную группу тестов с именем small, имеющую особую семантику.

Размер теста имеет значение, например, при ограничении времени выполнения теста.

В отчёте HTML о покрытии кода строки кода, покрытые тестами, помеченными как небольшие, выделяются более тёмным оттенком зелёного по сравнению с тестами, помеченными как средние или большие.

Medium

Уровень класса

Уровень метода

Повторяемый

да

нет

нет

Атрибут Medium помечает тесты класса тестового случая как средние. Эти тесты добавляются в специальную группу тестов с именем medium, имеющую особую семантику.

Размер теста имеет значение, например, при ограничении времени выполнения теста.

В отчёте HTML о покрытии кода строки кода, покрытые тестами, помеченными как средние, выделяются более тёмным оттенком зелёного по сравнению с тестами, помеченными как большие, и более светлым оттенком зелёного по сравнению с тестами, помеченными как небольшие.

Large

Уровень класса

Уровень метода

Повторяемый

да

нет

нет

Атрибут Large помечает тесты класса тестового случая как большие. Эти тесты добавляются в специальную группу тестов с именем large, имеющую особую семантику.

Размер теста имеет значение, например, при ограничении времени выполнения теста.

В отчёте HTML о покрытии кода строки кода, покрытые тестами, помеченными как большие, выделяются более светлым оттенком зелёного по сравнению с тестами, помеченными как средние или небольшие.

Ticket

Уровень класса

Уровень метода

Повторяемый

да

да

да

Атрибут Ticket(string $text) является псевдонимом Group(string $text).

Шаблонные методы

BeforeClass

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Атрибут BeforeClass(int $priority = 0) можно использовать, чтобы указать, что открытый статический метод следует вызвать перед запуском первого метода теста класса тестового случая. Это та же фаза, на которой вызывается метод с именем setUpBeforeClass(). Такие методы называются методами «перед тестовым классом».

Если в классе тестового случая есть несколько методов с атрибутом BeforeClass, по умолчанию средство запуска тестов предполагает, что порядок вызова этих методов не имеет значения. Если это предположение неверно и порядок вызова важен, необязательный аргумент $priority атрибута (неотрицательное целое число) можно использовать, чтобы задать требуемый порядок вызова: метод с большим значением $priority вызывается раньше метода с меньшим значением $priority.

Before

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Атрибут Before(int $priority = 0) можно использовать, чтобы указать, что защищённый нестатический метод следует вызывать перед запуском каждого метода теста класса тестового случая. Это та же фаза, на которой вызывается метод с именем setUp(). Такие методы называются методами «перед тестом».

Если в классе тестового случая есть несколько методов с атрибутом Before, по умолчанию средство запуска тестов предполагает, что порядок вызова этих методов не имеет значения. Если это предположение неверно и порядок вызова важен, необязательный аргумент $priority атрибута (неотрицательное целое число) можно использовать, чтобы задать требуемый порядок вызова: метод с большим значением $priority вызывается раньше метода с меньшим значением $priority.

PreCondition

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Атрибут PreCondition(int $priority = 0) можно использовать, чтобы указать, что защищённый нестатический метод следует вызывать перед запуском каждого метода теста (но после всех методов «перед тестом») класса тестового случая. Это та же фаза, на которой вызывается метод с именем assertPreConditions(). Такие методы называются методами «предварительного условия».

Если в классе тестового случая есть несколько методов с атрибутом PreCondition, по умолчанию средство запуска тестов предполагает, что порядок вызова этих методов не имеет значения. Если это предположение неверно и порядок вызова важен, необязательный аргумент $priority атрибута (неотрицательное целое число) можно использовать, чтобы задать требуемый порядок вызова: метод с большим значением $priority вызывается раньше метода с меньшим значением $priority.

PostCondition

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Атрибут PostCondition(int $priority = 0) можно использовать, чтобы указать, что защищённый нестатический метод следует вызывать после запуска каждого метода теста (но до всех методов «после теста») класса тестового случая. Это та же фаза, на которой вызывается метод с именем assertPostConditions(). Такие методы называются методами «постусловия».

Если в классе тестового случая есть несколько методов с атрибутом PostCondition, по умолчанию средство запуска тестов предполагает, что порядок вызова этих методов не имеет значения. Если это предположение неверно и порядок вызова важен, необязательный аргумент $priority атрибута (неотрицательное целое число) можно использовать, чтобы задать требуемый порядок вызова: метод с большим значением $priority вызывается раньше метода с меньшим значением $priority.

After

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Атрибут After(int $priority = 0) можно использовать, чтобы указать, что защищённый нестатический метод следует вызывать после запуска каждого метода теста класса тестового случая. Это та же фаза, на которой вызывается метод с именем tearDown(). Такие методы называются методами «после теста».

Если в классе тестового случая есть несколько методов с атрибутом After, по умолчанию средство запуска тестов предполагает, что порядок вызова этих методов не имеет значения. Если это предположение неверно и порядок вызова важен, необязательный аргумент $priority атрибута (неотрицательное целое число) можно использовать, чтобы задать требуемый порядок вызова: метод с большим значением $priority вызывается раньше метода с меньшим значением $priority.

AfterClass

Уровень класса

Уровень метода

Повторяемый

нет

да

нет

Атрибут AfterClass(int $priority = 0) можно использовать, чтобы указать, что открытый статический метод следует вызвать после запуска последнего метода теста класса тестового случая. Это та же фаза, на которой вызывается метод с именем tearDownAfterClass(). Такие методы называются методами «после тестового класса».

Если в классе тестового случая есть несколько методов с атрибутом AfterClass, по умолчанию средство запуска тестов предполагает, что порядок вызова этих методов не имеет значения. Если это предположение неверно и порядок вызова важен, необязательный аргумент $priority атрибута (неотрицательное целое число) можно использовать, чтобы задать требуемый порядок вызова: метод с большим значением $priority вызывается раньше метода с меньшим значением $priority.

Изоляция тестов

BackupGlobals

Уровень класса

Уровень метода

Можно повторять

да

да

нет

Атрибут BackupGlobals можно использовать, чтобы указать, что перед тестом необходимо сохранить значения глобальных и суперглобальных переменных, а после выполнения теста восстановить их.

ExcludeGlobalVariableFromBackup

Уровень класса

Уровень метода

Можно повторять

да

да

да

Атрибут ExcludeGlobalVariableFromBackup($globalVariableName) можно использовать, чтобы исключить указанную глобальную переменную из операций сохранения и восстановления глобальных и суперглобальных переменных.

BackupStaticProperties

Уровень класса

Уровень метода

Можно повторять

да

да

нет

Атрибут BackupStaticProperties можно использовать, чтобы указать, что статические свойства классов необходимо сохранить перед тестом, а после выполнения теста восстановить.

ExcludeStaticPropertyFromBackup

Уровень класса

Уровень метода

Можно повторять

да

да

да

Атрибут ExcludeStaticPropertyFromBackup(string $className, string $propertyName) можно использовать, чтобы исключить указанное статическое свойство из операций сохранения и восстановления статических свойств классов.

RunInSeparateProcess

Уровень класса

Уровень метода

Можно повторять

нет

да

нет

Атрибут RunInSeparateProcess можно использовать, чтобы указать, что тест следует запускать в отдельном процессе.

RunTestsInSeparateProcesses

Уровень класса

Уровень метода

Можно повторять

да

нет

нет

Атрибут RunTestsInSeparateProcesses можно использовать, чтобы указать, что все тесты класса тестового случая следует запускать в отдельных процессах (по одному отдельному процессу на тест).

Этот атрибут наследуется от родительских классов: если родительский класс аннотирован атрибутом #[RunTestsInSeparateProcesses], все дочерние классы также будут запускать свои тесты в отдельных процессах.

RunClassInSeparateProcess

Уровень класса

Уровень метода

Можно повторять

да

нет

нет

Атрибут RunClassInSeparateProcess можно использовать, чтобы указать, что все тесты класса тестового случая следует запускать в одном отдельном процессе.

PreserveGlobalState

Уровень класса

Уровень метода

Можно повторять

да

да

нет

Атрибут PreserveGlobalState(bool $enabled) можно использовать, чтобы указать, следует ли передавать глобальное состояние основного процесса запуска PHPUnit в дочерний процесс при запуске теста в отдельном процессе.

WithEnvironmentVariable

Уровень класса

Уровень метода

Можно повторять

да

да

да

Атрибут WithEnvironmentVariable(string $environmentVariableName, ?string $value = null) можно использовать, чтобы задать переменную окружения на время выполнения теста. Переменная окружения задаётся до вызова методов, выполняемых перед тестом, например `setUp(), и восстанавливает исходное значение после вызова методов, выполняемых после теста, например tearDown().

При использовании на уровне класса переменная окружения задаётся для всех тестов этого класса. При использовании на уровне метода она применяется только к этому методу теста. Атрибут на уровне метода переопределяет атрибут на уровне класса для той же переменной окружения.

Пример 2.21 Использование атрибута WithEnvironmentVariable
<?php declare(strict_types=1);
use PHPUnit\Framework\Attributes\WithEnvironmentVariable;
use PHPUnit\Framework\TestCase;

#[WithEnvironmentVariable('APP_ENV', 'testing')]
final class EnvironmentTest extends TestCase
{
    public function testAppEnvIsSetFromClassAttribute(): void
    {
        $this->assertSame('testing', $_ENV['APP_ENV']);
        $this->assertSame('testing', getenv('APP_ENV'));
    }

    #[WithEnvironmentVariable('APP_ENV', 'production')]
    public function testAppEnvIsOverriddenByMethodAttribute(): void
    {
        $this->assertSame('production', $_ENV['APP_ENV']);
        $this->assertSame('production', getenv('APP_ENV'));
    }

    #[WithEnvironmentVariable('APP_DEBUG', 'true')]
    public function testAdditionalVariableFromMethodAttribute(): void
    {
        $this->assertSame('testing', $_ENV['APP_ENV']);
        $this->assertSame('true', $_ENV['APP_DEBUG']);
    }
}

Если $value равно null (или не указано), переменная окружения удаляется на время выполнения теста:

Пример 2.22 Удаление переменной окружения на время выполнения теста
#[WithEnvironmentVariable('APP_ENV')]
public function testAppEnvIsNotSet(): void
{
    $this->assertFalse(isset($_ENV['APP_ENV']));
    $this->assertFalse(getenv('APP_ENV'));
}

Переменная окружения задаётся и в $_ENV, и через putenv(), поэтому доступна через оба механизма: $_ENV и getenv(). После теста восстанавливается исходное состояние.

Если для одного имени переменной указано несколько атрибутов WithEnvironmentVariable, действует последний.

Пропуск тестов

Атрибуты Requires*, описанные в этом разделе, представляют собой удобный способ заменить пользовательскую логику пропуска в методах before-class или before-test для распространённых случаев. Для логики пропуска, выходящей за рамки возможностей этих атрибутов, используйте markTestSkipped() в методе setUp() или setUpBeforeClass() (или в методе, настроенном с помощью атрибута #[Before] или #[BeforeClass]).

RequiresPhp

Уровень класса

Уровень метода

Можно повторять

да

да

нет

Атрибут RequiresPhp(string $versionRequirement) можно использовать, чтобы пропустить выполнение теста, если версия PHP, используемая для запуска PHPUnit, не соответствует указанному требованию к версии.

$versionRequirement должно иметь одно из следующих значений:

  • Строка с номером версии, перед которой стоит оператор сравнения, поддерживаемый функцией PHP version_compare(): >=, >, <=, <, == или !=

  • Ограничение версии в синтаксисе Composer (например, ^8.3, ~8.3.0, >=8.3 <8.5)

Ниже приведены примеры:

  • #[RequiresPhp('>= 8.3')] — PHP 8.3.0 или новее

  • #[RequiresPhp('^8.3')] — PHP 8.3.0 или новее, но ниже 9.0.0 (синтаксис Composer)

  • #[RequiresPhp('~8.3.0')] — PHP 8.3.0 или новее, но ниже 8.4.0 (синтаксис Composer)

RequiresPhpExtension

Уровень класса

Уровень метода

Можно повторять

да

да

да

Атрибут RequiresPhpExtension(string $extension[, string $versionRequirement]) можно использовать, чтобы пропустить выполнение теста, если указанное расширение PHP недоступно. Необязательный аргумент $versionRequirement можно использовать, чтобы задать требование к версии этого расширения PHP в том же формате, который описан здесь.

Ниже приведены примеры:

  • #[RequiresPhpExtension('mysqli')]

  • #[RequiresPhpExtension('mysqli', '>= 8.3.0')]

  • #[RequiresPhpExtension('mysqli', '^8.3')]

RequiresSetting

Уровень класса

Уровень метода

Можно повторять

да

да

да

Атрибут RequiresSetting(string $setting, string $value) можно использовать, чтобы пропустить выполнение теста, если указанная настройка конфигурации PHP не имеет ожидаемого значения.

RequiresPhpunit

Уровень класса

Уровень метода

Можно повторять

да

да

нет

Атрибут RequiresPhpunit(string $versionRequirement) можно использовать, чтобы пропустить выполнение теста, если версия PHPUnit не соответствует указанному требованию к версии.

$versionRequirement использует тот же формат, который описан здесь.

Ниже приведены примеры:

  • #[RequiresPhpunit('>= 10.1.0')]

  • #[RequiresPhpunit('^10.1')]

RequiresPhpunitExtension

Уровень класса

Уровень метода

Можно повторять

да

да

да

Атрибут RequiresPhpunitExtension(string $extensionClass) можно использовать, чтобы пропустить выполнение теста, если расширение PHPUnit, определяемое по его bootstrap-классу, недоступно.

RequiresFunction

Уровень класса

Уровень метода

Можно повторять

да

да

да

Атрибут RequiresFunction(string $functionName) можно использовать, чтобы пропустить выполнение теста, если указанная глобальная функция не объявлена.

RequiresMethod

Уровень класса

Уровень метода

Можно повторять

да

да

да

Атрибут RequiresMethod(string $className, string $methodName) можно использовать, чтобы пропустить выполнение теста, если указанный метод не объявлен.

RequiresOperatingSystem

Уровень класса

Уровень метода

Можно повторять

да

да

нет

Атрибут RequiresOperatingSystem(string $regularExpression) можно использовать, чтобы пропустить выполнение теста, если указанное регулярное выражение не соответствует значению константы PHP_OS, предоставляемой PHP.

RequiresOperatingSystemFamily

Уровень класса

Уровень метода

Можно повторять

да

да

нет

Атрибут RequiresOperatingSystemFamily(string $operatingSystemFamily) можно использовать, чтобы пропустить выполнение теста, если указанная строка не совпадает в точности со значением константы PHP_OS_FAMILY, предоставляемой PHP.

RequiresEnvironmentVariable

Уровень класса

Уровень метода

Можно повторять

да

да

да

Атрибут RequiresEnvironmentVariable(string $environmentVariableName[, string $value]) можно использовать, чтобы пропустить выполнение теста, если указанная переменная окружения не задана. При необходимости с помощью аргумента $value можно указать обязательное значение переменной окружения.

© 2005–2026 Sebastian Bergmann
Licensed under the Creative Commons Attribution 3.0 Unported License.
https://docs.phpunit.de/en/13.2/attributes.html

Spec-Zone.ru

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