Download - J. Paul Gibson [email protected] gibson
![Page 1: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/1.jpg)
J. Paul Gibson
http://www-public.it-sudparis.eu/~gibson/
Bureau A 207, Le département LOgiciels-Réseaux
http://www-public.it-sudparis.eu/~gibson/Teaching/IO21-OOTests2008Fr.ppthttp://www-public.it-sudparis.eu/~gibson/Teaching/IO21-OOTests2008Fr.pdf
![Page 2: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/2.jpg)
•Rappels– Définitions – Pourquoi tester ? – Quand tester ?– Niveaux de test– Types de test– Les limites du test– Les techniques du test
• Procédural vs Objet •Le test en Orienté Objet
– Niveaux de tests– Tests de validation / use cases– Tests d’intégration –Tests unitaires
![Page 3: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/3.jpg)
Définition
IEEE-STD 610.12-1990• "Le test est l'exécution d'un système ou d'un
composant par des moyens automatiques ou manuels, pour vérifier qu'il répond à ses spécifications ou identifier les différences entre les résultats attendus et les résultats observés"
Questions: peut-on tester sans –spécifications / résultats attendusl'exécution d'un système ou d'un composant
![Page 4: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/4.jpg)
Cas de test (jeu)
• Un cas de test spécifie– L’état de l’implantation sous test (IUT) et de
son environnement avant le test– Le vecteur des entrées et/ou les conditions– Le résultat attendu
• messages, exceptions• valeurs retournées• état résultant de l’IUT et de son environnement
Implementation Under Test (IUT) System Under Test (SUT)
![Page 5: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/5.jpg)
Pourquoi tester?
• Fonctionnalités manquantes
• Fonctionnalités incorrectes
• Effets de bord, interactions indésirables
• Mauvaises performances, pbs temps réel, deadlock…
• Sorties incorrectes
![Page 6: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/6.jpg)
Quand « tester » ?
100
50
20
10
5
1
Spécification Conception Codage Tests Validation Maintenance
Resources pour corriger les fautes Ni trop tot ni trop tard
![Page 7: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/7.jpg)
Quand « tester » ?100
50
20
10
5
1
Spécification Conception Codage Tests Validation Maintenance
Ressources pour corriger les fautes
Ni trop tot ni trop tard
Texte et/ouModeles (UML?)? UML? Java?
??User System
SpecConceptCodageTestsSystem
verification
Validation
Exigences
![Page 8: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/8.jpg)
Niveaux de test
• Tests de validation
• Tests d’intégration
• Tests unitaires
Préparation
exécution
![Page 9: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/9.jpg)
Niveaux de test- chaque (sub)system• Tests de validation
• Tests d’intégration
• Tests unitaire
Préparation
exécution
SystemSubsystem
![Page 10: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/10.jpg)
Types de tests
• Tests fonctionnels
• Tests structurels
• Tests de (non) régression
• Tests de robustesse
• Tests de performance
![Page 11: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/11.jpg)
Les limites du test
• L’espace des entrées
• Les séquences d’exécution
• Sensibilité aux fautes
![Page 12: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/12.jpg)
Explosion combinatoireEX : dessiner 1 triangle
• Hypothèse : Coordonnées [1..10]– 104 possibilités de dessiner 1 ligne– 1012 possibilités de dessiner 3 lignes
• Hypothèse : écran 1024x768– 2,37 1035 possibilités
Quest: % valid?
![Page 13: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/13.jpg)
Les séquences d’exécution
for (int i=0; i<n; ++i) {if (a.get(i) ==b.get(i))
x[i] = x[i] + 100;
else
x[i] = x[i] /2;
}
![Page 14: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/14.jpg)
Les séquences d’exécution (n=1)
for (int i=0; i<n; ++i) {if (a.get(i) ==b.get(i))
x[i] = x[i] + 100;
else
x[i] = x[i] /2;
}
i<n
/2+100
++i
if
3 Chemins a tester
![Page 15: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/15.jpg)
Les séquences d’exécution
Nbre d’itérations Nbre de chemins1 32 53 910 102520 1 048 57760 > 1,15 1018
![Page 16: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/16.jpg)
Sensibilité aux fautes
short scale(short j) {
j = j -1; // devrait être j = j+1
j = j/30000;
return j;
}
![Page 17: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/17.jpg)
Sensibilité aux fautes
• 65536 valeurs possibles• 6 rendent une valeur incorrecte :
-32768-30000-29999299993000032767
• 99,9908 % de risque de ne pas trouver l’erreur si test aléatoire.
![Page 18: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/18.jpg)
Autres limitations
• Tester un programme permet de montrer la présence de fautes mais en aucun cas leur absence
• Les tests basés sur une implémentation ne peut révéler des omissions car le code manquant ne peut pas être testé
• On ne peut jamais être sûr qu’un système de test est correct
![Page 19: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/19.jpg)
Techniques de test
• Classes d’équivalence (éviter l’explosion combinatoire)
• Graphe de cause à effet (identifier et analyser les relations devant être modélisées dans une table de décision)
• Tables de décision (concevoir des cas de test)
![Page 20: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/20.jpg)
Classes d’équivalence
• 8 Classes valides– triangle scalèle– triangle isocèle – équilatéral
• 25 Classes invalides– 1 valeur = 0– 3 valeurs = 0– 1 valeur négative– triangle isocèle plat
– 3 valeurs telles que la somme de 2 d’entre elles < à la 3ème
– 1 valeur non numérique – 1 valeur manquante – triangle scalène plat– 1 valeur max
![Page 21: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/21.jpg)
![Page 22: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/22.jpg)
Table de décision
![Page 23: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/23.jpg)
![Page 24: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/24.jpg)
Simplification:
Preconditiona<=b<=c
Not a triangle:c>=b+a
![Page 25: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/25.jpg)
Graphe de cause à effet
• Principe : représenter la spécification sous forme d’un graphe– On définit les états d’entrées et les états de sorties– On construit le graphe à l’aide de “connecteurs” logiques (et,
ou, négation)
• Exemple : soit la spécification suivante:– Tout identificateur de voiture doit commencer par les lettres A,
B ou C et avoir comme 2ème caractère la lettre X. Les messages M1 et M2 sont émis respectivement en cas d’erreur sur le premier ou le second caractère. Si l’identificateur est correct, il est inséré dans la base de données.
![Page 26: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/26.jpg)
Graphe de cause à effet
VV
E1
E2
E3
E4
S2
S3
S1
![Page 27: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/27.jpg)
Graphe de cause à effet
VV
E1
E2
E3
E4
S2
S3
S1
inséré dans la base de données
A
B
C
X
message M1
message M2
![Page 28: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/28.jpg)
Table de décision
E1 1 0 0 0 X
E2 0 1 0 0 X
E3 0 0 1 0 X
E4 1 1 1 X 0
S1 0 0 0 0 1
S2 0 0 0 1 0
S3 1 1 1 0 0
![Page 29: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/29.jpg)
Table de décision: incoherence
E1 1 0 0 0 X
E2 0 1 0 0 X
E3 0 0 1 0 X
E4 1 0 1 X 0
S1 0 0 0 0 1
S2 0 0 0 1 0
S3 1 1 1 0 0
![Page 30: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/30.jpg)
Table de décision: redundancy
E1 1 0 0 0 X
E2 0 1 0 0 X
E3 0 0 1 0 X
E4 1 0 1 X 0
S1 0 1 0 0 1
S2 0 0 0 1 0
S3 1 0 1 0 0
![Page 31: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/31.jpg)
Table de décision: incomplete
E1 1 0 0 0 X
E2 0 1 0 0 X
E3 0 0 1 0 X
E4 1 0 1 X 0
S1 0 1 0 0 1
S2 0 0 0 1 0
S3 1 0 1 0 0
0
1
0
1
?
?
?
![Page 32: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/32.jpg)
Diagramme d’activité
ECRIRE BD
MESSAGE M2
X
X
[1er CARACTERE == A]
ECRIRE BD
MESSAGE M2
X
X
[1er CARACTERE == B]
ECRIRE BD
MESSAGE M2
X
X
[1er CARACTERE == C]
MESSAGE M1[1er CARACTERE ! = ….]
![Page 33: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/33.jpg)
Diagramme d’activité
ECRIRE BD
MESSAGE M2
X
X
[1er CARACTERE == A]
ECRIRE BD
MESSAGE M2
X
X
[1er CARACTERE == B]
ECRIRE BD
MESSAGE M2
X
X
[1er CARACTERE == C]
MESSAGE M1[1er CARACTERE ! = ….]
MessageM2
X
X
2emeInterpretation?
![Page 34: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/34.jpg)
Orienté Objet – (UML)
• Niveau Application (spécification)– Diagramme des cas d’utilisation (Use cases)
• Niveau Sous-Système (conception)– Diagramme des classes (ébauche)– Diagrammes de séquence– Diagrammes de transitions d’états
• Niveau Classes (conception détaillée)– Classes détaillées
![Page 35: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/35.jpg)
Comparaison – effort de test (1)
• Lire 3 valeurs entières.
• Ces trois valeurs sont interprétées comme représentant les longueurs des côtés d’un triangle.
• Le programme imprime un message qui établit que le triangle est isocèle, équilatéral ou scalène.
![Page 36: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/36.jpg)
Comparaison – effort de test (2)
• Programmation procédurale– 33 cas de tests
• Programmation objet– 58 cas de tests (26 sont les mêmes que ci-
dessus, 32 sont dûs à la programmation objet)
![Page 37: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/37.jpg)
FIGURE
OUVERTE FERMEE
SEGMENT MULTI-SEG ELLIPSE
CERCLE
POLYGONE
TRIANGLE QUADRILATERE …..…..
![Page 38: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/38.jpg)
TRIANGLE
SEGMENT
POINT
![Page 39: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/39.jpg)
Le test en orienté objet
OO vs Non OO
– System tests - use cases– Integration tests - class, sequence, interaction– Unit tests - class/methods
– Regression tests - inheritance?– Automated testing - re-use?
– UML - comment utiliser pour tester?
![Page 40: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/40.jpg)
![Page 41: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/41.jpg)
Tests de validation
• Trouver les emprunts en retard– Tester le délai autorisé (fonction du type de
client et du type de document) - 9 cas de test– Tester qu’un client peut avoir plusieurs
documents en retard– Tester que la fiche d’emprunt est supprimée
lorsque le document est rendu
![Page 42: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/42.jpg)
Le test en orienté objet
• Au niveau sous-système– test des associations, des agrégations
(diagramme de classes)• multiplicité• création, destruction
– test de séquences (diagramme de séquence)• construction d’un graphe de flot
– test des exceptions controlées
![Page 43: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/43.jpg)
Diagramme de classes
![Page 44: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/44.jpg)
Niveau Sous-Système
Triangle
Segment
Mediatheque
Document
LettreRappel FicheEmprunt0..1
![Page 45: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/45.jpg)
Classe FicheEmprunt
• Multiplicité– tester qu’une fiche d’emprunt ne concerne
qu’un et un seul client et qu’un et un seul document
– tester qu’une fiche d’emprunt ne peut référencer qu’au plus une lettre de rappel.
– tester que plusieurs fiches d’emprunts peuvent concerner un même client
![Page 46: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/46.jpg)
• Création
• Test de validation (raffinement)– tester que dateLimite -DateEmprunt = délai
autorisé
• (Test unitaire)– tester que si dateLimite dépassée
alors depasse = true.
Classe FicheEmprunt
![Page 47: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/47.jpg)
Le test en orienté objet
• Tests d’intégration (diagramme de classes => arbre des dépendances)
• Techniques– big-bang– bottom-up– top-down
![Page 48: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/48.jpg)
FicheEmprunt
![Page 49: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/49.jpg)
• Test de validation (traçage)– Tester que la fiche d’emprunt est supprimée
lorsque le document est rendu
• Création– Tester que depasse = false
• Tests de transition d’états– Tester que dateJour>dateLimite alors
depasse = true (raffinement du test unitaire correspondant)
FicheEmprunt
![Page 50: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/50.jpg)
• Tester les actions liées aux états et aux transitions d ’états.
FicheEmprunt
![Page 51: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/51.jpg)
FicheEmprunt
![Page 52: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/52.jpg)
• Tester la chronologie des actions– dn = document.dureeEmprunt()– dateLimite = client.dateRetour(dateEmprunt,
dn)– document.emprunter ()– Client.emprunter ()– tn =document.tarifEmprunt()– Tarif = client.sommeDue(tn)
FicheEmprunt
![Page 53: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/53.jpg)
Le test en orienté objet
• Au niveau de la classe– test des méthodes
• “concevoir pour tester”• graphe de contrôle
– test des séquences d’activation des méthodes• diagramme de transition d’états
– test des méthodes héritées• diagramme de classes
![Page 54: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/54.jpg)
Concevoir pour Tester
lire I,J;
débutCas
cas I = 5 et J < 4
alors M = 23;
cas I = 5 et J >= 4
alors M = J + 16;
cas (J + 1) < I et I<0
alors M = 4I +J;
cas (J + 1) < I et I >= 0 et I /= 5
alors M = 5I + 2
cas (J + 1) >= I et J < 2
alors M = 2I + 3J - 4;
cas (J + 1) >= I et J>= 2 et I /= 5
alors M = 3I +2J –2;
finCas
écrire M;
lire I,J;
si I <= J + 1
alors K = I + J -1
sinon K = 2I + 1
finsi
si K >= I+1
alors L = I + 1
sinon L = J - 1
finsi
si I = 5
alors M = 2L + K
sinon M = L + 2K - 1
finsi
écrire M;
![Page 55: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/55.jpg)
Le test en orienté objet
• L’interaction de méthodes (individuellement correctes) de classes et sous-classes peut générer des erreurs.
=> Ces interactions doivent être systématiquement exercées.
![Page 56: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/56.jpg)
Le test en orienté objet
• Omettre de tester les interactions d’une méthode redéfinie dans la hierarchie de classe est facile.
=> Les suites de tests conçues pour les superclasses doivent être réexécutées sur les sous-classes et conçues de façon à pouvoir être réutilisés pour tester n’importe quelle sous-classe
![Page 57: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/57.jpg)
Le test en orienté objet
• La difficulté et la complexité d’implémentation des contraintes de multiplicité peut facilement conduire à des erreurs quand un élément est ajouté, mis à jour, supprimé.
=> L’implémentation de la multiplicité doit être systématiquement exercée.
![Page 58: J. Paul Gibson paul.gibson@it-sudparis.eu gibson](https://reader035.vdocuments.net/reader035/viewer/2022062518/568146cf550346895db40736/html5/thumbnails/58.jpg)
Le test en orienté objet
• Des classes avec des contraintes séquencielles sur l’activation des méthodes et leurs clients peuvent avoir des erreurs de séquencement.
=> Le comportement requis doit être testé en utilisant un modèle de machine à états.