Sunteți pe pagina 1din 17

Introduction aux tests unitaires avec PHPUnit 3.

1
par Jean-Pierre Grossglauser (Page personnelle)

Date de publication : 15/08/2007 Dernire mise jour : 15/08/2007

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 - Introduction I-A - Remerciements


Mes remerciements Guillaume Rossolini pour ses critiques et sa relecture.

I-B - qui s'adresse ce tutoriel ?


Pour aborder ce tutoriel dans les meilleures conditions, vous devez : Matriser le paradigme orient objet PHP 5.

I-C - Prrequis
Bibliothque PEAR ( Guide d'installation de PEAR). Pouvoir excuter PHP en ligne de commande.

I-D - A propos des tests unitaires dans PHP


Le langage PHP est un langage de programmation flexible, permissif et facile apprhender. Les principes et contraintes de conception gnralement imposes dans les langages vocation industrielle (C/C++, Java, etc.) ne s'appliquent pas ncessairement avec PHP. Le programmeur est seul matre bord, il choisit la prcision avec laquelle il souhaite intgrer un paradigme, que ce soit impratif, fonctionnel ou orient objet, tout comme il dcide de structurer ou non son dveloppement par rapport des processus prouvs. Cette grande libert est l'origine du succs du langage, mais c'est galement son plus grand dfaut. Beaucoup de dveloppeurs PHP qui n'ont pas de formation spcifique en programmation ou qui sont peu expriments ne peroivent pas l'importance d'un processus de dveloppement, et de test en particulier. L'abscence d'une forme structure de tests engendre notamment les problmatiques suivantes : Le code source n'est pas test en profondeur : cela a pour consquence des alas de post-publication , plus ou moins critiques. Le plus souvent il s'agit d'instabilits dans l'application ou des problmes de scurit classiques. Le code source n'est pas robuste : toute modification du code source (refactorisation, ajout de fonctionnalits) est susceptible d'engendrer des rgressions. Le code source n'est pas rutilisable, pas transmissible : si un autre dveloppeur doit vous assister ou reprendre votre travail, il sera confront d'une part votre code source et d'autre part l'absence d'un protocole de test uniformis. Le code source n'est pas volutif : il va sans dire, plus votre application aura une structure complexe et plus vous peinerez dceler des erreurs et problmes de conception de manire empirique. Vous serez contraint moyen terme, de reprogrammer entirement votre application. Tout ceci aura non seulement un impact sur la fiabilit de votre programme (et vos prestations de service), mais galement sur le temps allou pour le dveloppement et la maintenance du projet, avec les tracas que cela implique pour vous et vos utilisateurs finaux.

-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.

Quelques fonctionnalits avances


Support des objets "mock" (simulateur d'objets) Analyse de la couverture de code (code coverage analyse). Support de Selenium RC (tests fonctionnels) Journalisation des tests aux format XML, JSON, TAP ou dans une base de donnes.

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/

II-B - Utilitaire de ligne de commande


L'utilitaire de ligne de commande phpunit est le principal outil ddi la configuration et l'excution des tests unitaires. Cet utilitaire est optimis pour les systmes Unix/Linux, si vous souhaitez l'utiliser avec Windows, vous devez : Dfinir les variables d'environnement PHP_CLI (chemin vers l'applicatif php.exe) et PHPUNIT_HOME (chemin vers le rpertoire de PHPUnit); Crer un fichier *.bat dnomm phpunit.bat et y ajouter l'instruction suivante : %PHP_CLI % %PHPUNIT_HOME%\PHPUnit\TextUI\Command.php %*;

-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)

Option --log-graphviz --log-json --log-tap --log-xml --coverage-xml

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)

II-C - criture des tests II-C-1 - Gnrateur de gabarit


Le gnrateur de gabarit (gnrateur de template, ou encore gnrateur de squelette) cre des gabarits de code source pour vos tests. Il s'agit de modles de conception qui vous permettent d'augmenter votre productivit tout en diminuant considrablement les risques d'erreurs lis l'organisation et l'excution des tests. Interprteur de commandes
phpunit --skeleton MyClass

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

Structure @assert (argument1[,argument2, ...]) operator

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)

Mthode de test gnre :


