Download - Formation tests decembre2010
![Page 1: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/1.jpg)
1
Formation tests
Florence CHABANOISMardi 14 décembre 2010
![Page 2: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/2.jpg)
2
Consultante Soat
Ce que j’aimeLe partageLe fun
Ce que je n’aime pasLa répétition
Qualité Développement
![Page 3: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/3.jpg)
3
Vous ?
Ce qui vous sort par les yeux, en général ou au quotidien
Ce que vous trouviez « bien » dans votre projet et sur vos pratiques
Votre projetL’objectif ?Ce qui l’empêche d’y arriver
![Page 4: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/4.jpg)
4
Planning
Mardi Matin : présentation générale sur les testsAprès-midi : étude de l’existant et choix des outils
Mercredi-JeudiMélée dans les équipes pour poser des tests
VendrediMatin : atelier de mise au point (rattrapage, traitement d’un problème récurrent ou perfectionnement)Après-midi : synthèse avec les managers
![Page 5: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/5.jpg)
5
Formation tests
Jusque 11h
![Page 6: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/6.jpg)
6
Tester ?
Vérifier le bon fonctionnement
Révéler les défauts
![Page 7: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/7.jpg)
7
Nous faisons
tous
des tests
![Page 8: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/8.jpg)
8
![Page 9: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/9.jpg)
9
![Page 10: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/10.jpg)
10
En informatique
Un client nous remonte qu’il vient de s’inscrire sur notre site d’e-commerce et qu’il a eu un message d’erreur
![Page 11: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/11.jpg)
11
![Page 12: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/12.jpg)
12
![Page 13: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/13.jpg)
13
![Page 14: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/14.jpg)
14
![Page 15: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/15.jpg)
15
![Page 16: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/16.jpg)
16
Tests manuels en IT
Hypothèse invalidéeIl faut supprimer le compte et tester une autre hypothèse
![Page 17: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/17.jpg)
17
Coûts des tests manuels
Longs Nouveaux + existants
Propices aux erreursConcentration, oublis
Laissent moins de place aux autres tests (exploratoires, de charge, expérience utilisateur, etc.)X10 x10 x10
Industrialiser les tests
![Page 18: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/18.jpg)
18
Typologie des tests
Test fonctionnel
Test unitaire
Test de charge
Test d’exploitabilité
Test d’intégration
Test d’accessibilité
Test de conformité W3C
Test fonctionnel
Test unitaire
…
« bon fonctionnement »
![Page 19: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/19.jpg)
19
Tests fonctionnels
Boite noire Données en entrée et observations attendues
nom
prenom
emailInscription
…
newsletter
« Vous êtes bien inscrit »
![Page 20: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/20.jpg)
20
Selenium
http://seleniumhq.org
Mode opératoire0. Lancer le plugin firefox1. Enregistrement du scénario2. Spécifications des attentes3. Arrêt de l’enregistrement3. Ajustement pour faire passer le test
Présentation
Code
Selenium
Données
![Page 21: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/21.jpg)
21
Exemple Selenium
Spécification : un mot recherché ne doit pas tenir compte de la casse
« electricite »
Recherche
« Electricité »
![Page 22: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/22.jpg)
22
Selenium
![Page 23: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/23.jpg)
23
Selenium
Les avantagesFacilité de création des cas de testsAssure la non régressionTeste la fonctionnalité comme le ferait un utilisateurTestable en continu
![Page 24: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/24.jpg)
24
Selenium
Les inconvénientsLenteursTests non déterministesPotentiellement très nombreuxPeu évolutifs et difficiles à maintenirCrées après l’implémentationDépendants du navigateurPeu compréhensibles avant d’être exécutés
![Page 25: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/25.jpg)
25
Fitnesse
http://fitnesse.org
Mode opératoire0. Lancer le serveur fitnesse1. Déclarer vos spécifications dans le wiki2. Câbler votre code dessus (par le biais de
fixture)
Présentation
Code
Fitnesse
Données
Fixtures
![Page 26: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/26.jpg)
26
Fitnesse
![Page 27: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/27.jpg)
27
Fitnesse
![Page 28: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/28.jpg)
28
Fitnesse
Les avantagesLimite les malentendus par les exemplesConstitue une spécification exécutable (TDR)FactorisableTestable en continuCentralisé
Les inconvénientsTicket d’entréeNe teste pas l’application tout à fait comme un utilisateur
![Page 29: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/29.jpg)
29
Autres outils de tests fonctionnels
Greenpepper avec XWiki ou Confluencehttp://www.greenpeppersoftware.com
Concordionhttp://www.concordion.org/
![Page 30: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/30.jpg)
31
![Page 31: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/31.jpg)
32
![Page 32: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/32.jpg)
33
D’où vient le problème ?
Frein ?
Direction assistée?
Boite de vitesse ?
Pneus usés ?
![Page 33: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/33.jpg)
34
Tests unitaires
Permet de vérifier isolément que les composants fonctionnent bien
Tester une partie du produit Simuler un comportement différent de la production
![Page 34: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/34.jpg)
35
Tests unitaires
Pour pouvoir tester unitairement :Les composants doivent être séparables pour être utilisés de façon isoléeLes éléments testés doivent être simples
![Page 35: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/35.jpg)
36
Test Driven Development
Développement dirigé par les tests
• Given… When… Then• Implémentation• Refactoring
![Page 36: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/36.jpg)
37
![Page 37: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/37.jpg)
38
Premier test
![Page 38: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/38.jpg)
39
Quand… Avec … Alors …
@Test public void add_DeuxEtTrois_retourneCinq() { int resultat = new Computer().ajoute(2, 3); assertThat(resultat,is(equalTo(5))); }
![Page 39: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/39.jpg)
40
Barre rouge
![Page 40: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/40.jpg)
41
Implémentation et barre verte
![Page 41: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/41.jpg)
42
Deuxième test
![Page 42: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/42.jpg)
43
Généralisation
![Page 43: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/43.jpg)
44
Tester une méthode qui traverse des couches
![Page 44: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/44.jpg)
45
Utiliser les mocks pour tester en isolation
public class Utilisateur { private String login = « login »;
public boolean login(String motDePasse) {UserDao userDao = new UserDao();
String motDePasseDeLaBase = userDao.getPassword(login);
return (motDePasse==motDePasseDeLaBase); }
![Page 45: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/45.jpg)
46
@Test public void login_utilisateurExisteEtPasswordOk_retourneTrue()
{ insereUtilisateurDansLaBase("login","mot de passe correct"); boolean estLoggue = new Utilisateur().login("mot de passe
correct"); assertThat(estLoggue, is(true)); supprimerUtilisateurDeLaBase("login"); }
![Page 46: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/46.jpg)
47
Tester les cas limites
@Test public void login_utilisateurExisteEtPasswordOk_retourneTrue() { insereUtilisateurDansLaBase("login","mot de passe correct"); boolean estLoggue = new Utilisateur().login("mot de passe correct"); assertThat(estLoggue, is(true)); supprimerUtilisateurDeLaBase("login"); } @Test public void login_utilisateurExisteEtPasswordIncorrect_retourneFalse() { insereUtilisateurDansLaBase("login","mot de passe correct"); boolean estLoggue = new Utilisateur().login(« pas le bon mot de passe"); assertThat(estLoggue, is(false)); supprimerUtilisateurDeLaBase("login"); }
![Page 47: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/47.jpg)
48
Factoriser
@Before public void setUp() { insereUtilisateurDansLaBase("login","mot de passe correct"); } @After public void tearDown() { supprimerUtilisateurDeLaBase("login"); } @Test public void login_utilisateurExisteEtPasswordOk_retourneTrue() { boolean estLoggue = new Utilisateur().login("mot de passe correct"); assertThat(estLoggue, is(true)); }
![Page 48: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/48.jpg)
49
InconvénientsInterdépendance avec la base
Tests non parallélisablesEtat instable (si données non supprimées)Potentiellement non déterministe
Couplage fortNombreux tests à modifier
SolutionRefactorer pour permettre un branchement
![Page 49: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/49.jpg)
50
Création d’une veine pour le DAO
public class Utilisateur { String login = « login »; UserDao userDao = new UserDao();
Utilisateur(UserDao userDao) { this.userDao = userDao; }
public boolean login(String motDePasse) { String motDePasseDeLaBase =
userDao.getPassword(login); return (motDePasse.equals(motDePasseDeLaBase)); }
![Page 50: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/50.jpg)
51
Utilisation de mock pour simuler d’autres comportements
@Test public void login_utilisateurExisteEtPasswordOk_retourneTrue() { UserDao dao = Mockito.mock(UserDao.class); when(dao.getPassword("login")).thenReturn("mot de passe correct"); boolean estLoggue = new Utilisateur(dao).login("mot de passe
correct"); assertThat(estLoggue, is(true)); }
![Page 51: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/51.jpg)
52
Autre cas limite
@Test public void login_utilisateurExisteEtException_retourneFalse() { UserDao dao = Mockito.mock(UserDao.class); when(dao.getPassword("login")).thenThrow(new RuntimeException());
boolean estLoggue = new Utilisateur(dao).login("mot de passe correct");
verify(dao).getPassword("login"); assertThat(estLoggue, is(false)); }
![Page 52: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/52.jpg)
53
Vérification du comportement
@Test public void login_utilisateurExisteEtPasswordOk_retourneTrue() { UserDao dao = mock(UserDao.class); when(dao.getPassword("login")).thenReturn("mot de passe correct"); boolean estLoggue = new Utilisateur(dao).login("mot de passe
correct"); verify(dao).getPassword("login"); assertThat(estLoggue, is(true)); }
![Page 53: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/53.jpg)
54
Autres frameworks de tests
ClassiquesJMock, Easymock
Pour le code legacyPowermock, JMockit
![Page 54: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/54.jpg)
55
Tests unitaires
AvantagesPermet de sécuriser son application … incrémentalementAugmente la confianceAide à construire le logiciel
InconvénientsApprentissageRalentit le développement dans un premier temps
![Page 55: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/55.jpg)
56
Ressources complémentaires
TestsTest Driven Development, K.BeckxUnit Test Patterns, G.MeszarosGrowing Object Oriented Software, S.Freeman, N.PryceWorking Effectively With Legacy Code, M.Feathers
DesignCoder Proprement, R.MartinRefactoring, M.Fowler
![Page 56: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/56.jpg)
57
A retenir
Test non automatisé = (pas de test)Un bug corrigé une fois est corrigé pour toujoursFaites toujours passer un test au rouge avant de le passer au vertSoignez le comme du code de productionSoignez votre code de production (boy scout rule, DRY, KISS)
![Page 57: Formation tests decembre2010](https://reader035.vdocuments.pub/reader035/viewer/2022062905/547c9099b4af9fd7658b4616/html5/thumbnails/57.jpg)
58
Questions ?
Votre expérience ?Vos besoins ? Votre ressenti ?