Tests unitaires et fonctionnels avec Symfony 1.2 Geoffrey Bachelet - Hugo Hamon Titre présentation Conférencier
Qui sommes-nous? Geoffrey Bachelet Hugo Hamon
Au sommaire... Introduction aux tests automatisés Les tests unitaires Les tests fonctionnels Introduction à l intégration continue
Introduction aux tests automatisés
Introduction aux tests automatisés 2 sortes : unitaires et fonctionnels (recette) Intégrés dans les méthodes agiles (XP)
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
Les tests unitaires
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
La règle F.I.R.S.T Fast Independant Repeatable Self-Validating Timely
Les avantages valider le fonctionnement éviter les régressions fonctionnelles découvrir des bugs faciliter le refactoring
Les avantages documenter le code faciliter les migrations structurer le développement rentabiliser à moyen terme
Avoir confiance en son code!
Les contraintes les tests sont coûteux! savoir tester l essentiel maintenir la suite de tests à 100% écrire des tests en permanence
Les contraintes Les tests impliquent de la rigueur!
Quand tester du code? avant l implémentation (TDD) après l implémentation à la correction d un bug tester continuellement est la clé!
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é!
Ayez une approche pragmatique!
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!
Les outils de test en PHP SnapTest Lime Testilence
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
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é
L environnement de test Il doit être unique Réinitialisé pour chaque suite de tests Différent de l environnement de production!!!
Les fichiers YAML
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
Le répertoire test/fixtures
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
Exemple pratique (TDD) Tester une méthode de classe
Le modèle Product
Le modèle ProductLine
Tester la méthode gettotalprice()
Tester la méthode gettotalprice()
Un bug est découvert...
Le test confirme le bug!
Correction du bug
Validation par les tests
Tester des objets Doctrine
Tester des objets Doctrine
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
Les objets Mock - Exemple 1 Fixation des droits d accès de l utilisateur
Les objets Mock - Exemple 2 Simuler une fonctionnalité
Les objets Mock - Exemple 2
Quelques pièges à éviter... sfcontext sfconfig Dépendances dures
sfcontext dans le modèle
sfcontext dans le modèle
sfcontext dans le modèle
sfconfig dans le modèle
sfconfig dans le modèle
sfconfig dans le modèle
La couverture de code Requiert l extension xdebug apt-get install php5-xdebug pecl install xdebug http://pecl.php.net/package/xdebug
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/.
Les tests fonctionnels
Objectif des tests fonctionnels Tester les fonctionnalités de l application Introspecter tous les objets du framework Documenter un scénario d utilisation
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
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
Configurer le navigateur de test sethttpheader() Fixe un en-tête HTTP setauth() Définit les droits d accès basiques setcookie() removecookie() clearcookies() followredirect() Fixe un cookie Supprime un cookie Supprime tous les cookies courants Suit la redirection déclenchée
Simuler la navigation get() Simule une requête GET post() Simule une requête POST call() back() forward() reload() click() select() deselect() restart() Simule une requête PUT ou DELETE Retourne à la page précédente de l historique de navigation Avance d une page dans l historique de navigation Recharge la page courante Simule un clic sur un lien ou un bouton de formulaire Sélectionne un bouton radio ou une case à cocher Désélectionne un bouton radio ou une case à cocher Réinitialise tous les paramètres du navigateur
L objet sftestfunctional Embarque sfbrowser API fluide et lisible Extensible Délègue les tests aux «testeurs»
Une API fluide et lisible
Une API extensible - Exemple 1
Une API extensible - Exemple 2
Une API extensible - Exemple 2
Les blocs de tests
Les objets testeurs sftesterrequest sftesterresponse (CSS 3 selectors - xpath en symfony 1.3) sftesterform sftesteruser sftesterviewcache sftesterdoctrine sftesterpropel
Créer des objets testeurs
Créer des objets testeurs
Créer des objets testeurs
Tests dans les plugins
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
Tests dans les plugins php symfony test:plugin sffooplugin php symfony test:plugin --only=unit sffooplugin php symfony test:plugin --only=functional sffooplugin
Tests unitaires vs Tests de recette
Introduction à l intégration continue Exécution des tests Rapport d erreur Build du projet Automatique!
L intégration continue - Pourquoi? 1. Contrôler les régressions 2. Valider les fonctionnalités
L intégration continue Les régressions corrigées par les développeurs Les fonctionnalités vérifiées par le client
L intégration continue - Outils CruiseControl (Java) Hudson (Java) Xinc (PHP) phpundercontrol (PHP) symfonyundercontrol (phpundercontrol) sismo
sismo Développé par Fabien Potencier http://ci.symfony-project.org/
sismo Développé par Fabien Potencier http://ci.symfony-project.org/
Merci! Des questions?