Spec-Zone.ru › PHPUnit

Организация тестов

Одна из целей 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.

Пример 4.1 Объединение набора тестов с помощью XML-конфигурации
<?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

Spec-Zone.ru

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