/** * Generated from @assert (1) > 2. */ public function testMyMethod() { $constraint = $this->greaterThan(2); $object = new myClass; $value = $object->myMethod(1); $this->assertThat($value, $constraint); }

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 )

II-D - Organisation des tests


PHPUnit offre une solution particulirement flexible pour organiser vos tests, vous pouvez les excuter indpendamment les uns des autres, les grouper en suites, ou rassembler les suites elles-mmes afin d'excuter le tout en une seule fois. En reprenant une partie de l'exemple 1.0, vous remarquerez que le gnrateur de gabarit propose plusieurs lments ddis la composition de tests : L'en-tte
if (!defined('PHPUnit_MAIN_METHOD')) { define('PHPUnit_MAIN_METHOD', 'MyClassTest::main'); }

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.

II-E - Excution des tests


Pour lancer un seul cas de test ou une suite : Lancement du cas de test MyClass
phpunit MyClass

II-E-1 - Lancer une suite de tests


Pour lancer tous les tests unitaires squentiellement, vous devez crer une classe principale comme ci-dessous, en y indiquant tous les cas de test et suites qui vous intressent : Classe AllTests
<?php require_once 'PHPUnit/Framework.php'; require_once 'PHPUnit/TextUI/TestRunner.php'; require_once 'MyClass.php';

- 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(); } ?>

Pour lancer cette classe, vous devrez utiliser directement PHP :

Interprteur de commandes - Excution d'un cas de test


php AllTests.php

II-E-2 - Indicateurs de rsultat


Un indicateur de rsultat est fourni pour chaque mthode de test excute : Indicateur . F E S I Description Le test passe. Le test a chou (Failure). Le test a gnr une erreur PHP. Le test est ignor (Skipped). Le test est marqu comme incomplet (Incomplete).

II-F - Exemple rcapitulatif


Voici un exemple rcapitulatif de test unitaire. La classe MyFile a pour attributs un nom (fileName) et une extension (extension) de fichier. Le nom de fichier doit tre une chane de caractres de de 1 32 caractres alphanumriques (ASCII), trait d'union et sous-tiret compris. Tous les autres caractres sont proscrits. L'extension de fichier doit tre compose de 1 5 caractres alphanumriques (ASCII). Diagramme de classe UML de MyFile :

- 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.

Implmentation du cas de test MyFileTest : MyFileTest.php


<?php // Call MyFileTest::main() if this source file is executed directly. if (!defined('PHPUnit_MAIN_METHOD')) { define('PHPUnit_MAIN_METHOD', 'MyFileTest::main'); } require_once 'PHPUnit/Framework.php'; require_once 'MyFile.php'; /** * Test class for MyFile. * Generated by PHPUnit on 2007-08-12 at 19:25:50. */ class MyFileTest 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('MyFileTest'); $result = PHPUnit_TextUI_TestRunner::run($suite); } public function testSetFileName() { $file = new MyFile; $this->assertTrue($file->setFileName('newfile')); $this->assertTrue($file->setFileName('newfile1')); $this->assertTrue($file->setFileName('new_file')); $this->assertTrue($file->setFileName('new-file')); $this->assertFalse($file->setFileName(null)); $this->assertFalse($file->setFileName('ThisFileNameIsVeryLongTooLongReallyTooLong')); $this->assertFalse($file->setFileName('NewFileWith.ext')); $this->assertFalse($file->setFileName('file')); $this->assertFalse($file->setFileName(1)); - 14 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)

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(); } ?>

Implmentation de la classe MyFile MyFile.php


<?php class MyFile { protected $fileName; protected $extension; public function __construct($fileName = null, $extension = null) { if (!is_null($fileName)) { $this->setFileName($fileName); } if (!is_null($extension)) { $this->setExtension($extension); } } /** * Affecte un nom de fichier (de 1 32 caractres alphanumriques, trait d'union et sous-tiret compris). * @param string $fileName * @return boolean */ public function setFileName($fileName) { if (!is_string($fileName)) { return false; - 15 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)

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; } } ?>

Excution du test unitaire : Interprteur de commandes


phpunit MyFileTest PHPUnit 3.1.7 by Sebastian Bergmann. .... Time: 0 seconds OK (4 tests)

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/

S-ar putea să vă placă și