Spec-Zone.ru › PHPUnit

Рискованные тесты

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

Тесты, считающиеся рискованными, не учитываются в покрытии кода.

Бесполезные тесты

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

Эту проверку можно отключить с помощью параметра --do-not-report-useless-tests в командной строке или задав beStrictAboutTestsThatDoNotTestAnything="false" в файле конфигурации XML PHPUnit.

И наоборот, тест, помеченный атрибутом PHPUnit\Framework\Attributes\DoesNotPerformAssertions, но при этом выполняющий проверки, также будет считаться рискованным. Эта проверка всегда включена и не может быть отключена.

Незапечатанные объекты-заглушки

Задав requireSealedMockObjects="true" в файле конфигурации XML PHPUnit, можно настроить PHPUnit так, чтобы тест считался рискованным, если он не запечатывает созданные им объекты-заглушки (см. раздел Требование запечатанных объектов-заглушек).

Непреднамеренно покрытый код

PHPUnit может строго проверять непреднамеренно покрытый код. Эту проверку можно включить с помощью параметра --strict-coverage в командной строке или задав beStrictAboutCoverageMetadata="true" в файле конфигурации XML PHPUnit.

Если у теста заданы цели покрытия кода (например, PHPUnit\Framework\Attributes\CoversClass), и он выполняет код, не указанный с помощью атрибута Covers* или Uses*, то при включённой проверке он будет считаться рискованным.

Эта проверка не выполняется для тестов, помеченных атрибутом #[Medium] или #[Large]. Средние и большие тесты обычно выполняют больше кода, чем небольшие целенаправленные модульные тесты, поэтому вероятность того, что они выполнят код, явно не указанный как покрываемый или используемый, выше.

Кроме того, если задать requireCoverageMetadata="true" в файле конфигурации XML PHPUnit, тест, для которого не определены метаданные покрытия кода (например, CoversClass, CoversMethod, CoversFunction, CoversNothing и т. д.), будет считаться рискованным. В отличие от описанной выше строгой проверки покрытия, эта проверка выполняется независимо от размера теста (#[Small], #[Medium] или #[Large]).

Отсутствие вклада в покрытие кода

PHPUnit может строго проверять тесты, которые не вносят вклад в покрытие кода. Эту проверку можно включить с помощью параметра --require-coverage-contribution в командной строке или задав requireCoverageContribution="true" в файле конфигурации XML PHPUnit.

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

Вывод во время выполнения теста

PHPUnit может строго проверять вывод во время выполнения тестов. Эту проверку можно включить с помощью параметра --disallow-test-output в командной строке или задав beStrictAboutOutputDuringTests="true" в файле конфигурации XML PHPUnit.

Если тест выводит данные, например, вызывая print в коде теста или проверяемом коде, то при включённой проверке он будет считаться рискованным.

Кроме того, если эта проверка включена, тест будет считаться рискованным, если код теста или проверяемый код открывает буферы вывода (с помощью ob_start()), но не закрывает их до завершения теста. Аналогично, тест будет считаться рискованным, если он закрывает буферы вывода, которые не открывал сам.

Ограничение времени выполнения теста

PHPUnit может ограничивать время выполнения теста, если доступно расширение pcntl. Ограничение времени можно включить с помощью параметра --enforce-time-limit в командной строке или задав enforceTimeLimit="true" в файле конфигурации XML PHPUnit.

Тест, помеченный атрибутом PHPUnit\Framework\Attributes\Large (или аннотацией @large), будет считаться рискованным, если его выполнение занимает более 60 секунд. Это ограничение времени можно настроить с помощью атрибута timeoutForLargeTests в файле конфигурации XML.

Тест, помеченный атрибутом PHPUnit\Framework\Attributes\Medium (или аннотацией @medium), будет считаться рискованным, если его выполнение занимает более 10 секунд. Это ограничение времени можно настроить с помощью атрибута timeoutForMediumTests в файле конфигурации XML.

Тест, помеченный атрибутом PHPUnit\Framework\Attributes\Small (или аннотацией @small), будет считаться рискованным, если его выполнение занимает более 1 секунды. Это ограничение времени можно настроить с помощью атрибута timeoutForSmallTests в файле конфигурации XML.

Изменение глобального состояния

PHPUnit может строго проверять тесты, изменяющие глобальное состояние. Эту проверку можно включить с помощью параметра --strict-global-state в командной строке или задав beStrictAboutChangesToGlobalState="true" в файле конфигурации XML PHPUnit.

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

Тест, зависящий от теста большего размера, будет считаться рискованным. Например, тест, помеченный атрибутом PHPUnit\Framework\Attributes\Small и зависящий (через PHPUnit\Framework\Attributes\Depends или PHPUnit\Framework\Attributes\DependsExternal) от теста, помеченного атрибутом PHPUnit\Framework\Attributes\Medium или PHPUnit\Framework\Attributes\Large, будет считаться рискованным. Эта проверка всегда включена и не может быть отключена.

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

Spec-Zone.ru

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