Анотації до тестів
Анотації визначають, як тести будуть оброблятися програмою запуску тестів командного рядка. Вони записуються на початку файлу тесту.
Анотації не чутливі до регістру. Вони також не мають жодного ефекту, якщо тест запускається вручну як звичайний PHP-скрипт.
Приклад:
/**
* TEST: Basic database query test.
*
* @dataProvider files/databases.ini
* @exitCode 56
* @phpVersion < 5.5
*/
require __DIR__ . '/../bootstrap.php';
Test
Насправді це не анотація. Він тільки задає заголовок тесту, який виводиться при відмові або в логах.
@skip
Тест пропускається. Це зручно для тимчасової деактивації тесту.
@phpVersion
Тест буде пропущено, якщо він не запущений відповідною версією PHP. Ми
пишемо анотацію як @phpVersion [operator] version
. Ми можемо не вказувати
оператор, за замовчуванням це >=
. Приклади:
/**
* @phpVersion 5.3.3
* @phpVersion < 5.5
* @phpVersion != 5.4.5
*/
@phpExtension
Тест буде пропущено, якщо всі зазначені розширення PHP не завантажені. Кілька розширень можуть бути записані в одній анотації, або ми можемо використовувати анотацію кілька разів.
/**
* @phpExtension pdo, pdo_pgsql, pdo_mysql
* @phpExtension json
*/
@dataProvider
Ця анотація підходить, коли ми хочемо запустити тест кілька разів, але з різними даними. (Не плутати з однойменною анотацією для TestCase).
Ми пишемо анотацію як @dataProvider file.ini
. Шлях до файлу 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
. Інші
розділи не відповідають умовам.
Аналогічно, ми можемо передати шлях до PHP-скрипту замість INI. Він
повинен повертати масив або 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
is the exit code of the test. For example if
exit(10)
викликається в тесті, ми пишемо анотацію як @exitCode 10
.
Вважається невдачею, якщо тест завершується з іншим кодом. Код виходу 0
(нуль) перевіряється, якщо ми опустимо анотацію
@httpCode
Анотація оцінюється тільки в тому випадку, якщо бінарний PHP є CGI. В
іншому випадку вона ігнорується. Ми записуємо її як @httpCode NNN
, де
NNN
– очікуваний HTTP-код. HTTP-код 200 буде перевірено, якщо ми
опустимо анотацію. Якщо ми запишемо NNN
як рядок, що оцінюється як
нуль, наприклад, any
, HTTP-код не перевірятиметься взагалі.
@outputMatch a @outputMatchFile
Поведінка анотацій відповідає твердженням Assert::match()
і
Assert::matchFile()
. Але в стандартному виведенні тесту зустрічається
патерн. Відповідний випадок використання – коли ми припускаємо, що
тест завершиться фатальною помилкою, і нам потрібно перевірити його
виведення.
@phpIni
Встановлює значення конфігурації INI для тесту. Наприклад, ми
записуємо його як @phpIni precision=20
і він працює так само, як якщо б ми
передали значення з командного рядка параметром -d precision=20
.