SlideShare une entreprise Scribd logo
Tester votre application MVC Zend Framework Mickaël Perraud Contributeur Zend Framework Responsable documentation française
Qu'allons-nous voir ensemble ? Les bases du test unitaire
Les bases du test fonctionnel avec ZF
Quelques sujets de tests “avancés” avec ZF
Pourquoi tester ?
Simplifier la maintenance Tester les attentes souhaitées
Tester les comportements décrits et identifiés dans l'application
Tester nous informe quand des changements cassent du code ou des comportements existants
Quantifer la qualité du code Couverture du code exercée par les tests unitaires
Tester les méthodes documente les comportements que le code devrait définir
Bénéfices psychologiques On se sent toujours mieux quand on voit du vert
Tester n'est pas ... recharger
Tester n'est pas  …  var_dump()
Tester est  …  reproductible
Tester est  …  automatisable
Les bons tests incluent  … Les comportements définis
Des exemples de code de cas d'utilisation
Les attentes
Les frameworks de tests PHP PHPT Utilisé par PHP, PEAR et quelques librairies indépendantes SimpleTest Framework de test de type JUnit PHPUnit Framework de test de type Junit
Standard industriel  de fait
Les bases du test
Ecrire des tests unitaires Créez une classe de test
Créez une ou deux méthodes qui décrivent des comportements Énoncez les comportements dans un langage naturel Écrivez le code qui crée le(s) comportement(s) Écrivez le code exerçant l'API Écrivez les assertions indiquant les attentes
Création d'une classe de test Habituellement nommé par le nom de classe à tester suivi de Test class  EntryTest    extends  PHPUnit_Framework_TestCase { }
Créez une méthode qui décrit un comportement Préfixé avec “test” class   EntryTest     extends   PHPUnit_Framework_TestCase { public function   testMaySetTimestampWithString() { } }
Ecriture du code qui crée le comportement class  EntryTest   extends  PHPUnit_Framework_TestCase { public function   testMaySetTimestampWithString() { $string   =   'Fri, 7 May 2010 09:26:03 -0700' ; $ts   =   strtotime( $string ); $this ->entry->setTimestamp( $string ); $setValue   =   $this ->entry->getTimestamp(); } }
Ecriture des assertions qui vérifient les attentes class  EntryTest    extends  PHPUnit_Framework_TestCase { public function   testMaySetTimestampWithString() { $string   =   'Fri, 7 May 2010 09:26:03 -0700' ; $ts   =   strtotime( $string ); $this ->entry->setTimestamp( $string ); $setValue   =   $this ->entry->getTimestamp(); $this ->assertSame( $ts ,   $setValue ); } }
Lancement des tests Echec ? Vérifiez vos tests et vos assertions en cas d'éventuelles fautes typographiques ou d'erreurs  d'utilisation
Vérifiez que le code que vous testez ne contient pas d'erreurs
Faîtes les corrections et relancez les tests Succès ? Passez au comportement ou à la fonctionnnalité suivante !
Un peu de terminologie associée aux tests
Scaffolding (“échaffaudage”) des tests Vérifiez que votre environnement est indépendant de toute hypothèse
Initialisez les dépendances nécessaires avant de lancer les tests
Habituellement réalisé dans la méthode “setUp()”
Doublures de test Stubs Remplacement d'un objet par un autre afin que le système puisse continuer son exécution.
Mock Objects Remplacement d'un objet par un autre en redéfinissant ce qu'on attend de lui.
“ Mocks Aren't Stubs”  (Martin Fowler) =>  http://bruno-orsier.developpez.com/mocks-arent-stubs/
Autres types de tests Test conditionnel Le test ne s'exécute que si des conditions sont respectées.
Tests fonctionnels et d'intégration On teste que le système est conforme à ce que l'on attend ; on teste ensuite que l'on interagit correctement avec lui.
Tests quasi-fonctionnel avec Zend Framework
Vue d'ensemble Préparation de l'environnement de PHPUnit
Création d'un TestCase basé sur ControllerTestCase
Amorçage (“bootstrap”) de l'application
Création et distribution (“dispatch”) de la requête
Réalisation des assertions sur la réponse
L'environnement PHPUnit Structure des répertoires tests |-- application |  `-- controllers |-- Bootstrap.php |-- library |  `-- Mkk `-- phpunit.xml 4 dossiers, 2 fichiers
L'environnement PHPUnit Le fichier phpunit.xml <phpunit   bootstrap = &quot;./Bootstrap.php&quot; > <testsuite   name = &quot;Suite de tests&quot; > <directory> ./ </directory> </testsuite> <filter> <whitelist> <directory     suffix = &quot;.php&quot; > ../library/ </directory> <directory     suffix = &quot;.php&quot; > ../application/ </directory> <exclude> <directory     suffix = &quot;.phtml&quot; > ../application/ </directory> </exclude> </whitelist> </filter> </phpunit>
L'environnement PHPUnit Le fichier Bootstrap.php $rootPath   =   realpath(dirname(__DIR__)); if   (!defined( 'APPLICATION_PATH' )) { define( 'APPLICATION_PATH' ,     $rootPath   .   '/application' ); } if   (!defined( 'APPLICATION_ENV' )) { define( 'APPLICATION_ENV' ,   'testing' ); } set_include_path(implode(PATH_SEPARATOR,   array ( '.' , $rootPath   .   '/library' , get_include_path(), ))); require_once   'Zend/Loader/Autoloader.php' ; $loader   =   Zend_Loader_Autoloader::getInstance(); $loader ->registerNamespace( 'Mkk_' );
Création d'une classe de test En étendant Zend_Test_PHPUnit_ControllerTestCase class   ExempleControllerTest extends   Zend_Test_PHPUnit_ControllerTestCase { }
Amorçage de l'application Création d'une instance de Zend_Application, et référencement de celle-ci dans votre méthode setUp() class   ExampleControllerTest extends   Zend_Test_PHPUnit_ControllerTestCase { public function   setUp() { $this ->bootstrap   =   new   Zend_Application( APPLICATION_ENV, APPLICATION_PATH     .   '/configs/application.ini' ); parent::setUp(); } }
Création et distribution d'une requête Méthode simple : on distribue une “url” class   ExempleControllerTest extends   Zend_Test_PHPUnit_ControllerTestCase { // ... public function   testPageStatiqueAUneBonneStructure() { $this ->dispatch( '/exemple/page' ); // ... } }
Création et distribution d'une requête Méthode avancée : on personnalise l'objet de requête avant la distribution class   ExempleControllerTest extends   Zend_Test_PHPUnit_ControllerTestCase { // ... public function   testRequeteXhrRetourneJson() { $this ->getRequest() ->setHeader( 'X-Requested-With' ,   'XMLHttpRequest' ) ->setQuery( 'format' ,   'json' ); $this ->dispatch( '/exemple/xhr-endpoint' ); // ... } }
Création des assertions Les assertions concernent typiquement : La structure des balises de la réponse  Soit en utilisant des sélecteurs CSS ou par une recherche XPath.
Les entêtes de réponse HTTP ou le code de statut
Les éléments de l'objet Request et/ou Response

Contenu connexe

Tendances

Formation PHP
Formation PHPFormation PHP
Formation PHP
kemenaran
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5
julien pauli
 
PHP 7.0 : aperçu des nouveautés
PHP 7.0 : aperçu des nouveautésPHP 7.0 : aperçu des nouveautés
PHP 7.0 : aperçu des nouveautés
Didcode
 
Nouveautés php 7
Nouveautés php 7Nouveautés php 7
Nouveautés php 7
Cyrille Grandval
 
Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement Java
Antonio Gomes Rodrigues
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
neuros
 
PHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPHP 1 - Apprendre les bases
PHP 1 - Apprendre les bases
Pierre Faure
 
Jstl : Java server page Standard Tag Library
Jstl : Java server page Standard Tag LibraryJstl : Java server page Standard Tag Library
Jstl : Java server page Standard Tag Library
Ameni Ouertani
 
Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5
Kristen Le Liboux
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
Abdoulaye Dieng
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
Abdoulaye Dieng
 

Tendances (11)

Formation PHP
Formation PHPFormation PHP
Formation PHP
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5
 
PHP 7.0 : aperçu des nouveautés
PHP 7.0 : aperçu des nouveautésPHP 7.0 : aperçu des nouveautés
PHP 7.0 : aperçu des nouveautés
 
Nouveautés php 7
Nouveautés php 7Nouveautés php 7
Nouveautés php 7
 
Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement Java
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
PHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPHP 1 - Apprendre les bases
PHP 1 - Apprendre les bases
 
Jstl : Java server page Standard Tag Library
Jstl : Java server page Standard Tag LibraryJstl : Java server page Standard Tag Library
Jstl : Java server page Standard Tag Library
 
Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
 

En vedette

Le projet EcoOnto - avancees.
Le projet EcoOnto  - avancees.Le projet EcoOnto  - avancees.
Le projet EcoOnto - avancees.
jchabalier
 
Community management 101
Community management 101Community management 101
Community management 101
coursinis
 
Boceto de power point eneidi
Boceto de power point eneidiBoceto de power point eneidi
Boceto de power point eneidi
eneidiyudith
 
Generacion 3.5 g maria guerra 11
Generacion 3.5 g maria guerra 11Generacion 3.5 g maria guerra 11
Generacion 3.5 g maria guerra 11
alexxtt nova
 
Développement sécurisé d'applications avec Zend Framework
Développement sécurisé d'applications avec Zend FrameworkDéveloppement sécurisé d'applications avec Zend Framework
Développement sécurisé d'applications avec Zend Framework
Mickael Perraud
 
El Aborto
El AbortoEl Aborto
El Aborto
orlando
 
Ley de-protección-del-emblema-y-el-nombre-de-la-cruz-roja-(1)
Ley de-protección-del-emblema-y-el-nombre-de-la-cruz-roja-(1)Ley de-protección-del-emblema-y-el-nombre-de-la-cruz-roja-(1)
Ley de-protección-del-emblema-y-el-nombre-de-la-cruz-roja-(1)
Save Solutions
 
Groupe Launch brochure_Francais
Groupe Launch brochure_FrancaisGroupe Launch brochure_Francais
Groupe Launch brochure_Francais
RobertOstiguy
 
Ley de-fomento-de-teatros-y-cines
Ley de-fomento-de-teatros-y-cinesLey de-fomento-de-teatros-y-cines
Ley de-fomento-de-teatros-y-cines
Save Solutions
 
Formazione Portogallo (fr)
Formazione Portogallo (fr)Formazione Portogallo (fr)
Formazione Portogallo (fr)
Pop Apps
 
Ley de-derechos-por-los-servicios-de-la-direccion-general-de-urbanismo-y-arqu...
Ley de-derechos-por-los-servicios-de-la-direccion-general-de-urbanismo-y-arqu...Ley de-derechos-por-los-servicios-de-la-direccion-general-de-urbanismo-y-arqu...
Ley de-derechos-por-los-servicios-de-la-direccion-general-de-urbanismo-y-arqu...
Save Solutions
 
Fatla BLOQUE0-PACIE
Fatla BLOQUE0-PACIEFatla BLOQUE0-PACIE
Fatla BLOQUE0-PACIE
savita85
 
Edi
EdiEdi
Edi
nikki
 
Ley de-urbanismo-y-construccion
Ley de-urbanismo-y-construccionLey de-urbanismo-y-construccion
Ley de-urbanismo-y-construccion
Save Solutions
 
Informe de estado uno
Informe de estado unoInforme de estado uno
Informe de estado uno
Trevor Quick
 
Ley de-asociaciones-y-fundaciones-sin-fines-de-lucro
Ley de-asociaciones-y-fundaciones-sin-fines-de-lucroLey de-asociaciones-y-fundaciones-sin-fines-de-lucro
Ley de-asociaciones-y-fundaciones-sin-fines-de-lucro
Save Solutions
 
Primera evaluacion
Primera evaluacionPrimera evaluacion
Primera evaluacion
Pau Cabralezs
 
Conceptos basicos[1]
Conceptos basicos[1]Conceptos basicos[1]
Conceptos basicos[1]
Aura Pérez
 
Vorschriften und Fallstricke bei der Einverständniserklärung
Vorschriften und Fallstricke bei der EinverständniserklärungVorschriften und Fallstricke bei der Einverständniserklärung
Vorschriften und Fallstricke bei der Einverständniserklärung
Daniel, Hagelskamp & Kollegen
 

En vedette (20)

Zf2 ce-qui-va-changer
Zf2 ce-qui-va-changerZf2 ce-qui-va-changer
Zf2 ce-qui-va-changer
 
Le projet EcoOnto - avancees.
Le projet EcoOnto  - avancees.Le projet EcoOnto  - avancees.
Le projet EcoOnto - avancees.
 
Community management 101
Community management 101Community management 101
Community management 101
 
Boceto de power point eneidi
Boceto de power point eneidiBoceto de power point eneidi
Boceto de power point eneidi
 
Generacion 3.5 g maria guerra 11
Generacion 3.5 g maria guerra 11Generacion 3.5 g maria guerra 11
Generacion 3.5 g maria guerra 11
 
Développement sécurisé d'applications avec Zend Framework
Développement sécurisé d'applications avec Zend FrameworkDéveloppement sécurisé d'applications avec Zend Framework
Développement sécurisé d'applications avec Zend Framework
 
El Aborto
El AbortoEl Aborto
El Aborto
 
Ley de-protección-del-emblema-y-el-nombre-de-la-cruz-roja-(1)
Ley de-protección-del-emblema-y-el-nombre-de-la-cruz-roja-(1)Ley de-protección-del-emblema-y-el-nombre-de-la-cruz-roja-(1)
Ley de-protección-del-emblema-y-el-nombre-de-la-cruz-roja-(1)
 
Groupe Launch brochure_Francais
Groupe Launch brochure_FrancaisGroupe Launch brochure_Francais
Groupe Launch brochure_Francais
 
Ley de-fomento-de-teatros-y-cines
Ley de-fomento-de-teatros-y-cinesLey de-fomento-de-teatros-y-cines
Ley de-fomento-de-teatros-y-cines
 
Formazione Portogallo (fr)
Formazione Portogallo (fr)Formazione Portogallo (fr)
Formazione Portogallo (fr)
 
Ley de-derechos-por-los-servicios-de-la-direccion-general-de-urbanismo-y-arqu...
Ley de-derechos-por-los-servicios-de-la-direccion-general-de-urbanismo-y-arqu...Ley de-derechos-por-los-servicios-de-la-direccion-general-de-urbanismo-y-arqu...
Ley de-derechos-por-los-servicios-de-la-direccion-general-de-urbanismo-y-arqu...
 
Fatla BLOQUE0-PACIE
Fatla BLOQUE0-PACIEFatla BLOQUE0-PACIE
Fatla BLOQUE0-PACIE
 
Edi
EdiEdi
Edi
 
Ley de-urbanismo-y-construccion
Ley de-urbanismo-y-construccionLey de-urbanismo-y-construccion
Ley de-urbanismo-y-construccion
 
Informe de estado uno
Informe de estado unoInforme de estado uno
Informe de estado uno
 
Ley de-asociaciones-y-fundaciones-sin-fines-de-lucro
Ley de-asociaciones-y-fundaciones-sin-fines-de-lucroLey de-asociaciones-y-fundaciones-sin-fines-de-lucro
Ley de-asociaciones-y-fundaciones-sin-fines-de-lucro
 
Primera evaluacion
Primera evaluacionPrimera evaluacion
Primera evaluacion
 
Conceptos basicos[1]
Conceptos basicos[1]Conceptos basicos[1]
Conceptos basicos[1]
 
Vorschriften und Fallstricke bei der Einverständniserklärung
Vorschriften und Fallstricke bei der EinverständniserklärungVorschriften und Fallstricke bei der Einverständniserklärung
Vorschriften und Fallstricke bei der Einverständniserklärung
 

Similaire à Tester les applications Zend Framework

Service WEB de type REST avec Java
Service WEB de type REST avec JavaService WEB de type REST avec Java
Service WEB de type REST avec Java
Francois ANDRE
 
Spring 3.0
Spring 3.0Spring 3.0
Services rest & jersey
Services rest & jerseyServices rest & jersey
Services rest & jersey
Mathieu Hicauber
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?
Mickael Perraud
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
Korteby Farouk
 
Java 5, un blian
Java 5, un blianJava 5, un blian
Java 5, un blian
tareq
 
Java 5, un bilan
Java 5,  un bilanJava 5,  un bilan
Java 5, un bilan
teejug
 
Introductions Aux Servlets
Introductions Aux ServletsIntroductions Aux Servlets
Introductions Aux Servlets
François Charoy
 
Applets
AppletsApplets
Formation tests decembre2010
Formation tests decembre2010Formation tests decembre2010
Formation tests decembre2010
Fou Cha
 
Prsentation de-javaserver-faces4124
Prsentation de-javaserver-faces4124Prsentation de-javaserver-faces4124
Prsentation de-javaserver-faces4124
Mejdeddine Bouzouita
 
Présentation de JavaServer Faces
Présentation de JavaServer FacesPrésentation de JavaServer Faces
Présentation de JavaServer Faces
JS Bournival
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVC
Nathaniel Richand
 
Tirer parti des décorateurs de Zend_Form
Tirer parti des décorateurs de Zend_FormTirer parti des décorateurs de Zend_Form
Tirer parti des décorateurs de Zend_Form
Mickael Perraud
 
Présentation jQuery pour débutant
Présentation jQuery pour débutantPrésentation jQuery pour débutant
Présentation jQuery pour débutant
Stanislas Chollet
 
Les tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet coreLes tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet core
Arnaud Auroux
 
Dynamic Languages
Dynamic LanguagesDynamic Languages
Dynamic Languages
Tugdual Grall
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentation
julien pauli
 
Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
Korteby Farouk
 
Coat::Persistent at FPW2009
Coat::Persistent at FPW2009Coat::Persistent at FPW2009
Coat::Persistent at FPW2009
Alexis Sukrieh
 

Similaire à Tester les applications Zend Framework (20)

Service WEB de type REST avec Java
Service WEB de type REST avec JavaService WEB de type REST avec Java
Service WEB de type REST avec Java
 
Spring 3.0
Spring 3.0Spring 3.0
Spring 3.0
 
Services rest & jersey
Services rest & jerseyServices rest & jersey
Services rest & jersey
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
Java 5, un blian
Java 5, un blianJava 5, un blian
Java 5, un blian
 
Java 5, un bilan
Java 5,  un bilanJava 5,  un bilan
Java 5, un bilan
 
Introductions Aux Servlets
Introductions Aux ServletsIntroductions Aux Servlets
Introductions Aux Servlets
 
Applets
AppletsApplets
Applets
 
Formation tests decembre2010
Formation tests decembre2010Formation tests decembre2010
Formation tests decembre2010
 
Prsentation de-javaserver-faces4124
Prsentation de-javaserver-faces4124Prsentation de-javaserver-faces4124
Prsentation de-javaserver-faces4124
 
Présentation de JavaServer Faces
Présentation de JavaServer FacesPrésentation de JavaServer Faces
Présentation de JavaServer Faces
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVC
 
Tirer parti des décorateurs de Zend_Form
Tirer parti des décorateurs de Zend_FormTirer parti des décorateurs de Zend_Form
Tirer parti des décorateurs de Zend_Form
 
Présentation jQuery pour débutant
Présentation jQuery pour débutantPrésentation jQuery pour débutant
Présentation jQuery pour débutant
 
Les tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet coreLes tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet core
 
Dynamic Languages
Dynamic LanguagesDynamic Languages
Dynamic Languages
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentation
 
Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
 
Coat::Persistent at FPW2009
Coat::Persistent at FPW2009Coat::Persistent at FPW2009
Coat::Persistent at FPW2009
 

Tester les applications Zend Framework