Организация тестов
Одна из целей PHPUnit заключается в том, что тесты должны быть комбинируемыми: мы хотим иметь возможность запускать любое количество или комбинацию тестов вместе, например, все тесты для всего проекта, или тесты для всех классов компонента, который является частью проекта, или только тесты для одного класса.
PHPUnit поддерживает различные способы организации тестов и их объединения в набор тестов. В этой главе показаны наиболее распространенные подходы.
Объединение набора тестов с использованием файловой системы
Вероятно, самый простой способ объединения набора тестов — это хранение всех файлов исходного кода тестовых случаев в каталоге тестов. PHPUnit может автоматически обнаруживать и запускать тесты, рекурсивно проходя по каталогу тестов.
Давайте посмотрим на набор тестов проекта sebastianbergmann/raytracer.
Глядя на структуру каталогов этого проекта, мы видим, что классы тестовых случаев в каталоге tests/unit отражают структуру пакетов и классов Системы, подвергаемой тестированию (SUT), в каталоге src:
src tests/unit
├── autoload.php ├── CameraTest.php
├── Camera.php ├── canvas
├── canvas │ ├── AnsiMapperTest.php
│ ├── AnsiMapper.php │ ├── CanvasTest.php
│ ├── CanvasIterator.php │ └── PortablePixmapMapperTest.php
│ ├── Canvas.php ├── ColorTest.php
│ ├── PortablePixmapMapper.php ├── intersection
│ └── WebpMapper.php │ ├── IntersectionCollectionTest.php
├── Color.php │ └── IntersectionTest.php
├── exceptions ├── material
│ ├── Exception.php │ ├── CheckersPatternTest.php
│ ├── IntersectionHasNoHitException.php │ ├── GradientPatternTest.php
│ ├── InvalidArgumentException.php │ ├── MaterialTest.php
│ ├── OutOfBoundsException.php │ ├── PatternTest.php
│ ├── RuntimeException.php │ ├── RingPatternTest.php
│ └── WorldHasNoLightException.php │ └── StripePatternTest.php
├── intersection ├── math
│ ├── IntersectionCollectionIterator.php │ ├── MatrixTest.php
│ ├── IntersectionCollection.php │ ├── RayTest.php
│ ├── Intersection.php │ ├── TransformationsTest.php
│ └── PreparedComputation.php │ └── TupleTest.php
├── material ├── PointLightTest.php
│ ├── CheckersPattern.php ├── shapes
│ ├── GradientPattern.php │ ├── PlaneTest.php
│ ├── Material.php │ ├── ShapeCollectionTest.php
│ ├── Pattern.php │ ├── ShapeTest.php
│ ├── RingPattern.php │ └── SphereTest.php
│ └── StripePattern.php └── WorldTest.php
├── math
│ ├── Matrix.php tests/integration
│ ├── Ray.php └── PuttingItTogetherTest.php
│ ├── Transformations.php
│ └── Tuple.php
├── PointLight.php
├── shapes
│ ├── Plane.php
│ ├── ShapeCollectionIterator.php
│ ├── ShapeCollection.php
│ ├── Shape.php
│ └── Sphere.php
└── World.php
Каталог tests/integration содержит интеграционные тестовые случаи, которые хранятся отдельно от модульных тестов каталога tests/unit.
Для запуска всех тестов этого проекта необходимо указать командной строке PHPUnit каталог тестов:
$ ./tools/phpunit --bootstrap tests/bootstrap.php tests PHPUnit 12.0.0 by Sebastian Bergmann and contributors. Runtime: PHP 8.2.2 ............................................................... 63 / 177 ( 35%) ............................................................... 126 / 177 ( 71%) ................................................... 177 / 177 (100%) Time: 00:17.100, Memory: 28.27 MB OK (177 tests, 657 assertions)
Примечание
Если вы укажете командной строке PHPUnit каталог, она будет искать файлы *Test.php.
Для запуска только тех тестов, которые объявлены в тестовом классе WorldTest в tests/unit/WorldTest.php, можно использовать следующую команду:
$ ./tools/phpunit --bootstrap src/autoload.php tests/unit/WorldTest.php PHPUnit 12.0.0 by Sebastian Bergmann and contributors. Runtime: PHP 8.2.2 ............. 13 / 13 (100%) Time: 00:00.095, Memory: 8.00 MB OK (13 tests, 30 assertions)
Для более тонкого управления тем, какие тесты запускать, можно использовать опцию --filter:
$ ./tools/phpunit --bootstrap src/autoload.php tests/unit --filter test_creating_a_world PHPUnit 12.0.0 by Sebastian Bergmann and contributors. Runtime: PHP 8.2.2 . 1 / 1 (100%) Time: 00:00.077, Memory: 10.00 MB OK (1 test, 2 assertions)
Объединение набора тестов с помощью XML-конфигурации
Файл конфигурации XML PHPUnit (Файл XML-конфигурации) также можно использовать для объединения набора тестов. Пример 4.1 показывает минимальный файл конфигурации phpunit.xml, который добавит все классы *Test, которые находятся в файлах *Test.php, при рекурсивном прохождении каталога tests.
<?xml version="1.0" encoding="UTF-8"?>
<phpunitxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/11.4/phpunit.xsd"
bootstrap="tests/bootstrap.php">
<testsuites>
<testsuitename="unit">
<directory>tests/unit</directory>
</testsuite>
<testsuitename="integration">
<directory>tests/integration</directory>
</testsuite>
</testsuites>
</phpunit>
Примечание
Вы должны сослаться на определение схемы, которое соответствует версии PHPUnit, которую вы используете в вашем файле XML-конфигурации. Определение схемы для PHPUnit 12.0 всегда можно найти по адресу https://schema.phpunit.de/12.0/phpunit.xsd, например.
Теперь, когда у нас есть файл XML-конфигурации, мы можем вызвать запуск тестов PHPUnit без аргументов (например, tests) или опций (например, --bootstrap) для запуска наших тестов:
$ ./tools/phpunit PHPUnit 12.0.0 by Sebastian Bergmann and contributors. Runtime: PHP 8.2.2 Configuration: /path/to/raytracer/phpunit.xml ............................................................... 63 / 177 ( 35%) ............................................................... 126 / 177 ( 71%) ................................................... 177 / 177 (100%) Time: 00:17.100, Memory: 28.27 MB OK (177 tests, 657 assertions)
Опция --list-suites командной строки PHPUnit может использоваться для вывода списка всех наборов тестов, определенных в файле XML-конфигурации PHPUnit:
$ ./tools/phpunit --list-suites PHPUnit 12.0.0 by Sebastian Bergmann and contributors. Available test suite(s): - unit - integration
Мы можем использовать опцию --testsuite командной строки PHPUnit, чтобы ограничить выполняемые тесты тестами определенного набора тестов, который объявлен в файле XML-конфигурации:
$ ./tools/phpunit --testsuite unit PHPUnit 12.0.0 by Sebastian Bergmann and contributors. Runtime: PHP 8.2.2 Configuration: /path/to/raytracer/phpunit.xml ............................................................... 63 / 172 ( 36%) ............................................................... 126 / 172 ( 73%) .............................................. 172 / 172 (100%) Time: 00:00.213, Memory: 24.27 MB OK (172 tests, 637 assertions)
© 2005–2025 Sebastian Bergmann
Licensed under the Creative Commons Attribution 3.0 Unported License.
https://docs.phpunit.de/en/12.0/organizing-tests.html