Chapitre 7 Test logiciel

Documents pareils
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Environnements de développement (intégrés)

Programmation par les Objets en Java

Plan. Tests. 1. Introduction. 1. Introduction

Programmer en JAVA. par Tama

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

INF2015 Développement de logiciels dans un environnement Agile Examen final hiver 2015

TP1 : Initiation à Java et Eclipse

Programmation Objet - Cours II

Héritage presque multiple en Java (1/2)

as Architecture des Systèmes d Information

Un ordonnanceur stupide

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Test et Validation du Logiciel

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Quatrième partie IV. Test. Test 15 février / 71

Programmation avec des objets : Cours 7. Menu du jour

.NET - Classe de Log

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Application web de gestion de comptes en banques

Le génie logiciel. maintenance de logiciels.

Tp 1 correction. Structures de données (IF2)

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Programmation par composants (1/3) Programmation par composants (2/3)

Corrigé des exercices sur les références

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Chapitre 2 Devine mon nombre!

Plan du cours. Historique du langage Nouveautés de Java 7

Qualité du logiciel: Méthodes de test

I. Introduction aux fonctions : les fonctions standards

RMI le langage Java XII-1 JMF

Langage Java. Classe de première SI

Chapitre 10. Les interfaces Comparable et Comparator 1

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

CCI Génie Logiciel UFR - IMA. Objectifs du cours d'aujourd'hui. Génie Logiciel Validation par le test. Qu est-ce que tester un programme?

Généralités sur le Langage Java et éléments syntaxiques.

Vérification et Validation

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Chapitre 2. Classes et objets

Conventions d écriture et outils de mise au point

Le stockage local de données en HTML5

Projet ISN - dossier réalisé par Randrianarimanana Stéphanie. Titre du projet : Site de rencontre. le nom de notre site de rencontre : Linkymeet

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Diagnostic adaptatif d'un flux d'alarmes par méta diagnostic distribué Application à la détection d'intrusions dans un serveur Web

Java Licence Professionnelle CISII,

Spring par la pratique

Création d objet imbriqué sous PowerShell.

Projet Active Object

TP3 Intégration de pratiques agiles. 1. User Stories (1) Scénario d intégration agile. En direct-live du château

Cours 1: Java et les objets

Installation d'un serveur DHCP sous Windows 2000 Serveur

Uniboard: optimiser votre enseignement à l'aide du tableau noir électronique

Programmation en Java IUT GEII (MC-II1) 1

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Initiation à JAVA et à la programmation objet.

XP : plus qu'agile. Extreme Programming v2 et Développement Responsable. Thierry Cros

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Harp - Basculement des élèves en début d année

Séance 1 Méthodologies du génie logiciel

Mettre à jour PrestaShop

TRAAM STI Acquisition et exploitations pédagogiques des données sur un système pédagogique

Outil de gestion et de suivi des projets

Recherche dans un tableau

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Dossier projet isn 2015 par Victor Gregoire

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

L import massif introduit plusieurs nouvelles fonctionnalités, selon que l on importe un thésaurus, un ensemble de valeurs contrôlées ou un corpus.

Ouvrir dossier D appel

Processus d Informatisation

Corrigés des premiers exercices sur les classes

LES TOUT PREMIERS PAS

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

TD/TP PAC - Programmation n 3

Vérifier la qualité de vos applications logicielle de manière continue

Applet pour visualiser les variables «automate» notifiées

La correction des erreurs d'enregistrement et de traitement comptables

Objets et Programmation. origine des langages orientés-objet

Introduction au langage C

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

HemoMap v Utilisation de l'application sur smartphone Android

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

Gestion Electronique des Documents et la qualité documentaire au cœur du développement durable.

Premiers Pas avec OneNote 2013

Auto-évaluation Programmation en Java

GOL-502 Industrie de services. Travaux Pratique / Devoir #7

STAGE IREM 0- Premiers pas en Python

Circuit du médicament informatisé

