L'un des objectifs de PHPUnit est que les tests soient combinables: nous voulons pouvoir exécuter n'importe quel nombre ou combinaison de tests ensembles, par exemple tous les tests pour le projet entier, ou les tests pour toutes les classes d'un composant qui constitue une partie du projet ou simplement les tests d'une seule classe particulière.
PHPUnit gère différente façon d'organiser les tests et de les combiner en une suite de tests. Ce chapitre montre les approches les plus communément utilisées.
La façon probablement la plus simple de composer une suite de tests est de conserver tous les fichiers sources des cas de test dans un répertoire test. PHPUnit peut automatiquement trouver et exécuter les tests en parcourant récursivement le répertoire test.
Jetons un oeil à la suite de tests de la bibliothèque Object_Freezer. En regardant la structure des répertoires du projet, nous voyons que
les classes de cas de test dans le répertoire Tests
reflètent la structure des
paquetages et des classes du système en cours de test (SCT, System Under Test ou SUT) dans le répertoire
Object
:
Object Tests |-- Freezer |-- Freezer | |-- HashGenerator | |-- HashGenerator | | `-- NonRecursiveSHA1.php | | `-- NonRecursiveSHA1Test.php | |-- HashGenerator.php | | | |-- IdGenerator | |-- IdGenerator | | `-- UUID.php | | `-- UUIDTest.php | |-- IdGenerator.php | | | |-- LazyProxy.php | | | |-- Storage | |-- Storage | | `-- CouchDB.php | | `-- CouchDB | | | | |-- WithLazyLoadTest.php | | | | `-- WithoutLazyLoadTest.php | |-- Storage.php | |-- StorageTest.php | `-- Util.php | `-- UtilTest.php `-- Freezer.php `-- FreezerTest.php
Pour exécuter tous les tests de la bibliothèque, nous n'avons qu'à faire pointer le lanceur de tests en ligne de commandes de PHPUnit sur ce répertoire test :
phpunit Tests
PHPUnit 4.2.0 by Sebastian Bergmann.
............................................................ 60 / 75
...............
Time: 0 seconds
OK (75 tests, 164 assertions)
Si vous pointez le lanceur de tests en ligne de commandes de PHPUnit sur
un répertoire, il va chercher les fichiers
*Test.php
.
Pour n'exécuter que les tests déclarés dans la classe de cas de test
Object_FreezerTest
dans Tests/FreezerTest.php
,
nous pouvons utiliser la commande suivante :
phpunit Tests/FreezerTest
PHPUnit 4.2.0 by Sebastian Bergmann.
............................
Time: 0 seconds
OK (28 tests, 60 assertions)
Pour un contrôle plus fin sur les tests à exécuter, nous pouvons utiliser
l'option --filter
:
phpunit --filter testFreezingAnObjectWorks Tests
PHPUnit 4.2.0 by Sebastian Bergmann.
.
Time: 0 seconds
OK (1 test, 2 assertions)
Un inconvénient de cette approche est que nous n'avons pas de contrôle sur l'ordre dans lequel les tests sont exécutés. Ceci peut conduire à des problèmes concernant les dépendances des tests, voir la section intitulée « Dépendances des tests ». Dans la prochaine section, nous verrons comment nous pouvons rendre l'ordre d'exécution des tests explicité en utilisant le fichier de configuration XML.
Le fichier de configuration XML de PHPUnit (Annexe B, Le fichier de configuration Configuration)
peut aussi être utilisé pour composer une suite de tests.
Exemple 5.1, « Composer une suite de tests en utilisant la configuration XML »
montre un exemple minimaliste qui va ajouter toutes les classes *Test
trouvées dans les fichiers *Test.php
quand
Tests
est parcouru récursivement.
Exemple 5.1. Composer une suite de tests en utilisant la configuration XML
<phpunit> <testsuites> <testsuite name="Object_Freezer"> <directory>Tests</directory> </testsuite> </testsuites> </phpunit>
L'ordre dans lequel les tests sont exécutés peut être rendu explicite :
Exemple 5.2. Composer une suite de tests en utilisant la configuration XML
<phpunit> <testsuites> <testsuite name="Object_Freezer"> <file>Tests/Freezer/HashGenerator/NonRecursiveSHA1Test.php</file> <file>Tests/Freezer/IdGenerator/UUIDTest.php</file> <file>Tests/Freezer/UtilTest.php</file> <file>Tests/FreezerTest.php</file> <file>Tests/Freezer/StorageTest.php</file> <file>Tests/Freezer/Storage/CouchDB/WithLazyLoadTest.php</file> <file>Tests/Freezer/Storage/CouchDB/WithoutLazyLoadTest.php</file> </testsuite> </testsuites> </phpunit>