Professional Documents
Culture Documents
1
par Jean-Pierre Grossglauser (Page personnelle)
Ce tutoriel fournit une introduction aux tests unitaires PHP avec le framework de tests PHPUnit.
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
I - Introduction............................................................................................................................................................. 3 I-A - Remerciements.............................................................................................................................................. 3 I-B - qui s'adresse ce tutoriel ?..........................................................................................................................3 I-C - Prrequis....................................................................................................................................................... 3 I-D - A propos des tests unitaires dans PHP........................................................................................................3 I-E - Mthodologie................................................................................................................................................. 4 II - PHPUnit................................................................................................................................................................. 6 II-A - Installation.....................................................................................................................................................6 II-B - Utilitaire de ligne de commande...................................................................................................................6 II-C - criture des tests......................................................................................................................................... 9 II-C-1 - Gnrateur de gabarit......................................................................................................................... 9 II-D - Organisation des tests............................................................................................................................... 11 II-E - Excution des tests.................................................................................................................................... 12 II-E-1 - Lancer une suite de tests.................................................................................................................. 12 II-E-2 - Indicateurs de rsultat....................................................................................................................... 13 II-F - Exemple rcapitulatif...................................................................................................................................13 III - Conclusion.......................................................................................................................................................... 17 III-A - Rfrences.................................................................................................................................................17
-2Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
I-C - Prrequis
Bibliothque PEAR ( Guide d'installation de PEAR). Pouvoir excuter PHP en ligne de commande.
-3Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
Bien que les tests unitaires soient primordiaux, ils ne rsoudront pas les problmes d'analyse et conception (au mieux, ils les mettront en vidence), c'est pourquoi vous devez garder en tte que la qualit finale de votre produit dpend de votre mthodologie de travail dans son ensemble.
I-E - Mthodologie
Cette brve introduction mthodologique fournit un processus et quelques conseils vous permettant d'utiliser les tests unitaires dans vos projets PHP. Elle n'a pas pour but d'tre exhaustive, si vous souhaitez avoir d'amples informations sur les sujets abords, consultez les rfrences en fin de chapitre.
Le processus qui vous est propos ci-dessus fait abstraction des contraintes lies la gestion de projet (cahier des charges, organisation interne, etc.) ainsi que de la phase d'analyse. Il est bas sur le dveloppement pilot par les tests (TDD) et s'adresse particulirement aux dveloppeurs PHP autonomes. Si vous dveloppez en quipe, la base restera sensiblement la mme mais vous devrez fournir des prcisions au niveau de l'organisation et du partage des tches, notamment. Le dveloppement pilot par les tests (Test-Driven Development, ou TDD) est une mthode de dveloppement mettant les tests unitaires au premier plan, on peut rsumer son processus en cinq tapes : 1 2 3 4 5 Ajouter un test, vrifier qu'il ne passe pas, implmenter la fonctionnalit, excuter les tests unitaires - dboguer en cas d'chec, refactoriser le code source - excuter nouveau les tests unitaires, passer l'objectif suivant...
En reprenant le processus ci-dessus, vous observerez que l'approche TDD dbute ds la phase de conception. Dans l'idal, la structure de votre application devrait tre modlise dans un diteur UML puis son squelette
-4Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
gnr directement dans des fichiers PHP. Plusieurs diteurs UML libres fournissent un gnrateur de code PHP 5 (nativement ou sous forme de plug-in), notamment (pour Windows uniquement, notation UML 2.0). ArgoUML (multi-plateforme, notation UML 1.4) et StarUML
Paralllement, vous pouvez modliser des diagrammes entit-relation (ERD) et gnrer les schmas de vos bases de donnes la vole. Pour ce faire il existe notamment les logiciels pour MySQL), commerciale). MySQL Workbench (version BETA) ainsi que DBDesigner 4 (logiciel libre et optimis Toad Data Modeler (version freeware ou
Ds que le squelette de votre applicaiton sera dfini, vous pourrez en faire de mme avec les tests unitaires, grce PHPUnit et son gnrateur de gabarits. Enfin en observant la partie implmentation du processus, vous retrouvez les tapes du TDD en bonne et due forme. La refactorisation a t marque optionnelle car elle pourrait tre effectue durant l'implmentation de la mthode, mais aussi dans le cadre d'une maintenance gnrale du code source. La refactorisation peut tre considre comme un objectif de dveloppement part entire.
D'amples informations :
Cours de conception. Tutoriel sur le dveloppement dirig par les tests (tutoriel avanc). Refactorisation. Dveloppement de logiciel.
-5Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
II - PHPUnit
PHPUnit est un framework de test unitaires open source.
Quelques qualits...
Un syntaxe simple, facile comprendre et retenir. Un grand nombre de mthodes de tests. Organisation et excution des test flexibles. Un utilitaire en ligne de commande complet.
PHPUnit est pris en charge nativement dans les IDE suivant : NuSphere PHPEd. PHPEdit. Zend Studio. PHPEclipse (voir plugin Eclipse SimpleTest ). Eclipse PDT (le support a t prvu).
II-A - Installation
Vous pouvez utiliser PEAR : Interprteur de commandes
pear channel-discover pear.phpunit.de && pear install phpunit/PHPUnit
ou tlcharger et installer manuellement le package via : PHPUnit 3.1.7 est utilis dans ce tutoriel.
http://pear.phpunit.de/get/
-6Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
Indiquer le chemin vers le fichier phpunit.bat dans votre variable d'environnement PATH (ex. SET PATH=%PATH%;C:\chemin\vers\executable\). Commande
phpunit --help
-7Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
Description Journalise l'excution du test au format GraphViz Journalise l'excution du test au format JSON. Journaliser l'excution du test au format TAP. Journalise l'excution du test au format XML. Gnre un rapport de couverture de code (ncessite l'extension PHP Xdebug) au format XML. Gnre un rapport de couverture de code (ncessite l'extension PHP Xdebug) au format HTML. DSN (Paramtres de connexion) de la base de donnes de test (Ndlr : Cette option journalise le rsultat des tests et ventuellement la couverture de code dans une base de donnes) Information de rvision pour la journalisation dans une base de donnes Informations additionnelles concernant la journalisation dans une base de donnes Gnre la documentation Agile au format HTML. Gnre la documentation Agile au format texte. Gnre un rapport de couverture de code (ncessite l'extension PHP Xdebug). Filtre quels tests doivent tre lancs (nom ou expression rationnelle). Spcifie le chargeur de classe utiliser. Nombre de rptitions des tests Reporte la progression du test au format TAP Reporte la progression du test au format TestDox Dsactive le contrle syntaxique des fichiers sources. Interrompt l'excution du test la premire erreur ou chec. Affiche toutes les informations. Une touche doit tre presse entre chaque test. Gnre le gabarit d'une classe de test. Affiche le rcapitulatif des options. Affiche la version de PHPUnit utilise. Dfinit une directive du php.ini
--report
--test-db-dsn
--test-db-log-rev --test-db-log-info --testdox-html --testdox-text --testdox-text --filter --loader --repeat --tap --testdox --no-syntax-check --stop-on-failure --verbose --wait --skeleton --help --version -d key[=value]
-8Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
Le gnrateur prendra en compte les mthodes publiques et ventuellement les annotations d'assertion (voir plus bas) qui leur sont associes. PHPUnit ne permet pas de tester des mthodes prives ou protges. Vous devez donc changer explicitement la visibilit de ces dernires pour qu'elles soient prises en compte. Exemple de gnration
<?php // Call MyClassTest::main() if this source file is executed directly. if (!defined('PHPUnit_MAIN_METHOD')) { define('PHPUnit_MAIN_METHOD', 'MyClassTest::main'); } require_once 'PHPUnit/Framework.php'; require_once 'MyClass.php'; /** * Test class for MyClass. * Generated by PHPUnit on 2007-08-11 at 20:01:00. */ class MyClassTest extends PHPUnit_Framework_TestCase { /** * Runs the test methods of this class. * * @access public * @static */ public static function main() { require_once 'PHPUnit/TextUI/TestRunner.php'; $suite = new PHPUnit_Framework_TestSuite('MyClassTest'); $result = PHPUnit_TextUI_TestRunner::run($suite); } /** * Sets up the fixture, for example, opens a network connection. * This method is called before a test is executed. * * @access protected */ protected function setUp() { } /** * Tears down the fixture, for example, closes a network connection. * This method is called after a test is executed. * * @access protected */ protected function tearDown() { }
-9Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
Exemple de gnration
/** * @todo Implement testMyMethod(). */ public function testMyMethod() { // Remove the following lines when you implement this test. $this->markTestIncomplete( 'This test has not been implemented yet.' ); } } // Call MyClassTest::main() if this source file is executed directly. if (PHPUnit_MAIN_METHOD == 'MyClassTest::main') { MyClassTest::main(); } ?>
Le gnrateur fournit une classe de test comportant des mthodes avec l'annotation @todo Implement ( implmenter ) et un appel ::markTestIncomplete(), qui permet de marquer une mthode ou une partie de son implmentation comme incomplte tant qu'elle n'a pas t prcisment remplie par le programmeur. Vous noterez galement les mthodes protges ::setUp() et ::tearDown(); elles permettent de fournir une fixture, autrement dit un "contexte d'excution" commun toutes les mthodes de test. Dans la pratique, il peut s'agir d'une connexion une base de donnes, ou toute autre instruction vocation collective. La mthode ::setUp() se comporte en constructeur et s'excute avant la mthode de test, tandis que ::tearDown() s'excute aprs celle-ci, faisant office de destructeur. Les autres structures et notamment la mthode statique ::main() sont relatives l'organisation et l'excution des tests. Elles sont expliques plus en dtails au chapitre suivant. Il est possible d'intgrer des tests d'assertion directement dans les mthodes qui seront gnres, pour ce faire vous devez annoter les mthodes de la classe concrte en utilisant la syntaxe suivante :
@assert (argument1 [, argument2, ...]) operator value
value
Description Balise d'assertion Paramtres effectifs de la mthode tester. Il doit y en avoir au moins un. Oprateur de comparaison (sera remplac par la mthode d'assertion qui lui est associ).; La valeur qui sera compare avec la valeur de retour de la mthode.
Exemple :
class MyClass extends PHPUnit_Framework_TestCase { /** * @assert (1) > 2 */ public function myMethod($value) { return $value; } }
- 10 Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
Ces annotions se limitent aux assertions suivantes : Oprateur == != === !== > >= < <= Utilisez cette fonctionnalit avec prcaution ! Assertion Equals (gal ) NotEquals (diffrent de) Same (strictement gal ) NotSame (strictement diffrent de) greaterThan (plus grand que) greatThanOrEqual (plus grand ou gal ) lessThan (plus petit que) lessThanOrEqual (plus petit ou gal )
Cette structure dfinit la premire mthode qui sera excute si le fichier est appel directement. Si la classe de test est incluse dans une suite, la dfinition sera ignore. Mthode statique ::main()
public static function main() { require_once 'PHPUnit/TextUI/TestRunner.php'; $suite = new PHPUnit_Framework_TestSuite('MyClassTest'); $result = PHPUnit_TextUI_TestRunner::run($suite); }
Par dfaut, la mthode statique ::main() fournit une implmentation minimale permettant de lancer le test et ventuellement d'y inclure d'autres lments (cas de test, suites ou autre instructions). Appel
if (PHPUnit_MAIN_METHOD == 'MyClassTest::main') {
- 11 Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
Appel
MyClassTest::main(); } ?>
Finalement, la structure ci-dessus appellera la mthode dfinie en en-tte (::main, dans le cas prcis) si le fichier est excut directement. Pour crer une suite de tests, vous devez instancier la classe PHPUnit_Framework_TestSuite, puis ajouter les tests ou suites de tests qui vous intresse avec les mthodes ::addTest et (ou) ::addTestSuite, comme le montre l'exemple ci-dessous : Mthode statique ::main()
public static function main() { require_once 'PHPUnit/TextUI/TestRunner.php'; $suite = new PHPUnit_Framework_TestSuite('MyClassTest'); $suite->addTest('MyOtherClassTest'); $suite->addTestSuite('MyTestSuite'); $result = PHPUnit_TextUI_TestRunner::run($suite); }
En pratique, les instructions relatives aux suites ne devraient pas figurer dans ::main() mais dans une mthode statique nomme (par convention) ::suite(); comme dans l'exemple ci-dessous : Mthode statique ::suite()
public static function main() { PHPUnit_TextUI_TestRunner::run(self::suite()); } public static function suite() { $suite = new PHPUnit_Framework_TestSuite('All Tests'); $suite->addTest(MyOtherClassTest::suite()); }
De cette manire, vous obtiendrez un code source mieux dcompos et plus lisible.
- 12 Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
Classe AllTests
require_once 'MyClassTest.php'; if (!defined('PHPUnit_MAIN_METHOD')) { define('PHPUnit_MAIN_METHOD', 'AllTests::main'); } class AllTests { public static function main() { PHPUnit_TextUI_TestRunner::run(self::suite()); } public static function suite() { $suite = new PHPUnit_Framework_TestSuite('All Tests'); $suite->addTest(MyClassTest::main()); } } if (PHPUnit_MAIN_METHOD == 'AllTests::main') { AllTests::main(); } ?>
- 13 Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
1 2
Le squelette de la classe MyFile est gnr partir du diagramme de classe susmentionn. Le gabarit de cas de test MyFileTest est gnr partir du squelette de la classe MyFile.
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
MyFileTest.php
} public function testSetExtension() { $file = new MyFile('newFile'); $this->assertTrue($file->setExtension('txt')); $this->assertFalse($file->setExtension(null)); $this->assertFalse($file->setExtension('abcdef')); $this->assertFalse($file->setExtension('')); $this->assertFalse($file->setExtension(1)); } public function testGetFileName() { $exceptedFileName = 'newFile'; $file = new MyFile($exceptedFileName); $this->assertEquals($exceptedFileName, $file->getFileName()); } public function testGetExtension() { $exceptedExtension = 'txt'; $file = new MyFile('newFile', $exceptedExtension); $this->assertEquals($exceptedExtension, $file->getExtension()); } } // Call MyFileTest::main() if this source file is executed directly. if (PHPUnit_MAIN_METHOD == 'MyFileTest::main') { MyFileTest::main(); } ?>
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
MyFile.php
} if (!preg_match('/^[a-z0-9-_]{1,32}$/i',$fileName)) { return false; } $this->fileName = $fileName; return true; } /** * Affecte une extension de fichier (de 1 5 caractres alphanumriques). * @param string $extension * @return boolean */ public function setExtension($extension) { if (!is_string($extension)) { return false; } if (!preg_match('/^[a-z0-9]{1,5}$/i',$extension)) { return false; } $this->extension = $extension; return true; } /** * Retourne le nom de fichier. * * @return string */ public function getFilename() { return $this->fileName; } /** * Retourne l'extension du fichier * * @return string */ public function getExtension() { return $this->extension; } } ?>
PHPUnit fournit quelques exemples complets de test unitaires, ils sont disponibles dans le rpertoire PHPUnit/Samples.
- 16 Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/
Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser (Page personnelle)
III - Conclusion
PHPUnit est un framework de test simple et efficace, son ventail de fonctionnalits permet de crer rapidement des tests unitaires complets et adapts aux applications PHP professionnelles.
III-A - Rfrences
Site officiel de PHPUnit.
Ressources Developpez.com :
PHPEclipse : Programmez librement pour le Web, par Jean-Pierre Grossglauser. PHPEdit, un IDE complet pour PHP, par Guillaume Rossolini. Compte-rendu de la Confrence Internationale PHP 2006, par Guillaume Rossolini.
- 17 Copyright 2007 - Jean-Pierre Grossglauser. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://jp-grossglauser.developpez.com/tutoriels/langages/php/phpunit/