Transcription:

1I2AC1 : Génie logiciel et Conception par objet Chapitre 7 Test logiciel «Durant le débogage, les novices insèrent du code correctif, alors que les experts suppriment du code défectueux.» Richard Pattis (Professeur université de Californie) Régis Clouard regis.clouard @ ensicaen.fr ENSICAEN 14050 Caen

Objectifs de ce chapitre 2 1 Généralités sur les tests 2 les tests unitaires 3 L'outil JUnit 4 test en isolation et doublures 5 Développement dirigé par les tests

Pourquoi tester? 3 Seul moyen pour chasser les bugs Pas de preuve formelle pour des programmes quelconques, donc pas de programme automatique de preuve de code Éviter les mauvaises surprises Découverte de bugs après la mise en production Rassurer le développeur Lorsque le code a atteint une certaine complexité, on commence à craindre les modifications Rassurer le client Produit final de meilleur qualité

Bugs comiques... 4 Ordinateur de bord de la Citroën C5 «Mise à jour du système en cours. Veuillez ne pas arrêter le moteur pendant les 25 prochaines minutes.»

... bugs préoccupants... 5 Perte de Mars Climate Orbiter (1999) lors de son entrée dans l'orbite de Mars. C'est une erreur de traduction entre systèmes d'unités : des pounds vers les newtons qui est à l'origine de la défaillance. Coût de 327 millions de $.

... bugs tragiques 6 Mort tragique de Lydia Cohen, 72 ans à l'hôpital de Versailles en novembre 2011. Son allergie à un antibiotique, l'amoxicilline était bien notée dans son dossier médical, mais le logiciel utilisé pour les prescriptions n'a pas intégré cette donnée.

La chasse aux bugs 7 Les bugs sont inhérents à l'activité de codage Le code zéro défaut n'existe pas (sauf exceptions). Estimation : 1 à 10 bugs / Kilo lignes de code Mais il est possible d'en détecter certains en testant les programmes. On peut limiter la casse. Il est du devoir du développeur de tester son code.

Coût d'un bug dans le cycle de vie d'un logiciel 8 Charge de travail Temps Développement Production Exploitation

Mauvaise pratique de la 9 correction de bugs Pratique classique (parfois enseignée) 1. Truffer le code d'appels d'affichage (printf). 2. Lancer le programme pour espérer isoler les lignes de bugs. 3. Corriger le bug en modifiant et relançant le programme autant de fois que nécessaire. 4. Effacer les appels d'affichage Mais cette pratique est inefficace : Plus le code est développé, plus le temps de recherche de bug est important. Ne prémunie pas contre la régression (n'empêche pas le bug de se reproduire) L'introduction de lignes de code peut changer le programme (cf. erreurs mémoires)

Bonne pratique : le test 10 Le test s'entend comme test dynamique (ie. exécutable) : «Tester est l'activité qui consiste à exécuter un programme avec l'intention de trouver des bugs» - Glenford Myers Procédé de Vérification & Validation (V&V) Vérification : le logiciel fonctionne t-il correctement? Définition ISO 9000 : confirmation par l examen et la fourniture de preuves objectives que des exigences spécifiées ont été remplies. Validation : a-t-on construit le bon logiciel? Définition ISO 9000 : confirmation par l examen et la fourniture de preuves objectives que les exigences, pour un usage ou une application voulue, ont été remplies.

Pyramide des tests 11 Validation 1-5 % 5-15 % 80-90 % Vérification

Niveaux de test 12 Test unitaire Test en isolation des unités de développement. Erreurs recherchées : erreurs de codage, erreurs fonctionnelles. Test d intégration Test de l assemblage des unités Erreurs recherchées : erreurs d interface entre unités. Test système Test du système dans son ensemble, IHM Erreurs recherchées : absence de fonctionnalités ou fonctionnalités mal mises en œuvre.

