Annotations de test

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

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

Exemple :

/**
 * TEST: Test de requête de base de données de base.
 *
 * @dataProvider files/databases.ini
 * @exitCode 56
 * @phpVersion < 5.5
 */

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

TEST

Ce n'est en fait pas une annotation, elle détermine seulement le titre du test, qui est affiché en cas d'échec ou dans le journal.

@skip

Le test est sauté. Utile pour désactiver temporairement des tests.

@phpVersion

Le test est sauté s'il n'est pas exécuté avec la version PHP correspondante. Nous écrivons l'annotation comme @phpVersion [opérateur] version. Nous pouvons omettre 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 sauté si toutes les extensions PHP spécifiées ne sont pas chargées. Nous pouvons spécifier plusieurs extensions dans une seule annotation, ou l'utiliser plusieurs fois.

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

@dataProvider

Si nous voulons exécuter le fichier de test plusieurs fois, mais avec des données d'entrée différentes, cette annotation est utile. (Ne pas confondre avec l'annotation du même nom pour TestCase.)

Nous écrivons comme @dataProvider file.ini, le chemin vers le fichier est relatif au fichier de test. Le test sera exécuté autant de fois qu'il y a de sections dans le fichier INI. Supposons 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 dans le même répertoire, le test database.phpt :

/**
 * @dataProvider databases.ini
 */

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

Le test sera exécuté trois fois et $args contiendra toujours les valeurs de la section mysql, postgresql ou sqlite.

Il existe une autre variante où nous écrivons l'annotation avec un point d'interrogation comme @dataProvider? file.ini. Dans ce cas, le test est sauté si le fichier INI n'existe pas.

Les possibilités de l'annotation ne s'arrêtent pas là. Après le nom du fichier INI, nous pouvons spécifier des conditions sous lesquelles le test sera exécuté pour la section donnée. Élargissons 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 utilisons l'annotation avec une condition :

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

Le test sera exécuté une seule fois et ce, pour la section postgresql 9.1. Les autres sections ne passeront pas le filtre de la condition.

De même, au lieu d'un fichier INI, nous pouvons faire référence à un script PHP. Celui-ci doit retourner un tableau ou un Traversable. Fichier databases.php :

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

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

@multiple

Nous écrivons comme @multiple N, où N est un entier. Le test sera exécuté exactement N fois.

@testCase

L'annotation n'a pas de paramètres. Nous l'utilisons si nous écrivons les tests comme des classes TestCase. Dans ce cas, le lanceur de tests depuis la 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 écrivons comme @exitCode N, où N est le code de retour du test exécuté. Si, par exemple, exit(10) est appelé dans le test, nous écrivons l'annotation comme @exitCode 10 et si le test se termine avec un code différent, cela est considéré comme un échec. Si nous n'indiquons pas l'annotation, le code de retour 0 (zéro) est vérifié.

@httpCode

L'annotation ne s'applique que si le binaire PHP est CGI. Sinon, elle est ignorée. Nous écrivons comme @httpCode NNNNNN est le code HTTP attendu. Si nous n'indiquons pas l'annotation, le code HTTP 200 est vérifié. Si NNN est écrit comme une chaîne évaluée à zéro, par exemple any, le code HTTP n'est pas vérifié.

@outputMatch et @outputMatchFile

La fonction des annotations est identique aux assertions Assert::match() et Assert::matchFile(). Le modèle (pattern) est cependant recherché dans le texte que le test a envoyé sur sa sortie standard. Elle trouve son utilité si nous supposons que le test se terminera par une erreur fatale et que nous devons vérifier sa sortie.

@phpIni

Définit les valeurs INI de configuration pour le test. Nous écrivons par exemple comme @phpIni precision=20 et cela fonctionne de la même manière que si nous avions entré la valeur depuis la ligne de commande via le paramètre -d precision=20.