TestCase
В простых тестах утверждения могут следовать одно за другим. Иногда, однако, выгоднее упаковать утверждения в тестовый класс и таким образом их структурировать.
Класс должен быть потомком Tester\TestCase
, и упрощенно мы говорим о
нем как о testcase. Класс должен содержать тестовые методы,
начинающиеся на test
. Эти методы будут запущены как тесты:
use Tester\Assert;
class RectangleTest extends Tester\TestCase
{
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Запуск тестовых методов
(new RectangleTest)->run();
Так написанный тест можно далее обогатить методами setUp()
и
tearDown()
. Они вызываются перед, соответственно, после каждого
тестового метода:
use Tester\Assert;
class NextTest extends Tester\TestCase
{
public function setUp()
{
# Подготовка
}
public function tearDown()
{
# Очистка
}
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Запуск тестовых методов
(new NextTest)->run();
/*
Порядок вызова методов
----------------------
setUp()
testOne()
tearDown()
setUp()
testTwo()
tearDown()
*/
Если произойдет ошибка на этапе setUp()
или tearDown()
, тест в
целом завершится неудачей. Если произойдет ошибка в тестовом методе,
несмотря на это, метод tearDown()
запустится, однако с подавлением
ошибок в нем.
Рекомендуем в начало теста написать аннотацию @testCase, тогда средство запуска тестов из командной строки будет запускать отдельные методы testcase в самостоятельных процессах и параллельно в нескольких потоках. Это может значительно ускорить весь процесс тестирования.
<?php
/** @testCase */
Аннотации методов
У тестовых методов нам доступно несколько аннотаций, которые облегчат нам тестирование. Записываем их к тестовому методу.
@throws
Является эквивалентом использования Assert::exception()
внутри
тестового метода. Запись, однако, более читаемая:
/**
* @throws RuntimeException
*/
public function testOne()
{
// ...
}
/**
* @throws LogicException Wrong argument order
*/
public function testTwo()
{
// ...
}
@dataProvider
Если мы хотим запустить тестовый метод несколько раз, но с другими параметрами, полезна именно эта аннотация. (Не путайте с одноименной аннотацией для файлов.)
За ней укажем имя метода, который возвращает аргументы для тестового метода. Метод должен вернуть массив или Traversable. Простой пример:
public function getLoopArgs()
{
return [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
}
/**
* @dataProvider getLoopArgs
*/
public function testLoop($a, $b, $c)
{
// ...
}
Второй вариант аннотации @dataProvider принимает в качестве параметра
путь к INI-файлу (относительно файла с тестом). Метод вызывается столько
раз, сколько секций в INI-файле. Файл loop-args.ini
:
[one]
a=1
b=2
c=3
[two]
a=4
b=5
c=6
[three]
a=7
b=8
c=9
и метод, который использует INI-файл:
/**
* @dataProvider loop-args.ini
*/
public function testLoop($a, $b, $c)
{
// ...
}
Аналогично, вместо INI-файла мы можем сослаться на PHP-скрипт. Он должен
вернуть массив или Traversable. Файл loop-args.php
:
return [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 4, 'b' => 5, 'c' => 6],
['a' => 7, 'b' => 8, 'c' => 9],
];