Types de test 13 Test boîte blanche (white-box testing) Basé sur la structure interne de l'unité testée et peut utiliser les parties protégées et privées Test boîte noire (black-box testing) Basé sur les spécifications de l'unité testée et ne peut utiliser que les parties publiques.

Exemple fil rouge 14 On suppose une classe Human possédant les méthodes publiques suivantes : void setage( int age ) void setagelimit( int age ) boolean isadult( ) qui : lève une exception si age [0, age_limit] retourne true si age [18, age_limit] retourne false si age [0, 18]

Étape 1 : Objectif de test 15 On choisit une caractéristique ou une fonction à tester : C'est l'objectif de test. Par exemple On décide de tester la méthode isadult() dans le cas nominal où le paramètre age est dans [18, age_limit]

Étape 2 : Donnée de test 16 Ensuite on choisit une donnée de test. Pour notre exemple, il faut choisir : une valeur pour le seuil d'âge limite une valeur pour le paramètre age qui soit dans l'intervalle [18, age_limit] La donnée de test sera par exemple : (age_limit = 150, age = 35)

Étape 3 : Test exécutable 17 On code le test On exécute le système avec la donnée de test. Dans notre exemple, si h est un objet de type Human tel que : age_limit = 150 alors on effectue le test h.setage(35); h.isadult();

Étape 4 : Oracle 18 On compare le résultat obtenu au résultat attendu : c'est l'oracle une assertion : une expression booléenne censée être vraie. Dans notre exemple, l'oracle est : h.isadult() == true

Étape 5 : Verdict 19 On en déduit si le test a réussi ou échoué : c'est le verdict. Verdict classique : si on récupère true : le test passe si on récupère false : le test échoue s'il y a levée d'exception, c'est une erreur, le test est inconclusif.

Associer verdict et oracle 20 Il manque quelque chose : on aimerait déduire automatiquement le verdict de l'exécution du test (via l'oracle). On verra plus loin comment faire avec JUnit. En première approche : try { if (h.isadult()) { System.out.println("test passe"); } else { System.out.println("test echoue"); } } catch(exception e) { System.out.println("erreur, test inconclusif"); }

Fixture 21 Avant d'exécuter l'oracle, il faut amener l'objet dans un état favorable : fixture (installation) Dans notre exemple Création de l'objet et positionnement de son état. Human h = new Human(); h.setagelimit(150); try {... // oracle...}

Cas de test 22 L'ensemble du test exécutable s'appelle un cas de test : Définition IEEE 610 : Un cas de test est un ensemble de données de tests, de pré-conditions d exécution, de résultats attendus développés pour un objectif, tel qu exécuter un chemin particulier d un programme ou vérifier le respect d une exigence spécifique. Human h = new Human(); // fixture h.setagelimit(150); try { h.setage(35); // donnée de test if (h.isadult()) { // oracle System.out.println("test passe"); // verdict } else { System.out.println("test echoue"); } } catch (Exception e) { System.out.println("erreur, test inconclusif"); }

Quand s'arrêter de tester? 23 Les tests sont incomplets par nature On a testé isadult() pour une valeur d'entrée seulement On n'aurait pas pu les tester toutes! Savoir quand s'arrêter est une question d'expérience Donc : Le test ne certifie pas le code : «Le test de programme peut être utilisé pour prouver la présence de bugs, mais jamais leur absence» - Edsger Dijkstra Parfois le code est faux, mais les tests aussi (cas le plus perfide).

Objectifs de ce chapitre 24 2 les tests unitaires 3 L'outil JUnit 4 test en isolation et doublures 5 Développement dirigé par les tests

Test unitaire 25 Procédé de vérification le code d'une unité ne comporte pas d'erreur de programmation En programmation orientée objet, l'unité est la classe À chaque classe on associe une autre classe qui la teste. Les tests unitaires testent une classe et une seule et sont indépendants les uns des autres (test en isolation). S'assurer que si un test échoue c'est la classe testée qui est fautive Par exemple: On teste les méthodes publiques et protégées de la classe TelecommandeTV en isolation Si on teste la classe TelecommandeTV en utilisant une télévision dans les tests, c'est du test d'intégration

FIRST : Qualité d'un test unitaire 26 Fast (Rapide) Plusieurs centaines de tests par seconde Isolated (Isolé) Les causes d'échec des tests sont évidentes Repeatable (Répétable) Exécutions répétitives dans n'importe quel ordre et à n'importe quel moment Self-validating (Auto-évaluable) Pas de recours à un utilisateur pour décider des résultats Timely (Juste à temps) Programmé quand on a la connaissance sur la fonctionnalité

Testabilité d'un code 27 Par exemple, une alarme qui se déclenche à une heure butoir donnée dans un agenda. On part du très mauvais code suivant : public final class Agenda {... public void check() { if (System.getTimeInMillis() > 100) { new Bell().ring(); } } } Voyez-vous pourquoi il est mauvais?

Contrôler une entrée indirecte 28 La méthode check() à deux données de test : la date à laquelle l'alarme se déclenche : p. ex 17h la date courante : p. ex 17h03. Or dans check() la date courante est nécessairement fournie par System. System étant incontrôlable ce code n'est pas testable. On dit que la date courante est une entrée indirecte de check(), qu'il faut pouvoir contrôler.

Observer une sortie indirecte 29 L'objectif du test est : vérifier que l'alarme se déclenche si la date courante est postérieure à la date butoir. Quel est l'oracle? écouter si on entend ou pas quelque chose (mais ce n'est pas auto-évaluable). observer si la méthode ring() de Bell a été appelée. Or l'objet Bell est créé par check() : il n'est pas observable ce code n'est pas testable On dit que l'interaction avec Bell est une sortie indirecte de check(), qu'il faut pouvoir observer.

