Au sommaire... • Introduction aux tests automatisés • Les tests unitaires • Les tests fonctionnels • Introduction à l’intégration continue vendredi 12 juin 2009
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
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
Les avantages • valider le fonctionnement • éviter les régressions fonctionnelles • découvrir des bugs • faciliter le refactoring vendredi 12 juin 2009
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 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