Nette Documentation Preview

syntax
Аннотации тестов
****************

.[perex]
Аннотации определяют, как с тестами будет обращаться [запускатель тестов из командной строки |running-tests]. Записываются они в начале файла теста.

Аннотации нечувствительны к регистру. Кроме того, они не действуют, если тест запущен вручную как обычный PHP-скрипт.

Пример:

```php
/**
 * TEST: Базовая проверка запроса к базе данных.
 *
 * @dataProvider files/databases.ini
 * @exitCode 56
 * @phpVersion < 8.4
 */

require __DIR__ . '/../bootstrap.php';
```


TEST .[filter]
--------------
На самом деле это не аннотация. Она просто задаёт название теста, которое отображается при провале или в логах.


@skip .[filter]
---------------
Тест пропускается. Удобно для временного отключения тестов.


@phpVersion .[filter]
---------------------
Тест пропускается, если запущен не с соответствующей версией PHP. Записывайте аннотацию как `@phpVersion [оператор] версия`. Оператор можно опустить, по умолчанию это `>=`. Примеры:

```php
/**
 * @phpVersion 8.1
 * @phpVersion < 8.4
 * @phpVersion != 8.2.5
 */
```


@phpExtension .[filter]
-----------------------
Тест пропускается, если загружены не все указанные PHP-расширения. В одной аннотации можно перечислить несколько расширений либо использовать аннотацию несколько раз.

```php
/**
 * @phpExtension pdo, pdo_pgsql, pdo_mysql
 * @phpExtension json
 */
```


