TestCase
W prostych testach asercje mogą następować jedna po drugiej. Ale czasami wygodniej jest zawinąć asercje w klasie testowej, aby je ustrukturyzować.
Klasa musi być potomkiem Tester\TestCase
, a my nazywamy ją w uproszczeniu testcase. Klasa musi zawierać
metody testowe zaczynające się od test
. Metody te będą uruchamiane jako testy:
use Tester\Assert;
class RectangleTest extends Tester\TestCase
{
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Spuštění testovacích metod
(new RectangleTest)->run();
Tak napisany test można dodatkowo wzbogacić o metody setUp()
i tearDown()
. Są one wywoływane
odpowiednio przed i po każdej metodzie testowej:
use Tester\Assert;
class NextTest extends Tester\TestCase
{
public function setUp()
{
# Příprava
}
public function tearDown()
{
# Úklid
}
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Spuštění testovacích metod
(new NextTest)->run();
/*
Pořadí volání metod .[#toc-method-calls-order]
----------------------------------------------
setUp()
testOne()
tearDown()
setUp()
testTwo()
tearDown()
*/
Jeśli w fazie setUp()
lub tearDown()
wystąpi błąd, test zakończy się ogólnym niepowodzeniem.
Jeśli błąd wystąpi w metodzie testowej, metoda tearDown()
nadal działa, ale z tłumieniem błędów w tej
metodzie.
Zaleca się napisanie adnotacji @testCase na początku testu, wtedy runner testowy linii poleceń uruchomi każdą metodę testcase w oddzielnych procesach i równolegle w wielu wątkach. Może to znacznie przyspieszyć cały proces testowania.
<?php
/** @testCase */
Adnotacja metod
Mamy kilka adnotacji do metod testowych, aby ułatwić testowanie. Zapisujemy je do metody badawczej.
@podrzuca
Jest to równoznaczne z zastosowaniem Assert::exception()
wewnątrz metody badawczej. Jednak notacja jest
bardziej przejrzysta:
/**
* @throws RuntimeException
*/
public function testOne()
{
// ...
}
/**
* @throws LogicException Nieprawidłowa kolejność argumentów.
*/
public function testTwo()
{
// ...
}
@dataProvider
Jeśli chcesz uruchomić metodę testową wiele razy, ale z różnymi parametrami, ta adnotacja jest przydatna. (Nie należy mylić z tą samą adnotacją dla plików).
Po niej podamy nazwę metody, która zwraca argumenty dla metody testowej. Metoda musi zwracać tablicę lub traversable. Prosty przykład:
public function getLoopArgs()
{
return [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
}
/**
* @dataProvider getLoopArgs
*/
public function testLoop($a, $b, $c)
{
// ...
}
Drugi wariant adnotacji @dataProvider przyjmuje jako parametr ścieżkę do pliku INI (względem pliku testowego).
Metoda jest wywoływana tyle razy, ile jest sekcji w pliku INI. Plik loop-args.ini
:
[one]
a=1
b=2
c=3
[two]
a=4
b=5
c=6
[three]
a=7
b=8
c=9
oraz metoda, która wykorzystuje plik INI:
/**
* @dataProvider loop-args.ini
*/
public function testLoop($a, $b, $c)
{
// ...
}
Podobnie możemy odwołać się do skryptu PHP zamiast do pliku INI. Musi to zwrócić tablicę lub Traversable. Plik
loop-args.php
:
return [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 4, 'b' => 5, 'c' => 6],
['a' => 7, 'b' => 8, 'c' => 9],
];