Caso de prueba

Las aserciones pueden seguirse una a una en pruebas simples. Pero a veces es útil encerrar las aserciones a la clase de prueba y estructurarlas de esta manera.

La clase debe ser descendiente de Tester\TestCase y hablamos de ella simplemente como de testcase.

use Tester\Assert;

class RectangleTest extends Tester\TestCase
{
	public function testOne()
	{
		Assert::same(/* ... */);
	}

	public function testTwo()
	{
		Assert::match(/* ... */);
	}
}

# Ejecutar métodos de prueba
(new RectangleTest)->run();

Podemos enriquecer un testcase con los métodos setUp() y tearDown(). Se llaman antes/después de cada método de prueba:

use Tester\Assert;

class NextTest extends Tester\TestCase
{
	public function setUp()
	{
		# Preparation
	}

	public function tearDown()
	{
		# Clean-up
	}

	public function testOne()
	{
		Assert::same(/* ... */);
	}

	public function testTwo()
	{
		Assert::match(/* ... */);
	}
}

# Ejecutar métodos de prueba
(new NextTest)->run();

/*


Método Llamadas Orden
---------------------
setUp()
testOne()
tearDown()

setUp()
testTwo()
tearDown()
*/

Si se produce un error en una fase de setUp() o tearDown(), la prueba fallará. Si el error se produce en el método de prueba, el método tearDown() se llama de todos modos, pero con errores suprimidos en el mismo.

Le recomendamos que escriba la anotación @testCase al principio de la prueba, entonces el ejecutor de pruebas de 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 */

Anotación de métodos

Hay algunas anotaciones disponibles para ayudarnos con los métodos de prueba. Las escribimos hacia el método de prueba.

@throws

Es el mismo uso de Assert::exception() dentro de un método de prueba. Pero la notación es más legible:

/**
 * @throws RuntimeException
 */
public function testOne()
{
	// ...
}


/**
 * @throws LogicException  Wrong argument order
 */
public function testTwo()
{
	// ...
}

@dataProvider

Esta anotación sirve cuando queremos ejecutar el método de prueba varias veces pero con diferentes argumentos. (No confundir con la anotación del mismo nombre para archivos).

Como argumento escribimos nombre del método que devuelve parámetros para el método de prueba. El método debe devolver un array o Traversable. Ejemplo sencillo:

public function getLoopArgs()
{
	return [
		[1, 2, 3],
		[4, 5, 6],
		[7, 8, 9],
	];
}


/**
 * @dataProvider getLoopArgs
 */
public function testLoop($a, $b, $c)
{
	// ...
}

La otra variación de la anotación @dataProvider acepta como argumento una ruta al fichero INI (relativamente al fichero de prueba). El método es llamado tantas veces como el número de secciones contenidas en el fichero 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 fichero INI:

/**
 * @dataProvider loop-args.ini
 */
public function testLoop($a, $b, $c)
{
	// ...
}

Del mismo modo, podemos pasar la ruta a un script PHP en lugar del INI. Debe devolver 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],
 ];