Annotations de test

Les annotations déterminent comment les tests seront traités par le gestionnaire de tests en ligne de commande. Elles sont écrites au début du fichier de test.

Les annotations ne sont pas sensibles à la casse. Elles n'ont également aucun effet si le test est exécuté manuellement comme un script PHP ordinaire.

Exemple :

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

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

TEST

Il ne s'agit pas d'une annotation en fait. Elle définit seulement le titre du test qui est imprimé sur les échecs ou dans les journaux.

@skip

Le test est ignoré. C'est pratique pour désactiver temporairement un test.

@phpVersion

Le test est ignoré s'il n'est pas exécuté par la version PHP correspondante. Nous écrivons l'annotation comme @phpVersion [operator] version. Nous pouvons ne pas utiliser l'opérateur, la valeur par défaut est >=. Exemples :

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

@phpExtension

Le test est ignoré si toutes les extensions PHP mentionnées ne sont pas chargées. Plusieurs extensions peuvent être écrites dans une seule annotation, ou nous pouvons utiliser l'annotation plusieurs fois.

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

@dataProvider

Cette annotation convient lorsque l'on veut exécuter le test plusieurs fois mais avec des données différentes. (A ne pas confondre avec l'annotation du même nom pour TestCase).

Nous écrivons l'annotation comme @dataProvider file.ini. Le chemin du fichier INI est relatif au fichier de test. Le test s'exécute autant de fois que le nombre de sections contenues dans le fichier INI. Supposons que le fichier 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:"

et le fichier database.phpt dans le même répertoire :

/**
 * @dataProvider databases.ini
 */

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

Le test s'exécute trois fois et $args contiendra les valeurs des sections mysql, postgresql ou sqlite.

Il existe une autre variante lorsque nous écrivons des annotations avec un point d'interrogation comme @dataProvider? file.ini. Dans ce cas, le test est ignoré si le fichier INI n'existe pas.

Les possibilités d'annotation n'ont pas encore été toutes mentionnées. Nous pouvons écrire des conditions après le fichier INI. Le test s'exécute pour la section donnée seulement si toutes les conditions correspondent. Étendons le fichier 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:"

et nous utiliserons l'annotation avec la condition :

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

Le test s'exécute une seule fois pour la section postgresql 9.1. Les autres sections ne correspondent pas aux conditions.

De même, nous pouvons passer le chemin d'un script PHP au lieu de l'INI. Il doit retourner un tableau ou un Traversable. Fichier databases.php:

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

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

@multiple

Nous l'écrivons comme @multiple NN est un nombre entier. Le test s'exécute exactement N fois.

@testCase

L'annotation n'a pas de paramètres. Nous l'utilisons lorsque nous écrivons un test en tant que classes TestCase. Dans ce cas, l'exécuteur de test en ligne de commande exécutera les méthodes individuelles dans des processus séparés et en parallèle dans plusieurs threads. Cela peut accélérer considérablement l'ensemble du processus de test.

@exitCode

Nous l'écrivons comme @exitCode NN is the exit code of the test. For example if exit(10) est appelé dans le test, nous écrivons l'annotation comme @exitCode 10. Il est considéré comme un échec si le test se termine par un code différent. Le code de sortie 0 (zéro) est vérifié si nous omettons l'annotation

@httpCode

L'annotation est évaluée seulement si le binaire PHP est CGI. Sinon, elle est ignorée. Nous l'écrivons sous la forme @httpCode NNNNNN est le code HTTP attendu. Le code HTTP 200 est vérifié si nous ne tenons pas compte de l'annotation. Si nous écrivons NNN comme une chaîne évaluée à zéro, par exemple any, le code HTTP n'est pas vérifié du tout.

@outputMatch a @outputMatchFile

Le comportement des annotations est cohérent avec les assertions Assert::match() et Assert::matchFile(). Mais le modèle est trouvé dans la sortie standard du test. Un cas d'utilisation approprié est lorsque nous supposons que le test se termine par une erreur fatale et que nous devons vérifier sa sortie.

@phpIni

Il définit les valeurs de configuration INI pour le test. Par exemple, nous l'écrivons comme @phpIni precision=20 et il fonctionne de la même manière que si nous passions la valeur de la ligne de commande par le paramètre -d precision=20.