Code testable 30 Solution : Encapsulation et externalisation des dépendances pour rendre un code testable public final class Agenda { public Agenda( MyTime limit, Clock current, Bell bell ) { } public Agenda( ) { _current, = System; _bell = new Bell(); _limit = 100; } public void check() { if (istimetoring()) { _bell.ring(); } } private boolean istimetoring() { MyTime now = _current.gettimeinmillis(); return _limit.isbefore(now); } }

Limites du test unitaire 31 Classe abstraite Solution : créer dans la classe test une classe héritant de la classe abstraite pour ne tester que les méthodes de la classe abstraite. Attribut privé sans accesseur Solution : si les attributs sont importants, passer les attributs en protected et faire une classe qui hérite et que l'on peut tester. Méthode privée Solution : même principe que précédemment Classe avec dépendances à d'autres classes Solution : utilisation des doublures (voir section 4).

Objectifs de ce chapitre 32 3 L'outil JUnit 4 test en isolation et doublures 5 Développement dirigé par les tests

JUnit 33 Intégré à Netbeans / Eclipse Ce qu'il offre Des assertions expressives pour exprimer les oracles La visualisation du verdict La possibilité de lancer facilement les tests

Organisation des sources 34 Les tests ne sont pas dans le source de l'applicatif! Le dossier de travail contient les dossiers : bin pour les exécutables src contenant les paquets pour les sources applicatifs test avec les mêmes paquets mais contenant les sources des tests. Avantages : permet de livrer les tests ou non avec l'applicatif conserve pour les tests la structure en paquet des sources de l'application meilleure intelligibilité du code

Les assertions de base de JUnit 35 Servent à décrire l'oracle du cas de test. asserttrue(boolean condition) assertfalse(boolean condition) assertequals(object expected, Object actual) Utilise equals() des objets. assertequals(double expected, double actual, double delta) assert[not]same(object expected, Object actual) Même objet en mémoire assert[not]null(object actual) assertarrayequals([] expecteds, [] actuals) fail()

