TOOLinux

Le journal du Libre

PHPUnit – tests (unitaires) pour PHP

mardi 24 novembre 2009

PHPUnit, développé par Sebastian Bergmann, fait partie de la famille des frameworks de test xUnits. Il fournit un framework permettant d’écrire des tests en PHP, accompagné de fonctionnalités permettant d’exécuter les tests et d’analyser le résultat de ces derniers.

Parmi les fonctionnalités de PHPUnit, nous retiendrons :

  • L’intégration avec Selenium RC, pour les tests d’interface
  • L’intégration avec Apache Maven, Bamboo, Bitten, CruiseControl, Parabuild, pour l’intégration continue
  • Chaque test s’exécute dans un environnement confiné
  • Avec l’aide de Xdebug, la génération de rapports de Code Coverage est possible.
  • Possibilité de faire des tests de performance
  • Support des Mock Objects (via jMock), pour les tests unitaires des fonctions non-publiques.
  • Possibilité de générer le squelette des classes de test, pour une meilleure productivité
  • Configuration simple par fichier XML

L’écriture des tests se fait assez simplement, avec les mécanismes suivant :

  • Utilisation d’annotation : PHPUnit apporte beaucoup d’annotation permettant d’indiquer aux outils de test les propriétés des méthodes de test. @exceptException indique ainsi que la méthode de test doit émettre un exception, @cover indique qu’elle méthode est couverte par le test, @depends les dépendances entre les méthodes de test et @dataProvider la méthode fournissant les données de test (Fixture)
  • Dépendance entre tests : Il est possible d’indiquer qu’un test dépendant d’un autre. Si on regarde l’exemple de la documentation sur cette fonctionnalité, on comprend bien la chaine “testEmpty” -> “testPop” -> “testPush” qui permet de tester les fonctionnalités d’un pile. Chaque méthode de la classe de test n’appelle pas plus d’une méthode de la classe testé
  • Data provider : Un Data provider est une méthode permettant de fournir des données de tests à une méthode de test. Ceci permet de ne pas écrire des lignes et des lignes d’assertion, et d’écrire notre méthode de test de manière succincte (ce qui évite les erreurs). PHPUnit sait alors appelé la méthode de test autant de fois qu’il y a de donnée renvoyé par le Data Provider.
  • Fixture et base de données : Rare sont les applications PHP qui ne se connectent pas à une base de données. En développement, cette base de données est rempli de données, permettant de faire les tests fonctionnels. PHPUnit propose également divers moyens de peupler une base de test, avec des données qui peuvent être décrite en format flat XML, XML ou CSV. Ceci évite d’avoir à réécrire les données des tests fonctionnels dans une méthode DataProvider. Il n’est pas nécessaire également d’avoir à modifier les appels de connexion à la base de données dans le code source du projet, pour les besoins des tests.

phpunit code coverage

PHPUnit est un projet très complet, qui n’hésite pas à s’intégrer et à profiter de l’expérience d’autres projets. On peut considérer que le projet est stable et fiable pour les fonctionnalités appartenant au Core. En effet, l’activité du projet est encore intense, notamment dans le développement de nouvelles fonctionnalités et d’interopérabilité avec les autres projets. Malheureusement,il n’existe pas encore de version française de leur documentation très complète, avis aux amateurs !

Patrick GUIRAN