Атрибуты
Атрибуты — это «форма структурированных синтаксических метаданных для объявлений классов, свойств, функций, методов, параметров и констант. Атрибуты позволяют определять директивы конфигурации непосредственно в объявлении соответствующего кода».
Все атрибуты, поддерживаемые PHPUnit, объявлены в пространстве имен PHPUnit\Framework\Attributes. Они описаны в этом приложении.
Test
Уровень класса | Уровень метода | Повторяемый |
|---|---|---|
нет | да | нет |
Вместо того чтобы добавлять к именам тестовых методов префикс test, можно пометить метод как тестовый с помощью атрибута 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), содержащую массивы. Каждая запись массива задает аргументы для одного вызова тестового метода.
<?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);
}
}
Наборам данных можно присваивать имена, указав строковые ключи в возвращаемом массиве:
#[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:
#[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) позволяет определить поставщика данных для тестового метода без реализации статического метода-поставщика данных.
<?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) позволяет определить поставщика данных для тестового метода без реализации статического метода-поставщика данных.
<?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.
<?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 для метода теста, в котором применяется поставщик данных, параметры метода можно использовать в качестве заполнителей в альтернативном описании.
<?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.
<?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().
При использовании на уровне класса переменная окружения задаётся для всех тестов этого класса. При использовании на уровне метода она применяется только к этому методу теста. Атрибут на уровне метода переопределяет атрибут на уровне класса для той же переменной окружения.
<?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 (или не указано), переменная окружения удаляется на время выполнения теста:
#[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