Méthode de test JUnit: @Test 36 Méthode d'une classe de test, représentant un cas de test. annotée par @Test publique, type de retour void, sans paramètre Exemple @Test public void testisanadultifagegreaterthan18() { Human h = new Human(); h.setagelimit(150); h.setage(35); assertequals(h.isadult()); }

Gestion des exceptions 37 Exemple Vérifier que l'appel de la méthode lève une exception @Test(expected = OutOfLevelException.class) public void testthrowexceptionifageisgreaterthanthemaxiumum() throws OutOfLevelException { Human h = new Human(); h.setagelimit(150); h.setage(151); }

Le verdict de JUnit 38 Verdict le test passe : barre verte le test échoue : barre rouge levée d'une exception inattendue : barre rouge

Fixture JUnit : @Before 39 Préambule : méthode annotée par @Before : appelée avant chaque appel d'une méthode de test sert à factoriser la construction des objets. public final class TestLevelManagement { private Human _human; @Before public void setup() throws Exception { _human = new human(); _human.setmaxiumage(150); } } @Test(expected = OutOfLevelException.class) public void testagegreaterthanmax()throws OutOfLevelException { h.setage(151); h.isadult(); }

Fixture : les autres méthodes 40 Postambule : méthode annotée par @After Appelée après chaque appel d'une méthode de test. Préambule et postambule de classe : méthodes annotées @BeforeClass et @AfterClass publiques et statiques. exécutées avant (resp. après) l'appel de la première (resp. dernière) méthode de test une seule méthode pour chaque annotation

Objectifs de ce chapitre 41 4 test en isolation et doublures 5 Développement dirigé par les tests

Pourquoi des doublures? 42 Offrir une solution pour développer des tests même lorsque le test nécessite : Un composant dont le code n'est pas encore disponible p. ex : persistance des données Un composant difficile à mettre en place p. ex : une base de données Un comportement exceptionnel d'une classe p. ex : déconnexion dans un réseau Un composant dont le code est lent p. ex : construction d'un maillage Une fonction qui a un comportement non-déterministe p. ex : réseau

La doublure 43 Classe créée dans le paquet test pour remplacer une classe du logiciel dans le paquet src. Rôles : Le substitut (fake) classe qui est une implémentation partielle et qui retourne toujours les mêmes réponses selon les paramètres fournis. L'espion (spy) classe qui vérifie l'utilisation qui en est faite après l'exécution.

Exemple de Mockito 44 On suppose la classe MonInterface à doubler : D'abord dans le fichier test on importe le paquet : import static org.mockito.mockito.*; On crée les doublures par la méthode mock() : MonInterface mi = mock(moninterface.class); On décrit le comportement attendu de la doublure : when(mi.mamethode()).thenreturn(56) when(mi.mamethode()).thenthrow(new Exception()) On crée l'objet de la classe à tester en utilisant les doublures à la place des objets réels. On vérifie que l'interaction avec les doublures est correcte par la méthode Mockito.verify().

Exemple de substitut 45 @Test public void testliremessagesavecbonmotdepasse() { IdentificationUtilisateur mi; mi = mock(identificationutilisateur.class); when(mi.liremessages("toto", "mdp")).thenreturn(true); when(mi.liremessages("toto", "mauvais_mot_de_passe")).thenreturn(false); MessagerieUtilisateur msg = new MessagerieUtilisateur(mi); } msg.liremessages("toto", "mdp"); asserttrue(true);

Exemple d'espionnage 46 @Test public void testliremessages() { IdentificationUtilisateur mi; mi = Mockito.mock(IdentificationUtilisateur.class); Mockito.when(mi.identifier("toto", "mdp")).thenreturn(true); Mockito.when(mi.identifier("toto", "mauvais_mot_de_passe")).thenreturn(false); // étape 1 : on introduit la doublure MessagerieUtilisateur msg = new MessagerieUtilisateur(mi); } // étape 2 : on lance le traitement try { msg.liremessages("toto", "mdp"); msg.liremessages("toto", "mauvais_mot_de_passe"); catch(exception e) { } // étape 3 : vérifions que la méthode identifier() a bien été // appelée exactement une fois avec ces paramètres Mockito.verify(mi, times(1)).identifier("toto", "mdp"); // et exactement une fois avec ces paramètres Mockito.verify(mi, times(1)).identifier("toto", "mauvais_mot_de_passe");

