TestCase
En pruebas simples, las aserciones pueden seguir una tras otra. Sin embargo, a veces es más conveniente empaquetar las aserciones en una clase de prueba y así estructurarlas.
La clase debe ser descendiente de Tester\TestCase
y, de forma simplificada, nos referimos a ella como
testcase. La clase debe contener métodos de prueba que comiencen con test
. Estos métodos se ejecutarán como
pruebas:
use Tester\Assert;
class RectangleTest extends Tester\TestCase
{
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Ejecución de los métodos de prueba
(new RectangleTest)->run();
Una prueba escrita de esta manera puede enriquecerse aún más con los métodos setUp()
y tearDown()
.
Se llaman antes y después de cada método de prueba, respectivamente:
use Tester\Assert;
class NextTest extends Tester\TestCase
{
public function setUp()
{
# Preparación
}
public function tearDown()
{
# Limpieza
}
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Ejecución de los métodos de prueba
(new NextTest)->run();
/*
Orden de llamada de los métodos
-------------------------------
setUp()
testOne()
tearDown()
setUp()
testTwo()
tearDown()
*/
Si ocurre un error en la fase setUp()
o tearDown()
, la prueba falla en general. Si ocurre un error en
el método de prueba, a pesar de eso, el método tearDown()
se ejecuta, pero con la supresión de errores
en él.
Recomendamos escribir la anotación @testCase al principio de la prueba, entonces el ejecutor de pruebas desde la línea de comandos ejecutará los métodos individuales del testcase en procesos separados y en paralelo en múltiples hilos. Esto puede acelerar significativamente todo el proceso de prueba.
<?php
/** @testCase */
Anotaciones de métodos
Para los métodos de prueba tenemos disponibles varias anotaciones que nos facilitan las pruebas. Las escribimos junto al método de prueba.
@throws
Es equivalente al uso de Assert::exception()
dentro del método de prueba. Pero la escritura es más clara:
/**
* @throws RuntimeException
*/
public function testOne()
{
// ...
}
/**
* @throws LogicException Wrong argument order
*/
public function testTwo()
{
// ...
}
@dataProvider
Si queremos ejecutar el método de prueba varias veces, pero con diferentes parámetros, esta anotación es útil. (No confundir con la anotación del mismo nombre para archivos.)
Después de ella indicamos el nombre del método que devuelve los argumentos para el método de prueba. El método debe devolver un array o Traversable. Un ejemplo simple:
public function getLoopArgs()
{
return [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
}
/**
* @dataProvider getLoopArgs
*/
public function testLoop($a, $b, $c)
{
// ...
}
La segunda variante de la anotación @dataProvider acepta como parámetro la ruta a un archivo INI (relativa al archivo
con la prueba). El método se llama tantas veces como secciones haya en el archivo INI. Archivo loop-args.ini
:
[one]
a=1
b=2
c=3
[two]
a=4
b=5
c=6
[three]
a=7
b=8
c=9
y el método que utiliza el archivo INI:
/**
* @dataProvider loop-args.ini
*/
public function testLoop($a, $b, $c)
{
// ...
}
De manera similar, en lugar de un archivo INI podemos referenciar un script PHP. Este debe devolver un array o Traversable.
Archivo loop-args.php
:
return [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 4, 'b' => 5, 'c' => 6],
['a' => 7, 'b' => 8, 'c' => 9],
];