@dataProvider .[filter]
-----------------------
Эта аннотация полезна, когда вы хотите запустить файл теста несколько раз с разными входными данными. (Не путайте её с одноимённой аннотацией для [TestCase |TestCase#@dataProvider].)

Записывайте её как `@dataProvider file.ini`. Путь к файлу указывается относительно файла теста. Тест будет запущен столько раз, сколько секций в INI-файле. Допустим, есть INI-файл `databases.ini`:

```ini
[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******

[postgresql]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******

[sqlite]
dsn = "sqlite::memory:"
```

и файл `database.phpt` в том же каталоге:

```php
/**
 * @dataProvider databases.ini
 */

$args = Tester\Environment::loadData();
```

Тест выполнится три раза, и `$args` будет содержать значения соответственно из секции `mysql`, `postgresql` или `sqlite`.

Есть ещё одна разновидность, когда вы пишете аннотацию с вопросительным знаком: `@dataProvider? file.ini`. В этом случае тест пропускается, если INI-файла не существует.

Возможности этой аннотации на этом не заканчиваются. После имени INI-файла можно указать условия, определяющие, выполнится ли тест для конкретной секции. Расширим INI-файл:

```ini
[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******

[postgresql 8.4]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******

[postgresql 9.1]
dsn = "pgsql:host=127.0.0.1;dbname=test;port=5433"
user = postgres
password = ******

[sqlite]
dsn = "sqlite::memory:"
```

и используем аннотацию с условием:

```php
/**
 * @dataProvider  databases.ini  postgresql, >=9.0
 */
```

Тест выполнится только один раз, для секции `postgresql 9.1`. Остальные секции условию фильтра не отвечают.

Точно так же вместо INI-файла можно сослаться на PHP-скрипт. Он должен вернуть массив или объект Traversable. Файл `databases.php`:

```php
return [
	'postgresql 8.4' => [
		'dsn' => '...',
		'user' => '...',
	],

	'postgresql 9.1' => [
		'dsn' => '...',
		'user' => '...',
	],
];
```


@multiple .[filter]
-------------------
Записывайте её как `@multiple N`, где `N` - целое число. Тест выполнится ровно N раз.


@testCase .[filter]
-------------------
У этой аннотации нет параметров. Используйте её, когда пишете тесты как классы [TestCase |TestCase]. В этом случае запускатель тестов из командной строки будет выполнять отдельные методы в разных процессах и параллельно в нескольких потоках. Это может существенно ускорить весь процесс тестирования.


@exitCode .[filter]
-------------------
Записывайте её как `@exitCode N`, где `N` - ожидаемый код выхода теста. Например, если в тесте вызывается `exit(10)`, запишите аннотацию как `@exitCode 10`. Если тест завершится другим кодом, это считается провалом. Если аннотация опущена, проверяется код выхода 0 (ноль).


@httpCode .[filter]
-------------------
Эта аннотация действует, только если бинарник PHP - это CGI; иначе она игнорируется. Записывайте её как `@httpCode NNN`, где `NNN` - ожидаемый HTTP-код. Если аннотация опущена, проверяется HTTP-код 200. Если `NNN` записан строкой, которая вычисляется в ноль (например, `any`), HTTP-код не проверяется.


@outputMatch и @outputMatchFile .[filter]
-----------------------------------------
Действие этих аннотаций идентично утверждениям `Assert::match()` и `Assert::matchFile()`. Однако образец ищется в тексте, который тест отправил в свой стандартный вывод. Это удобно, когда вы ожидаете, что тест завершится фатальной ошибкой, и вам нужно проверить его вывод.


@phpIni .[filter]
-----------------
Задаёт значения конфигурации INI для теста. Например, записывайте её как `@phpIni precision=20`. Работает так же, как если бы вы задали значение из командной строки параметром `-d precision=20`.

Аннотации тестов

Аннотации определяют, как с тестами будет обращаться запускатель тестов из командной строки. Записываются они в начале файла теста.

Аннотации нечувствительны к регистру. Кроме того, они не действуют, если тест запущен вручную как обычный PHP-скрипт.

Пример:

/**
 * TEST: Базовая проверка запроса к базе данных.
 *
 * @dataProvider files/databases.ini
 * @exitCode 56
 * @phpVersion < 8.4
 */

require __DIR__ . '/../bootstrap.php';

TEST

На самом деле это не аннотация. Она просто задаёт название теста, которое отображается при провале или в логах.

@skip

Тест пропускается. Удобно для временного отключения тестов.

@phpVersion

Тест пропускается, если запущен не с соответствующей версией PHP. Записывайте аннотацию как @phpVersion [оператор] версия. Оператор можно опустить, по умолчанию это >=. Примеры:

/**
 * @phpVersion 8.1
 * @phpVersion < 8.4
 * @phpVersion != 8.2.5
 */

@phpExtension

Тест пропускается, если загружены не все указанные PHP-расширения. В одной аннотации можно перечислить несколько расширений либо использовать аннотацию несколько раз.

/**
 * @phpExtension pdo, pdo_pgsql, pdo_mysql
 * @phpExtension json
 */

@dataProvider

Эта аннотация полезна, когда вы хотите запустить файл теста несколько раз с разными входными данными. (Не путайте её с одноимённой аннотацией для TestCase.)

Записывайте её как @dataProvider file.ini. Путь к файлу указывается относительно файла теста. Тест будет запущен столько раз, сколько секций в INI-файле. Допустим, есть INI-файл databases.ini:

[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******

[postgresql]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******

[sqlite]
dsn = "sqlite::memory:"

и файл database.phpt в том же каталоге:

/**
 * @dataProvider databases.ini
 */

$args = Tester\Environment::loadData();

Тест выполнится три раза, и $args будет содержать значения соответственно из секции mysql, postgresql или sqlite.

Есть ещё одна разновидность, когда вы пишете аннотацию с вопросительным знаком: @dataProvider? file.ini. В этом случае тест пропускается, если INI-файла не существует.

Возможности этой аннотации на этом не заканчиваются. После имени INI-файла можно указать условия, определяющие, выполнится ли тест для конкретной секции. Расширим INI-файл:

[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******

[postgresql 8.4]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******

[postgresql 9.1]
dsn = "pgsql:host=127.0.0.1;dbname=test;port=5433"
user = postgres
password = ******

[sqlite]
dsn = "sqlite::memory:"

и используем аннотацию с условием:

/**
 * @dataProvider  databases.ini  postgresql, >=9.0
 */

Тест выполнится только один раз, для секции postgresql 9.1. Остальные секции условию фильтра не отвечают.

Точно так же вместо INI-файла можно сослаться на PHP-скрипт. Он должен вернуть массив или объект Traversable. Файл databases.php:

return [
	'postgresql 8.4' => [
		'dsn' => '...',
		'user' => '...',
	],

	'postgresql 9.1' => [
		'dsn' => '...',
		'user' => '...',
	],
];

@multiple

Записывайте её как @multiple N, где N – целое число. Тест выполнится ровно N раз.

@testCase

У этой аннотации нет параметров. Используйте её, когда пишете тесты как классы TestCase. В этом случае запускатель тестов из командной строки будет выполнять отдельные методы в разных процессах и параллельно в нескольких потоках. Это может существенно ускорить весь процесс тестирования.

@exitCode

Записывайте её как @exitCode N, где N – ожидаемый код выхода теста. Например, если в тесте вызывается exit(10), запишите аннотацию как @exitCode 10. Если тест завершится другим кодом, это считается провалом. Если аннотация опущена, проверяется код выхода 0 (ноль).

@httpCode

Эта аннотация действует, только если бинарник PHP – это CGI; иначе она игнорируется. Записывайте её как @httpCode NNN, где NNN – ожидаемый HTTP-код. Если аннотация опущена, проверяется HTTP-код 200. Если NNN записан строкой, которая вычисляется в ноль (например, any), HTTP-код не проверяется.

@outputMatch и @outputMatchFile

Действие этих аннотаций идентично утверждениям Assert::match() и Assert::matchFile(). Однако образец ищется в тексте, который тест отправил в свой стандартный вывод. Это удобно, когда вы ожидаете, что тест завершится фатальной ошибкой, и вам нужно проверить его вывод.

@phpIni

Задаёт значения конфигурации INI для теста. Например, записывайте её как @phpIni precision=20. Работает так же, как если бы вы задали значение из командной строки параметром -d precision=20.