77
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 avec Symfony

Embed Size (px)

Citation preview

Page 1: Tests unitaires et fonctionnels avec Symfony

Titre présentation | Conférencier

Tests unitaires et fonctionnels avec Symfony 1.2

Geoffrey Bachelet - Hugo Hamon

vendredi 12 juin 2009

Page 2: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Qui sommes-nous ?

• Geoffrey Bachelet • Hugo Hamon

vendredi 12 juin 2009

Page 3: Tests unitaires et fonctionnels avec Symfony

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

Page 4: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Introduction aux tests automatisés

vendredi 12 juin 2009

Page 5: Tests unitaires et fonctionnels avec Symfony

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

Page 6: Tests unitaires et fonctionnels avec Symfony

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

Page 7: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Les tests unitaires

vendredi 12 juin 2009

Page 8: Tests unitaires et fonctionnels avec Symfony

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

Page 9: Tests unitaires et fonctionnels avec Symfony

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

Page 10: Tests unitaires et fonctionnels avec Symfony

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

Page 11: Tests unitaires et fonctionnels avec Symfony

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

Page 12: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Avoir confiance en son code !

vendredi 12 juin 2009

Page 13: Tests unitaires et fonctionnels avec Symfony

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

Page 14: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Les contraintes

Les tests impliquent de la rigueur !

vendredi 12 juin 2009

Page 15: Tests unitaires et fonctionnels avec Symfony

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

Page 16: Tests unitaires et fonctionnels avec Symfony

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

Page 17: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Ayez une approche pragmatique !

vendredi 12 juin 2009

Page 18: Tests unitaires et fonctionnels avec Symfony

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

Page 19: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Les outils de test en PHP

SnapTest

Testilence

Lime

vendredi 12 juin 2009

Page 20: Tests unitaires et fonctionnels avec Symfony

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

Page 21: Tests unitaires et fonctionnels avec Symfony

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

Page 22: Tests unitaires et fonctionnels avec Symfony

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

Page 23: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Les fichiers YAML

vendredi 12 juin 2009

Page 24: Tests unitaires et fonctionnels avec Symfony

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

Page 25: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Le répertoire test/fixtures

vendredi 12 juin 2009

Page 26: Tests unitaires et fonctionnels avec Symfony

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

Page 27: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Exemple pratique (TDD)

Tester une méthode de classe

vendredi 12 juin 2009

Page 28: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Le modèle Product

vendredi 12 juin 2009

Page 29: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Le modèle ProductLine

vendredi 12 juin 2009

Page 30: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Tester la méthode getTotalPrice()

vendredi 12 juin 2009

Page 31: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Tester la méthode getTotalPrice()

vendredi 12 juin 2009

Page 32: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Un bug est découvert...

vendredi 12 juin 2009

Page 33: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Le test confirme le bug !

vendredi 12 juin 2009

Page 34: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Correction du bug

vendredi 12 juin 2009

Page 35: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Validation par les tests

vendredi 12 juin 2009

Page 36: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Tester des objets Doctrine

vendredi 12 juin 2009

Page 37: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Tester des objets Doctrine

vendredi 12 juin 2009

Page 38: Tests unitaires et fonctionnels avec Symfony

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

Page 39: Tests unitaires et fonctionnels avec Symfony

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

Page 40: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Les objets Mock - Exemple 2

• Simuler une fonctionnalité

vendredi 12 juin 2009

Page 41: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Les objets Mock - Exemple 2

vendredi 12 juin 2009

Page 42: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Quelques pièges à éviter...

• sfContext

• sfConfig

• Dépendances dures

vendredi 12 juin 2009

Page 43: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

sfContext dans le modèle

vendredi 12 juin 2009

Page 44: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

sfContext dans le modèle

vendredi 12 juin 2009

Page 45: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

sfContext dans le modèle

vendredi 12 juin 2009

Page 46: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

sfConfig dans le modèle

vendredi 12 juin 2009

Page 47: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

sfConfig dans le modèle

vendredi 12 juin 2009

Page 48: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

sfConfig dans le modèle

vendredi 12 juin 2009

Page 49: Tests unitaires et fonctionnels avec Symfony

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

Page 50: Tests unitaires et fonctionnels avec Symfony

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

Page 51: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Les tests fonctionnels

vendredi 12 juin 2009

Page 52: Tests unitaires et fonctionnels avec Symfony

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

Page 53: Tests unitaires et fonctionnels avec Symfony

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

Page 54: Tests unitaires et fonctionnels avec Symfony

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

Page 55: Tests unitaires et fonctionnels avec Symfony

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

Page 56: Tests unitaires et fonctionnels avec Symfony

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

Page 57: Tests unitaires et fonctionnels avec Symfony

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

Page 58: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Une API fluide et lisible

vendredi 12 juin 2009

Page 59: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Une API extensible - Exemple 1

vendredi 12 juin 2009

Page 60: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Une API extensible - Exemple 2

vendredi 12 juin 2009

Page 61: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Une API extensible - Exemple 2

vendredi 12 juin 2009

Page 62: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Les blocs de tests

vendredi 12 juin 2009

Page 63: Tests unitaires et fonctionnels avec Symfony

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

Page 64: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Créer des objets testeurs

vendredi 12 juin 2009

Page 65: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Créer des objets testeurs

vendredi 12 juin 2009

Page 66: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Créer des objets testeurs

vendredi 12 juin 2009

Page 67: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Tests dans les plugins

vendredi 12 juin 2009

Page 68: Tests unitaires et fonctionnels avec Symfony

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

Page 69: Tests unitaires et fonctionnels avec Symfony

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

Page 70: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Tests unitaires vs Tests de recette

vendredi 12 juin 2009

Page 71: Tests unitaires et fonctionnels avec Symfony

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

Page 72: Tests unitaires et fonctionnels avec Symfony

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

Page 73: Tests unitaires et fonctionnels avec Symfony

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

Page 74: Tests unitaires et fonctionnels avec Symfony

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

Page 75: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

sismo

• Développé par Fabien Potencier• http://ci.symfony-project.org/

vendredi 12 juin 2009

Page 76: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

sismo

• Développé par Fabien Potencier• http://ci.symfony-project.org/

vendredi 12 juin 2009

Page 77: Tests unitaires et fonctionnels avec Symfony

Tests unitaires et fonctionnels | Geoffrey Bachelet - Hugo Hamon

Merci !

Des questions ?

vendredi 12 juin 2009