Upload
geoffrey-bachelet
View
690
Download
1
Embed Size (px)
Citation preview
Titre présentation | Conférencier
Tests unitaires et fonctionnels avec Symfony 1.2
Geoffrey Bachelet - Hugo Hamon
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Qui sommes-nous ?
• Geoffrey Bachelet • Hugo Hamon
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Au sommaire...
• Introduction aux tests automatisés
• Les tests unitaires
• Les tests fonctionnels
• Introduction à l’intégration continue
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Introduction aux tests automatisés
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Introduction aux tests automatisés
• 2 sortes : unitaires et fonctionnels (recette)
• Intégrés dans les méthodes agiles (XP)
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Ils sont les garants...
• du bon fonctionnement du code,• sa robustesse,• sa maintenabilité,• son évolutivité,• sa pérennité,
• de la qualité globale du code / application
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les tests unitaires
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Définition
« En programmation informatique, le test unitaire est un procédé permettant de s’assurer du fonctionnement correct d’une partie déterminée d’un logiciel ou d’une portion d’un programme »
Wikipédia
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
La règle F.I.R.S.T
• Fast
• Independant
• Repeatable
• Self-Validating
• Timely
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les avantages
• valider le fonctionnement
• éviter les régressions fonctionnelles
• découvrir des bugs
• faciliter le refactoring
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les avantages
• documenter le code
• faciliter les migrations
• structurer le développement
• rentabiliser à moyen terme
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Avoir confiance en son code !
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les contraintes
• les tests sont coûteux !
• savoir tester l’essentiel
• maintenir la suite de tests à 100%
• écrire des tests en permanence
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les contraintes
Les tests impliquent de la rigueur !
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Quand tester du code ?
• avant l’implémentation (TDD)• après l’implémentation• à la correction d’un bug
• tester continuellement est la clé !
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Que faut-il tester ?
• les classes du modèle (classes et méthodes)• les bibliothèques utilisateurs (fonctions)• les inclusions de fichiers
• Ne pas tester du code déjà testé !
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Ayez une approche pragmatique !
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
L’approche pragmatique
• tester les méthodes et fonctions critiques
• tester quand un bug est découvert
• => peu de tests valent toujours mieux que rien !
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les outils de test en PHP
SnapTest
Testilence
Lime
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Lime
• Adaptation du module Perl Test::More
• Conforme au standard Test Anything Protocol
• API simple et testée
• Exécute les tests dans des processus séparés
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Test Anything Protocol
• Créé en 1987
• Procédure de standardisation IETF (2008)
• Basé sur le module Perl Test::Harness
• Spécification de-facto
• Format de sortie des tests standardisé
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
L’environnement de test
• Il doit être unique
• Réinitialisé pour chaque suite de tests
• Différent de l’environnement de production !!!
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les fichiers YAML
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les données de test : fixtures
• Chargées en BDD à chaque exécution
• Fichiers YAML dans test/fixtures• 1 fichier par modèle• Fichiers préfixés par un numéro
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Le répertoire test/fixtures
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Exécuter des suites de tests
• php symfony test:all
• php symfony test:unit
• php symfony test:unit testFile
• php symfony test:functional frontend
• php symfony test:functional frontend testFile
• php test/unit/testFileTest.php
• php test/functional/frontend/testFileTest.php
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Exemple pratique (TDD)
Tester une méthode de classe
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Le modèle Product
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Le modèle ProductLine
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Tester la méthode getTotalPrice()
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Tester la méthode getTotalPrice()
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Un bug est découvert...
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Le test confirme le bug !
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Correction du bug
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Validation par les tests
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Tester des objets Doctrine
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Tester des objets Doctrine
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les objets Mock
• Simuler une fonctionnalité
• S'abstraire du contexte réel (webservices, bases de données, système de fichiers)
• S'abstraire des dépendances
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les objets Mock - Exemple 1
• Fixation des droits d’accès de l’utilisateur
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les objets Mock - Exemple 2
• Simuler une fonctionnalité
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les objets Mock - Exemple 2
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Quelques pièges à éviter...
• sfContext
• sfConfig
• Dépendances dures
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
sfContext dans le modèle
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
sfContext dans le modèle
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
sfContext dans le modèle
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
sfConfig dans le modèle
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
sfConfig dans le modèle
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
sfConfig dans le modèle
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
La couverture de code
• Requiert l’extension xdebug
• apt-get install php5-xdebug
• pecl install xdebug
• http://pecl.php.net/package/Xdebug
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
La couverture de code
• Par bibliothèque
• symfony test:coverage test/unit lib/
• symfony test:coverage test/unit/myLibTest.php lib/myLib.php
• Par projet
• symfony test:coverage test/ .
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les tests fonctionnels
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Objectif des tests fonctionnels
• Tester les fonctionnalités de l’application
• Introspecter tous les objets du framework
• Documenter un scénario d’utilisation
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les limites des tests fonctionnels
• Limités à l’environnement Symfony,
• Les JavaScript ne sont pas testables,
• Ne permettent pas de tester le rendu «visuel»,
• Ne remplacent pas des tests Sélénium
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
L’objet sfBrowser
• Simule le comportement d’un navigateur web
• Rend les objets du framework disponibles de la requête à la réponse
• Ne nécessite pas de serveur web
• Embarque lime
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Configurer le navigateur de test
setHttpHeader() Fixe un en-tête HTTP
setAuth() Définit les droits d’accès basiques
setCookie() Fixe un cookie
removeCookie() Supprime un cookie
clearCookies() Supprime tous les cookies courants
followRedirect() Suit la redirection déclenchée
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Simuler la navigation
get() Simule une requête GET
post() Simule une requête POST
call() Simule une requête PUT ou DELETE back() Retourne à la page précédente de l’historique de navigation
forward() Avance d’une page dans l’historique de navigation
reload() Recharge la page courante
click() Simule un clic sur un lien ou un bouton de formulaire
select() Sélectionne un bouton radio ou une case à cocher
deselect() Désélectionne un bouton radio ou une case à cocher
restart() Réinitialise tous les paramètres du navigateur
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
• Embarque sfBrowser
• API fluide et lisible
• Extensible
• Délègue les tests aux «testeurs»
L’objet sfTestFunctional
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Une API fluide et lisible
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Une API extensible - Exemple 1
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Une API extensible - Exemple 2
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Une API extensible - Exemple 2
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les blocs de tests
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Les objets testeurs
• sfTesterRequest• sfTesterResponse (CSS 3 selectors - xPath en symfony 1.3)• sfTesterForm• sfTesterUser• sfTesterViewCache
• sfTesterDoctrine• sfTesterPropel
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Créer des objets testeurs
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Créer des objets testeurs
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Créer des objets testeurs
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Tests dans les plugins
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Tests dans les plugins
• sfTaskExtraPlugin
– http://www.symfony-project/plugins/sfTaskExtraPlugin– Créé par Kris Wallsmith (core team)
• symfony generate:plugin sfMyPlugin
– Structure de base du plug-in– Bootstraps de tests– Fixtures pour les tests fonctionnels
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Tests dans les plugins
• php symfony test:plugin sfFooPlugin
• php symfony test:plugin --only=unit sfFooPlugin
• php symfony test:plugin --only=functional sfFooPlugin
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Tests unitaires vs Tests de recette
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Introduction à l’intégration continue
• Exécution des tests
• Rapport d’erreur
• Build du projet
• Automatique !
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
L’intégration continue - Pourquoi ?
1.Contrôler les régressions
2.Valider les fonctionnalités
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
L’intégration continue
• Les régressions
– corrigées par les développeurs
• Les fonctionnalités
– vérifiées par le client
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
L’intégration continue - Outils
• CruiseControl (Java)
• Hudson (Java)
• Xinc (PHP)
• phpUnderControl (PHP)
• symfonyUnderControl (phpUnderControl)
• sismo
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
sismo
• Développé par Fabien Potencier• http://ci.symfony-project.org/
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
sismo
• Développé par Fabien Potencier• http://ci.symfony-project.org/
vendredi 12 juin 2009
Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon
Merci !
Des questions ?
vendredi 12 juin 2009