Objectifs de ce chapitre 47 5 Développement dirigé par les tests

TDD : Test Driven Development 48 Méthodologie de développement on écrit les tests avant d écrire le code. La conception est aussi dirigée par les tests émerge au fil du développement seule l'architecture est décidée a priori Règle d'or du TDD : «Ne jamais écrire une ligne de code fonctionnel sans qu'une ligne de code de test ne l'exige.»

En pratique : le mantra du TDD 49 Mantra Garder la barre verte pour garder le code propre Red - Green - Refactor Et plus précisément : 1. écrire un test pour une fonctionnalité à développer. 2. l exécuter et constater que la barre est rouge. 3. écrire le code qui permet de faire passer le test (et rien que ce code). 4. lancer le test et vérifier qu il passe, barre verte. 5. relancer tous les tests précédents 6. remanier le code 7-1

Pourquoi écrire un seul test à la 50 fois? Développement itératif optique du petit pas le test représente un comportement on ne passe au comportement suivant que lorsque le précédent a été validé validé = implanté et le test passe

Pourquoi ne pas écrire tout le 51 code fonctionnel d un coup? Pratique On n écrit que le code qui a besoin d être validé par un test. Sinon on risque d introduire du code applicatif non testé. d ajouter des fonctionnalités inutiles.

Pourquoi exécuter le test avant d écrire le code? 52 Pour commencer par une barre rouge S'assurer que le test ne passe pas. Permet de détecter des étourderies : construire le test par copier-coller d un autre test, et oublier de le modifier ( barre verte). oublier d annoter la méthode de test par @Test ne teste pas. construire un test qui s'exécute avec la barre verte sans le code à tester. oublier ce que devrait être l oracle.

Pourquoi remanier? 53 On cherche d abord à avoir un code qui fonctionne (= qui passe les indicateurs au vert). Le remaniement (voir chapitre 8) le code peut être un cas particulier pour les besoins du test Le code peut être redondant ou très laid. On factorise (DRY principle Don't Repeat Yourself), on améliore, on rend le code le plus lisible possible. Le code affreux n est autorisé que le temps de faire passer un test. On reteste

Avantages psychologiques 54 Travailler plus sereinement Si un bug apparaît, il sera détecté très tôt par les tests. Les erreurs sont corrigées en amont. Grâce aux petits pas on a moins peur d attaquer une tâche complexe. Grâce au code testé on est serein. on planifie mieux son travail. on évite les paniques de dernière minute. Focaliser sur la tâche oblige à réfléchir à ce que doit faire le code avant de coder.

Avantages techniques 55 Garder un temps de développement constant Tout au long du développement, il y aura le même temps consacré aux tests et au développement. On passe beaucoup moins de temps à déboguer. On a toujours quelque chose à montrer au client (dont des tests). Impossible de livrer du code non testé. Tests de non-régression directement inclus. L architecture est testable et de bonne qualité Quand on écrit le test, on ne se réfère qu à la spécification et pas à l'implémentation (test boîte noire) Moins de biais Moins de dépendance au code

Les tests comme documentation 56 Si les tests sont clairs, ils peuvent servir de documentation Dans la plupart des cas, il est plus facile de savoir ce que fait un code en regardant les tests qui l'implémentent Documentation forcément synchronisée avec le code Si les fonctionnalités évoluent, le code évolue et on est obligé de faire évoluer les tests! Alors que, qui pense à faire évoluer la Javadoc quand le code évolue Toutefois, il faut s occuper de ses tests comme de son code applicatif : Respect du code propre même pour les tests.