Chapitre 5. Organiser les tests

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.

Composer une suite de tests en utilisant le système de fichiers

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)

Note

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)

Note

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.

Composer une suite de tests en utilisant la 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>