Anotaciones de prueba

Las anotaciones determinan cómo serán manejadas las pruebas por el ejecutor de pruebas de línea de comandos. Se escriben al principio del archivo de prueba.

Las anotaciones no distinguen entre mayúsculas y minúsculas. Tampoco tienen efecto si la prueba se ejecuta manualmente como un script PHP normal.

Ejemplo:

/**
 * TEST: Basic database query test.
 *
 * @dataProvider files/databases.ini
 * @exitCode 56
 * @phpVersion < 5.5
 */

require __DIR__ . '/../bootstrap.php';

TEST:

En realidad no es una anotación. Sólo establece el título de la prueba que se imprime al fallar o en los registros.

@skip

Se omite la prueba. Es útil para la desactivación temporal de la prueba.

@phpVersion

La prueba es omitida si no es ejecutada por la versión PHP correspondiente. Escribimos la anotación como @phpVersion [operator] version. Podemos omitir el operador, por defecto es >=. Ejemplos:

/**
 * @phpVersion 5.3.3
 * @phpVersion < 5.5
 * @phpVersion != 5.4.5
 */

@phpExtension

La prueba se salta si todas las extensiones PHP mencionadas no están cargadas. Múltiples extensiones pueden ser escritas en una sola anotación, o podemos usar la anotación múltiples veces.

/**
 * @phpExtension pdo, pdo_pgsql, pdo_mysql
 * @phpExtension json
 */

@dataProvider

Esta anotación es adecuada cuando queremos ejecutar la prueba varias veces pero con datos diferentes. (No confundir con la anotación del mismo nombre para TestCase).

Escribimos la anotación como @dataProvider file.ini. La ruta del archivo INI es relativa al archivo de prueba. La prueba se ejecuta tantas veces como secciones contenga el archivo INI. Supongamos que el archivo INI databases.ini:

[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******

[postgresql]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******

[sqlite]
dsn = "sqlite::memory:"

y el fichero database.phpt en el mismo directorio:

/**
 * @dataProvider databases.ini
 */

$args = Tester\Environment::loadData();

La prueba se ejecuta tres veces y $args contendrá valores de las secciones mysql, postgresql o sqlite.

Hay una variación más cuando escribimos anotaciones con un signo de interrogación como @dataProvider? file.ini. En este caso, la prueba se salta si el archivo INI no existe.

Aún no se han mencionado todas las posibilidades de anotación. Podemos escribir condiciones después del archivo INI. La prueba se ejecuta para la sección dada sólo si todas las condiciones coinciden. Vamos a ampliar el archivo INI:

[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******

[postgresql 8.4]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******

[postgresql 9.1]
dsn = "pgsql:host=127.0.0.1;dbname=test;port=5433"
user = postgres
password = ******

[sqlite]
dsn = "sqlite::memory:"

y utilizaremos la anotación con la condición:

/**
 * @dataProvider  databases.ini  postgresql, >=9.0
 */

La prueba se ejecuta sólo una vez para la sección postgresql 9.1. Las demás secciones no cumplen las condiciones.

Del mismo modo, podemos pasar la ruta a un script PHP en lugar de INI. Debe devolver array o Traversable. Archivo databases.php:

return [
	'postgresql 8.4' => [
		'dsn' => '...',
		'user' => '...',
	],

	'postgresql 9.1' => [
		'dsn' => '...',
		'user' => '...',
	],
];

@multiple

Lo escribimos como @multiple N donde N es un número entero. La prueba se ejecuta exactamente N veces.

@testCase

La anotación no tiene parámetros. La utilizamos cuando escribimos una prueba como clases TestCase. En este caso, el ejecutor de pruebas de línea de comandos ejecutará los métodos individuales en procesos separados y en paralelo en múltiples hilos. Esto puede acelerar significativamente todo el proceso de prueba.

@exitCode

Lo escribimos como @exitCode N donde N is the exit code of the test. For example if exit(10) es llamado en la prueba, escribimos la anotación como @exitCode 10. Se considera que falla si la prueba termina con un código diferente. El código de salida 0 (cero) se verifica si omitimos la anotación

@httpCode

La anotación es evaluada sólo si el binario PHP es CGI. En caso contrario, se ignora. Lo escribimos como @httpCode NNN donde NNN es el código HTTP esperado. El código HTTP 200 se verifica si omitimos la anotación. Si escribimos NNN como una cadena evaluada como cero, por ejemplo any, el código HTTP no es verificado en absoluto.

@outputMatch a @outputMatchFile

El comportamiento de las anotaciones es coherente con las aserciones Assert::match() y Assert::matchFile(). Pero el patrón se encuentra en la salida estándar de la prueba. Un caso de uso adecuado es cuando suponemos que la prueba finaliza por error fatal y necesitamos verificar su salida.

@phpIni

Establece valores de configuración INI para el test. Por ejemplo lo escribimos como @phpIni precision=20 y funciona de la misma manera que si pasáramos el valor desde la línea de comandos por el parámetro -d precision=20.