TestCase
Nei test semplici, le asserzioni possono seguire una dopo l'altra. A volte, però, è più vantaggioso racchiudere le asserzioni in una classe di test e strutturarle così.
La classe deve essere un discendente di Tester\TestCase
e ne parliamo semplificando come testcase. La
classe deve contenere metodi di test che iniziano con test
. Questi metodi verranno eseguiti come test:
use Tester\Assert;
class RectangleTest extends Tester\TestCase
{
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Esecuzione dei metodi di test
(new RectangleTest)->run();
Un test scritto in questo modo può essere ulteriormente arricchito con i metodi setUp()
e
tearDown()
. Vengono chiamati prima, rispettivamente dopo, ogni metodo di test:
use Tester\Assert;
class NextTest extends Tester\TestCase
{
public function setUp()
{
# Preparazione
}
public function tearDown()
{
# Pulizia
}
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Esecuzione dei metodi di test
(new NextTest)->run();
/*
Ordine di chiamata dei metodi
-----------------------------
setUp()
testOne()
tearDown()
setUp()
testTwo()
tearDown()
*/
Se si verifica un errore nella fase setUp()
o tearDown()
, il test fallisce complessivamente. Se si
verifica un errore nel metodo di test, nonostante ciò il metodo tearDown()
viene eseguito, ma con la soppressione
degli errori al suo interno.
Consigliamo di scrivere all'inizio del test l'annotazione @testCase, così l'esecutore di test dalla riga di comando eseguirà i singoli metodi del testcase in processi separati e in parallelo su più thread. Questo può accelerare notevolmente l'intero processo di test.
<?php
/** @testCase */
Annotazioni dei metodi
Per i metodi di test abbiamo a disposizione diverse annotazioni che ci facilitano il test. Le scriviamo accanto al metodo di test.
@throws
È l'equivalente dell'uso di Assert::exception()
all'interno del metodo di test. La scrittura è però più
chiara:
/**
* @throws RuntimeException
*/
public function testOne()
{
// ...
}
/**
* @throws LogicException Ordine degli argomenti errato
*/
public function testTwo()
{
// ...
}
@dataProvider
Se vogliamo eseguire il metodo di test più volte, ma con parametri diversi, questa annotazione è utile. (Non confondere con l'annotazione omonima per i file.)
Dopo di essa indichiamo il nome del metodo che restituisce gli argomenti per il metodo di test. Il metodo deve restituire un array o Traversable. Un esempio semplice:
public function getLoopArgs()
{
return [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
}
/**
* @dataProvider getLoopArgs
*/
public function testLoop($a, $b, $c)
{
// ...
}
La seconda variante dell'annotazione @dataProvider accetta come parametro il percorso di un file INI (relativo al file
con il test). Il metodo viene chiamato tante volte quante sono le sezioni nel file INI. File loop-args.ini
:
[one]
a=1
b=2
c=3
[two]
a=4
b=5
c=6
[three]
a=7
b=8
c=9
e il metodo che utilizza il file INI:
/**
* @dataProvider loop-args.ini
*/
public function testLoop($a, $b, $c)
{
// ...
}
Analogamente, invece di un file INI possiamo fare riferimento a uno script PHP. Questo deve restituire un array o Traversable.
File loop-args.php
:
return [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 4, 'b' => 5, 'c' => 6],
['a' => 7, 'b' => 8, 'c' => 9],
];