TestCase
V preprostih testih lahko asercije sledijo ena za drugo. Včasih pa je bolj ugodno asercije zapakirati v testni razred in jih tako strukturirati.
Razred mora biti potomec Tester\TestCase
in poenostavljeno o njem govorimo kot o testcase. Razred mora
vsebovati testne metode, ki se začnejo s test
. Te metode se bodo zagnale kot testi:
use Tester\Assert;
class RectangleTest extends Tester\TestCase
{
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Zagon testnih metod
(new RectangleTest)->run();
Tako napisan test lahko nadalje obogatite z metodama setUp()
in tearDown()
. Klicani sta pred oz. za
vsako testno metodo:
use Tester\Assert;
class NextTest extends Tester\TestCase
{
public function setUp()
{
# Priprava
}
public function tearDown()
{
# Čiščenje
}
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Zagon testnih metod
(new NextTest)->run();
/*
Vrstni red klica metod
----------------------
setUp()
testOne()
tearDown()
setUp()
testTwo()
tearDown()
*/
Če pride do napake v fazi setUp()
ali tearDown()
, test na splošno ne uspe. Če pride do napake
v testni metodi, se kljub temu metoda tearDown()
zažene, vendar z zatrtjem napak v njej.
Priporočamo, da na začetek testa napišete opombo @testCase, potem bo zaganjalnik testov iz ukazne vrstice zaganjal posamezne metode testcase v ločenih procesih in vzporedno v več nitih. To lahko znatno pospeši celoten proces testiranja.
<?php
/** @testCase */
Opombe metod
Pri testnih metodah imate na voljo več opomb, ki vam olajšajo testiranje. Zapišete jih k testni metodi.
@throws
Je ekvivalent uporabe Assert::exception()
znotraj testne metode. Zapis pa je preglednejši:
/**
* @throws RuntimeException
*/
public function testOne()
{
// ...
}
/**
* @throws LogicException Wrong argument order
*/
public function testTwo()
{
// ...
}
@dataProvider
Če želite testno metodo zagnati večkrat, vendar z drugačnimi parametri, je uporabna prav ta opomba. (Ne zamenjujte z istoimensko opombo za datoteke.)
Za njo navedite ime metode, ki vrača argumente za testno metodo. Metoda mora vrniti polje ali Traversable
.
Preprost primer:
public function getLoopArgs()
{
return [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
}
/**
* @dataProvider getLoopArgs
*/
public function testLoop($a, $b, $c)
{
// ...
}
Druga različica opombe @dataProvider sprejema kot parameter pot do datoteke INI (relativno glede na datoteko
s testom). Metoda se kliče tolikokrat, kolikor je odsekov v datoteki INI. Datoteka loop-args.ini
:
[one]
a=1
b=2
c=3
[two]
a=4
b=5
c=6
[three]
a=7
b=8
c=9
in metoda, ki uporablja datoteko INI:
/**
* @dataProvider loop-args.ini
*/
public function testLoop($a, $b, $c)
{
// ...
}
Podobno lahko namesto datoteke INI pokažete na skript PHP. Ta mora vrniti polje ali Traversable
. Datoteka
loop-args.php
:
return [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 4, 'b' => 5, 'c' => 6],
['a' => 7, 'b' => 8, 'c' => 9],
];