Test Logiciel, Validation et Vérification

Transcription

Test Logiciel, Validation et Vérification
Introduction
historique et problèmatique du test
INSA -- Test de Logiciels
ent
ion
ue
tes
t=
des
t=
tes
es
t=
Épo
q
oqu
e
Ép
1960
1980
2009
pré
v
tru
c
up
mi
se
a
1945
1
Ép
oq
u
Arnaud Gotlieb
IRISA / CELTIQUE
www.irisa.fr/lande/gotlieb
[email protected]
et
pré
his
toi
re
INSA - Rennes
2009-2010
2009
tion
oi n
t
Test Logiciel,
Validation et Vérification
1990
INSA -- Test de Logiciels
2
1960-80 : Test = mise au point
9/9/1945
Qu’avons-nous compris depuis ?
Chaîne causale :
erreur
faute
défaillance
En fait, 3 activités distinctes :
* détection de défaillances (rôle du test)
* localisation de fautes
(rôle de la mise au point)
* correction des erreurs
(rôle de la mise au point)
2009
INSA -- Test de Logiciels
3
2009
1980-90 : Test = destruction
[G. Myers The Art of Software Testing 1979]
« Se convaincre, par des techniques d’analyse ou
d’exécution, qu’un programme répond à ses
spécifications »
- Analyse
Conséquence immédiate :
le testeur ne doit pas être le programmeur
Position dogmatique progressivement abandonnée !
INSA -- Test de Logiciels
4
1990-.. : Test = prévention
« Testing is the process of executing a program
with the intent of finding errors »
2009
INSA -- Test de Logiciels
5
- Exécution
2009
Contrôle : vérifier des propriétés
avant exécution
Test : évaluer un résultat
après exécution
INSA -- Test de Logiciels
6
2009
INSA -- Test de Logiciels
7
2009
INSA -- Test de Logiciels
8
Test de programme : notre définition
Terminology
(IEEE Standard Glossary of SE, BCS’s standard for Softw. Testing)
Validation: « The process of evaluating software at the end
of software development to ensure compliance with intented
usage »
- Tester = exécuter un programme P pour mettre
en évidence la présence de fautes, par rapport à
sa spécification F
Verification: « The process of determining whether the
products of a given phase of the software development
process fulfill the requirements established during the
previous phase »
- Recherche de contre-exemples :
∃X tq
Testing: « Evaluating software by observing its execution »
2009
INSA -- Test de Logiciels
9
Prouver la correction d’un programme par le test
2009
P(X) ≠ F(X) ?
INSA -- Test de Logiciels
10
Correction de programme : limite fondamentale
Impossible de démontrer la correction d’un
programme dans le cas général
indécidabilité du
problème de l’arrêt d’une machine de Turing
Pour cela, il est nécessaire de générer
un jeu de test T tel que :
1. ∀X ∈ T, il existe une procédure
permettant de déterminer si P(X) termine
«Program Testing can be used to prove the presence
of bugs, but never their absence » [Dijkstra 74]
2. si ∀X ∈ T,P(X)=F(X) alors ∀X, P(X)=F(X)
PS : développeur expérimenté
2009
INSA -- Test de Logiciels
11
1 faute / 10 lignes de code
163 fautes / 1000 instructions
[B. Beizer Software Testing Techniques 1990]
2009
INSA -- Test de Logiciels
12
Processus de test
Problème de l’oracle :
Comment vérifier les sorties calculées ?
Programme P
Exécuter
Donnée de test X
Oracle okF
Sortie P(X)
En pratique :
- prédictions approximatives (à cause des calculs flottants,…)
- formules inconnues (car programme = formule)
- oracle contenant des fautes
Vérifier
Verdict (pass,fail)
2009
INSA -- Test de Logiciels
En théorie :
- par prédiction du résultat attendu
- à l’aide d’une formule issue de la spécification
- à l’aide d’un autre programme
13
2009
A base d’un modèle du programme issu des
spécifications :
A. Test fonctionnel : basé sur les spécifications
Sorties
- Informelles (test partitionnel, test aux limites, ...)
B. Test structurel : basé sur l’analyse du programme
Données de test
14
A. Test fonctionnel
Problème de la sélection des DT
Données de test
INSA -- Test de Logiciels
Sorties
- Semi-formelles (cas d’utilisation, diagrammes de
séquence, UML/OCL, graphes causes/effets…)
- Formelles (spéc. algébriques, machines B,
systèmes de transitions IOLTS, …)
2009
INSA -- Test de Logiciels
15
2009
A base d’un modèle du code source du programme
- modèle = représentation interne de la structure
- Utilisation importante de la Théorie des Graphes,
notamment des techniques de couverture
Spécifications :
renvoie le produit de
i par j
(i = 0, j = 0) --> 0
(i = 10, j = 100) -->1000
…
--> OK
INSA -- Test de Logiciels
16
Le test structurel est indispensable (1)
B. Test structurel
2009
INSA -- Test de Logiciels
17
2009
prod(int i,int j )
{
int k ;
if( i==2 )
k := i << 1 ;
else
(faire i fois l ’addition de j)
return k ;
}
INSA -- Test de Logiciels
18
Le test structurel est indispensable ! (2)
Spécifications :
renvoie le produit de
i par j
(i = 0, j = 0) --> 0
(i = 10, j = 100) -->1000
…
Faute non détectée par
du test fonctionnel
patch -> k := j << 1
2009
prod(int i,int j )
{
int k ;
if( i==2 )
k := i << 1 ;
else
(faire i fois l ’addition de j)
return k ;
}
Software testing in the software
developpement process
Usage &
acceptance testing
Requirements
Architecture & system
System testing
(performence, load, robustness, security testing)
Functional specifications
Unit & Integration testing
Coding design
INSA -- Test de Logiciels
19
Test natif / test croisé
2009
INSA -- Test de Logiciels
20
Exemple de montage en test croisé : plateforme Java Card
Test natif :
machine de test = machine de développement
Java Card
Card reader
USB port
.cmd
Card
Commands
processor
APDUs
Open
Plateform
loader
Test croisé :
machine de test ≠ machine de développement
.java
javac
.class
converter
.cap
verifier
Personal Computer
2009
INSA -- Test de Logiciels
21
2009
INSA -- Test de Logiciels
22
Bibliographie : quelques livres
Tests de non-regréssion
Jeu de Test 3
Jeu de Test 2
Jeu de Test 1
…
3ème version
2nde
version
Tests de
non-régression
1ère version
2009
INSA -- Test de Logiciels
23
2009
INSA -- Test de Logiciels
24
Bibliographie : quelques revues
Et quelques sites intéressants...
Software Testing Online Resources www.mtsu.edu/~storm/
Software Testing Stuff
www.testdriven.com
Model-based Software Testing
www.geocities.com/model_based_testing/
Opensource ST www.opensourcetesting.org/unit_java.php
Tao Xie’s homepage
www.cs.washington.edu/homes/taoxie
2009
INSA -- Test de Logiciels
25
2009
INSA -- Test de Logiciels
26
Plan complet du cours
0. Préliminaires
TP1 : Test à partir de modèle avec LTG
1. Test logiciel : principes
TP2 : Test des systèmes d’information
avec GEDIS
2. Génération automatique de test
3. Techniques de test fonctionnel
TP3 : Test des applications embarqués dans
le cadre automobile : formation AUTOSARLAB
avec IBM Test RealTime
4. Test de logiciel orienté-objet
5. Test à partir de modèles
2009
INSA -- Test de Logiciels
27
2009
INSA -- Test de Logiciels
28
Plan complet du cours
0. Préliminaires
Gödel !
1. Test logiciel : principes
2. Génération automatique de test
1931
Un système formel : un ensemble d’axiomes et de règles de déduction
qui permettent de produire des théorèmes (par preuve)
3. Techniques de test fonctionnel
4. Test de logiciel orienté-objet
Si on prend l’ensemble des entiers muni des opérations classiques, il
existe toujours des énoncés qu’il est impossible de démontrer.
5. Test à partir de modèles
2009
INSA -- Test de Logiciels
Pire ! Si on rajoute ces énoncés à l’ensemble des axiomes initiaux,
on obtient un système comportant de nouveaux énoncés… non démontrables
29
2009
INSA -- Test de Logiciels
30
Idée de la preuve
Puis Turing …
Une machine de Turing se compose d'une partie de contrôle et d'une bande
infinie sur laquelle se trouvent écrits des symboles. Les symboles de la
bande sont lus et écrits par l'intermédiaire d'une tête de lecture.
Epiménide Le Crétois: « Tous les Crétois sont des menteurs ! »
Gödel a construit un énoncé analogue à l’intérieur d’un système formel
- Il numérote tous les signes utilisés dans un théorème concernant les
entiers (comme un code ASCII des maths !)
- A tout théorème, il fait correspondre un entier (son code)
-Il construit le théorème T:
« il n’existe pas de théorème ayant un code qui est la codification de T »
Idée simple, mais preuve rigoureuse difficile.
2009
INSA -- Test de Logiciels
31
Puis Church...
Les machines de Turing sont une abstraction des ordinateurs. La partie de
contrôle représente le microprocesseur. Un élément essentiel est que le
nombre d'états est fini car les microprocesseurs possèdent un nombre
déterminé et fini de registres d'une taille fixe.
2009
32
Pire : un programme T qui determine si un
programme B termine ou pas
Il existe des programmes exécutables par des
Machines de Turing qu’on ne peut pas écrire !
(* prog B1 *)
while( true ) {};
(*prog B2*)
a = 0;
while( a ≠ 1 )
{
a = a + 2 ;
}
Exemple : un programme qui imprime son texte source
a = 1;
b = 2;
INSA -- Test de Logiciels
printf(‘’a = 1; ’’);
printf(‘’b = 2;’’);
printf(‘’printf (‘‘a = 1;’’); ’’);
printf (‘’printf (‘’b = 2;’’);’’);
(*prog B3*)
scanf(‘’%d’’, &a) ;
while (a < 10)
{
b = a + 2 ;
}
T doit determiner que B1 et B2 ont une boucle infinie
que B3 boucle infiniment si a prend une valeur a < 10.
2009
INSA -- Test de Logiciels
33
Et si on implante T comme ceci :
2009
INSA -- Test de Logiciels
34
Quel rapport avec le test des programmes ?
Si T repère une boucle infinie, il imprime un message d ’erreur
et s ’arrête ; sinon, T boucle
P = Problème de l’arret d’une machine de Turing.
Que fait le programme T avec T en entrée ?
« Etant donné a une entrée et MT une machine de Turing,
déterminer si MT s’arrête si on lui fournit a en entrée est un
problème indécidable dans le cas général ! »
Soit T boucle indéfiniment, soit T s’arrête.
Beaucoup de problèmes de test se ramènent à P !
1. Si T boucle indéfiniment, T doit s’arrêter et le signaler.
C ’est impossible, puisqu ’on a supposé que T boucle indéfiniment !
2. Si T s’arrête, alors il est mis en bouclage infini…
donc T ne termine pas
Contradiction
2009
INSA -- Test de Logiciels
35
- déterminer si un programme est correct par rapport à sa
spécification
- déterminer si une instruction est atteignable (exécutable)
- déterminer si un chemin donné est faisable dans le programme
- déterminer si un critère de test est applicable
Etc.
2009
INSA -- Test de Logiciels
36
Oracle
Plan complet du cours
0. Préliminaires
X3
2. Génération automatique de test
3. Techniques de test fonctionnel
donnée de test : X ∈ Dom(P)
X4
jeu de test
INSA -- Test de Logiciels
37
2009
Définition formelle de l’oracle
=1..N
INSA -- Test de Logiciels
38
Jeu de Test idéal
Dom(P)
Dom(P)
Ran(P)
X ∈ Dom(P)
T = {Xi}i =1..N
X2
X1
X3
Oracle :
okF : Dom(P) x Ran(P)
Bool
okF(X,P(X)) ssi X tq P(X)=F(X)
{i.e. X est réussi}
(seul lien avec F, procédure automatique ou manuelle, souvent partiel)
2009
: T = {Xi}i
Plusieurs techniques :
- Test dos à dos : prototypes, N-versions, non-regression
- Propriétés du programme : assertions, fonctions inverses, ...
- Prédictions manuelles !
5. Test à partir de modèles
Programme P :
Donnée de test :
Jeu de test
:
X5
“A mechanism to produce the predicted outcomes to compare with the
actual outcomes of the software under test.” (Glossary BCS SIGIST)
4. Test de logiciel orienté-objet
2009
Dom(P)
X2
X1
1. Test logiciel : principes
INSA -- Test de Logiciels
39
okF(X1,P(X1))
okF(X2,P(X2))
...
X5
X4
T est idéal ssi
{i.e. T est non réussi}
∃X ∈ T, ¬okF(X,P(X))
{i.e. T est réussi}
ou si ∀X ∈ T, okF(X,P(X))
alors ∀X ∈ Dom(P), okF(X,P(X))
2009
INSA -- Test de Logiciels
40
Critère de sélection C
Couverture du critère de sélection C
- Procédé de sélection de données de test
- Induit parfois une « partition » sur le domaine d’entrée
Repose sur une hypothèse d’uniformité :
une seule donnée de test suffit pour tout le sous-domaine
(ex : chemins de P)
j
P(int i,int j)
{
if( C1 )
else ...
if( C2)
else ...
}
2009
Dom(P)
Dom(P)
X4
X1
C1∧¬C2
C1∧C2
X2
X3
¬C1∧¬C2
¬C1∧ C2
i
INSA -- Test de Logiciels
41
Prédicat COMPLETEP(T,C) vrai ssi T est sélectionné par C
2009
INSA -- Test de Logiciels
42
Jeu de Test idéal
Critère fiable pour P
Défauts
Dom(P)
X2
X1
X3
X5
X4
okF(X1,P(X1))
okF(X2,P(X2))
...
Jeu de test
T est idéal ssi
{i.e. T est non réussi}
∃X ∈ T, ¬okF(X,P(X))
{i.e. T est réussi}
ou si ∀X ∈ T, okF(X,P(X))
alors ∀ X ∈ Dom(P), okF(X,P(X))
2009
Critère fiable
INSA -- Test de Logiciels
43
Critère valide pour P
C fiable pour P ssi
∀T1,T2 tq COMPLETEP(T1,C) et COMPLETEP(T2,C),
T1 réussi est équivalent à T2 réussi
2009
INSA -- Test de Logiciels
44
Exemples (1)
Prog : ush P(ush n) { return(n+n);}
Spéc : F(n) = n²
Défauts
Critère valide
C1 : sélection de DT à valeur paire <3
Jeux de test
okF(0,P(0))
okF(2,P(2))
C valide pour P ssi
∀X ∈ Dom(P) tq ¬okF(X,P(X)),
∃T tq COMPLETEP(T,C) et T non réussi
2009
INSA -- Test de Logiciels
C1 est fiable et non valide pour P
45
Exemples (2)
Spéc : F(n) = n²
2009
INSA -- Test de Logiciels
46
Exemples (3)
Prog : ush P(ush n) { return(n+n);}
C2 : sélection de 2 DT à valeur paire
{0,2}, {2,4}, {0,4}, …
C3 : sélection de 3 DT dont (X=1)
{0,1,2},{1,2,3},{0,1,3},…
¬okF(1,P(1))
C3 est
C2 est valide et non fiable pour P
INSA -- Test de Logiciels
Prog : ush P(ush n) { return(n+n);}
Spéc : F(n) = n2
okF(0,P(0))
okF(2,P(2))
mais ¬okF(4,P(4))
2009
{0}, {2}, {0,2}
47
2009
pour P
INSA -- Test de Logiciels
48
Exercice :
1.1 Théorème fondamental du test
Critère C valide et fiable
Spéc : Fn = (n+1)ème nombre premier (par ex. F1 = 3)
Défauts
Prog : ush P(ush n) { return(2*n + 1);}
C1 : sélection de 2 DT dont une contient une valeur ≤ 10 et
l’autre un impair quelconque
C2 : sélection d’un sous-ensemble de 2{1,2,3}
Q1 : C1,C2 sont-ils valides, fiables pour P ?
Q2 : Imaginer un critère C3 qui soit valide et fiable pour P
2009
INSA -- Test de Logiciels
49
Jeu de test
[Goodenough & Gerhart 75] :
Tout critère C valide et fiable pour P
ne sélectionne que des jeux de test idéaux pour P
2009
INSA -- Test de Logiciels
50
1ère critique :
les notions de validité/fiabilité sont relatives à P
Preuve
Tout critère C valide et fiable pour P
ne sélectionne que des jeux de test idéaux pour P
A démontrer : Soit TX un jeu de test tq COMPLETEP(TX,C)
si TX est réussi alors ∀X ∈ Dom(P), okF(X,P(X))
Par l’absurde : Soit Y tq ¬okF(Y,P(Y)) alors
∃TY tq COMPLETEP(TY,C)et TY non réussi
car C est valide, or C est fiable pour P donc
∀T tq COMPLETEP(T,C), T est non réussi.
Si P est correct,
tout critère C est valide/fiable pour P
Déterminer un critère valide/fiable pour P
nécessite pratiquement de connaître les fautes de P
Si P’ est une mise au point de P, alors
C n’est pas nécessairement valide/fiable pour P’
En particulier, TX est non réussi -- CONTRADICTION
2009
INSA -- Test de Logiciels
51
2009
INSA -- Test de Logiciels
52
Exemple de critère valide et fiable pour tout P :
test exhaustif
2nde critique : Test exhaustif = exemple unique !
- Critère C : sélection de toutes les données de test possibles
T = Dom(P)
Preuve [Weyuker & Ostrand 80] :
C est (trivialement) valide et fiable
- équivalent à une preuve de correction
- Mais impraticable en général ! (même si Dom(P) < +∞)
P(ush x1,ush x2,ush x3) {...}
Car ∀P, ∀X ∈ Dom(P),
∃P’ tq ∀Y ∈ Dom(P) okF(Y,P’(Y))
et ¬okF(X,P’(X))
{Y≠X}
D’où si C est valide/fiable pour tout programme
(en particulier P’ ), alors C doit sélectionner X,
∀X, C sélectionne X
232 possibilités × 232 possibilités × 232 possibilités = 296 possibilités
2009
INSA -- Test de Logiciels
53
2009
INSA -- Test de Logiciels
54
Papiers fondateurs
Howden’s negative result
[Goodenough & Gerhart 75]
«Toward a Theory of Test Data Selection»
IEEE Trans. on Software Engineering SE-1 N°2 Jun 1975
Etant donné un programme P, le problème qui consiste à
générer un jeu de test idéal réussi, i.e. T tel que :
si ∀X∈T, okF(X,P(X)) alors ∀X∈Dom(P), okF(X,P(X))
[Howden 76] «Reliability of the Path Analysis Testing Strategy»
IEEE Trans. on Software Engineering SE-2 N°3 Jun 1976
est indécidable dans le cas général !
[Weyuker & Ostrand 80] «Theories of Program Testing and
the Application of Revealing Subdomains»
IEEE Trans. on Software Engineering SE-6 N°3 May 1980
D’où : recherche empirique de critères de test intéressants
[Rapps & Weyuker 85]
«Selecting Software Test Data Using Data Flow Information »
IEEE Trans. on Software Engineering SE-11 N°4 Apr 1985
2009
INSA -- Test de Logiciels
55
Représentations internes
2009
INSA -- Test de Logiciels
56
Graphe de flot de contrôle (GFC)
Abstractions de la structure d’un programme
Graphe orienté et connexe (N,A,e,s) où
- Graphe de Flot de Contrôle [GFC]
N : ens. de sommets =
bloc d’instructions exécutés en séquence
E : relation de N x N =
débranchement possible du flot de contrôle
- Graphe Def/Use [GDU]
[- Program Dependence Graph, ...]
e : sommet “d’entrée” du programme
s : sommet de sortie du programme
2009
INSA -- Test de Logiciels
57
Graphe de flot de contrôle (GFC) : exemple
double P(short x, short y) {
short w = abs(y) ;
double z = 1.0 ;
2009
w != 0
Déf: Un ensemble C de chemins du GFC
(N,A,e,s) satisfait tous_les_sommets
ssi ∀n ∈ N, ∃Ci ∈ C
tq n est un sommet de Ci
faux
d
y<0
vrai
if ( y<0 )
z = 1.0 / z ;
return(z) ;
}
faux
a
b
c
d
Exemple : Ici un seul chemin suffit
a-b-c-b-d-e-f [6/6 sommets]
e
f
INSA -- Test de Logiciels
58
Motivation : couvrir toutes les instructions
du programme au moins une fois
vrai
c
INSA -- Test de Logiciels
Critère : tous_les_sommets | toutes_les_instructions
a
b
while ( w != 0 )
{
z =z*x;
w=w-1;
}
2009
59
2009
INSA -- Test de Logiciels
e
f
60
Critère structurel : tous_les_arcs | toutes_les_décisions
Motivation : couvrir toutes les prises de
décision au moins une fois
a
c
d
Exemple : Ici 2 chemins sont nécessaires
a-b-c-b-d-e-f [6/7 arcs]
a-b-d-f
[3/7 arcs]
2009
e
f
INSA -- Test de Logiciels
61
b
Ici, impossible car ∞ chemins
et chemins non-exécutables !
d
e
tous_les_chemins plus fort que tous_les_arcs
tous_les_arcs plus fort que toutes_les_sommets
f
INSA -- Test de Logiciels
Idée de la preuve: réduction au problème
de l’arrêt d’une Machine de Turing return(z)
2009
INSA -- Test de Logiciels
f
62
P(short x,y)
short w= abs(y)
double z= 1.0
b
w != 0
z= z * x
w= w-1
d
Exemples :
exec(P,(0,0)) = a-b-d-f
exec(P,(3,2)) = a-b-(c-b)²-d-f
2009
a
y<0
z=1.0 / z
e
f
INSA -- Test de Logiciels
64
Exercice
a
P(short x,y)
short w= abs(y)
double z= 1.0
b
w != 0
Trouver tous les chemins non-exécutables de ce
programme
a
z= z * x
w= w-1
d
c
return(z)
63
Problème des chemins non exécutables
c
e
INSA -- Test de Logiciels
Déf: séquence de sommets du GFC, non
nécessairement finie, empruntée lors de
l’exécution de P avec X comme entrée
c
Weyuker 79
Déterminer si un sommet, un arc, ou
un chemin du GFC est exécutable est
indécidable dans le cas général
d
Principe:
X sensibilise un unique chemin du GFC
a
Ici, a-b-d-e-f est non-exécutable !
c
Chemin sensibilisé : exec(P,X)
Déf : Un ensemble C de chemins du GFC
(N,A,e,s) satisfait tous_les_chemins
ssi C contient tous les chemins de e à s
Soit c un chemin du GFC de P,
existence de X tq c=exec(P,X) ?
b
Exemple : Ici 4 chemins complets
sont nécessaires
a-b-d-f
a-b-d-e-f
a-b-c-b-d-f
a-b-c-b-d-e-f
2009
Critère structurel : tous_les_chemins
2009
a
Motivation : couvrir toutes les chemins
d’exécution, sans itérer plus d’une fois dans
les boucles
b
Déf : Un ensemble C de chemins du GFC
(N,A,e,s) satisfait tous_les_arcs
ssi ∀a ∈ A, ∃Ci ∈ C
tq a est un arc de Ci
Critère structurel : tous_les_chemins_simples
y=x
x=0
v
b
f
d
v
e
65
2009
y= -x
x= -1
x < 0 && y>= 0
f
e
f
x>0
c
y<0
z=1.0 / z
P(short x)
f
g
INSA -- Test de Logiciels
66
Condition / Décision dans un programme
Critères de test liés aux décisions
if( A && (B || C))
Condition (bool., expr. arith, ...)
1. Decision Criterion (DC) :
if( A && (B || C))
A=1,B=1,C=0 – Dec=1
A=0,B=0,C=0 – Dec=0
2. Condition Criterion (CC) : A=1,B=1,C=0 – Dec=1
A=0,B=0,C=1 – Dec=0
3. Modified Condition/Decision Criterion (MC/DC)
Décision
(bool., expr. logique dans une structure de contrôle, ...)
Notation :
Dec est la valeur de vérité de la décision
2009
INSA -- Test de Logiciels
4. Multiple Condition/Decision Criterion: 23=8 cas de test
67
Modified Condition/Decision Criterion (1)
2009
INSA -- Test de Logiciels
Modified Condition/Decision Criterion (2)
Objectif : Démontrer l’action de chaque condition sur
la valeur de vérité de la décision
if( A && (B || C))
if( A && (B || C))
Principe : pour chaque condition, trouvez 2 cas de
test qui changent Dec lorsque toutes les autres
conditions sont fixées
Ex : pour A
2009
A=0, B=1,C=1
A=1, B=1,C=1
pour A
A=0, B=1,C=1
A=1, B=1,C=1
-- Dec=0
-- Dec=1
pour B
A=1, B=1,C=0
A=1, B=0,C=0
-- Dec=1
-- Dec=0
pour C
A=1, B=0,C=1
A=1, B=0,C=0
-- Dec=1
-- Dec=0
-- Dec=0
-- Dec=1
INSA -- Test de Logiciels
Ici, 5 cas de test suffisent pour MC/DC !
69
Exercice : peut-on faire mieux ?
A= , B= ,C=
A= , B= ,C=
-- Dec=
-- Dec=
pour B
A= , B= ,C=
A= , B= ,C=
-- Dec=
-- Dec=
pour C
A= , B= ,C=
A= , B= ,C=
2009
INSA -- Test de Logiciels
70
Modified Condition/Decision Criterion (3)
if( A && (B || C))
pour A
68
Propriété : Si n = #conditions alors
couvrir MC/DC requiert au moins n+1 DT et au plus 2n DT
n+1 ≤ #données de test ≤ 2*n
Conditions couplées : changer la valeur d’une condition
modifie la valeur d’une autre
-- Dec=
-- Dec=
En l’absence de conditions couplées, le minimum (n+1)
peut-être atteint
2009
INSA -- Test de Logiciels
71
2009
INSA -- Test de Logiciels
72
Lien avec la couverture du code objet
Couvrir MC/DC ⇒ couvrir les décisions du code objet
mais
Couvrir MC/DC ⇐ couvrir les décisions du code objet
Couvrir les chemins du code objet ⇒ couvrir MC/DC
mais
Couvrir les chemins du code objet ⇐ couvrir MC/DC
2009
INSA -- Test de Logiciels
73
Représentations internes
From the Galileo development standard
Structural coverage
Statement coverage
(source code)
Statement coverage
(object code)
Decision coverage
(source code)
Modified Condition &
Decision Coverage
(Source code)
2009
DAL A
N/A
DAL
DAL C
B
100% 100%
100% N/A
N/A
DAL
D
90%
DAL
E
N/A
N/A
N/A
N/A
100% N/A
N/A
N/A
N/A
N/A
100% N/A
N/A
INSA -- Test de Logiciels
Graphe Def/Use (GDU) –
74
[Rapps & Weyuker 85]
Abstractions de la structure d’un programme
A chaque sommet j est associé
- def(j) :
{v ∈ Var(P) | v est définie en j }
- c-use(j) : {v ∈ Var(P) | v est utilisée en j dans un calcul
et ∃k ≠ j tel que v ∈ def(k)}
A chaque arc j-k issu d’une décision est associé
- p-use(j,k) : {v ∈ Var(P) | v est utilisée dans le prédicat j
et conditionne l’exécution de k}
- Graphe de flot de contrôle [GFC]
- Graphe Def/Use [GDU]
GFC + décoration des sommets/arcs avec infos
définitions/utilisations sur les variables
[- Program Dependence Graph, …]
2009
Hypothèses : Toute variable utilisée possède une définition
et à chaque définition correspond au moins une utilisation
INSA -- Test de Logiciels
75
Graphe Def/Use : exemple
if ( y<0 )
z = 1.0 / z ;
return(z) ;
}
2009
INSA -- Test de Logiciels
76
Chemin sans définition (def-clear path)
double P(int x, int y) {
w = abs(y) ;
z = 1.0 ;
while ( w != 0 )
{
z = z*x ;
w = w-1 ;
}
2009
1
c-use(1) : ∅
def(1) : x,y,w,z
2
p-use(2,3) : w
c-use(3) : x,z,w
def(3) : z,w
Soient i un sommet d’un GDU (N,A,e,s) et x ∈ def(i)
3
p-use(2,4) : w
4
p-use(4,6) : y
6
INSA -- Test de Logiciels
i-n1-…-nm-j est un chemin sans déf. de x de i à j
ssi ∀k ∈ {1,..,m}, x ∉ def(nk)
p-use(4,5) : y
5
c-use(5) : z
def(5) : z
c-use(6) : z
77
dcu(x,i): {j ∈ N | x ∈ c-use(j) et
∃un chemin sans déf. de x de i à j}
dpu(x,i): {j-k ∈ A | x ∈ p-use(j,k) et
∃un chemin sans déf. de x de i à j}
2009
INSA -- Test de Logiciels
78
Critère structurel : toutes_les_définitions
dcu(x,j) et dpu(x,j) : exemples
dcu(x,1)= {3}, dpu(x,1)= ∅
dcu(y,1)= ∅,
dpu(y,1)= {4-5,4-6}
dcu(w,1)= {3}, dpu(w,1)= {2-3,2-4}
dcu(z,1)= {3,5,6}, dpu(z,1)= ∅
p-use(2,3) : w
c-use(3) : x,z,w
def(3) : z,w
1
2
3
p-use(2,4) : w
4
dcu(z,3)= {3,5,6}, dpu(z,3)= ∅
dcu(w,3)= {3}, dpu(w,3)= {2-3,2-4} p-use(4,6) : y
dcu(z,5) = {6}, dpu(z,5) = ∅
2009
c-use(1) : ∅
def(1) : x,y,w,z
p-use(4,5) : y
5
6
c-use(5) : z
def(5) : z
c-use(6) : z
INSA -- Test de Logiciels
79
Couverture de toutes_les_définitions
1
Ici, un seul chemin suffit !
1-2-3-2-4-5-6
c-use(1) : ∅
def(1) : x,y,w,z
2
3
INSA -- Test de Logiciels
p-use(4,6) : y
6
Déf : C satisfait toutes_les_utilisations
ssi ∀n∈ N et ∀x∈ def(n), ∃Ci ∈ C
tq Ci inclut un chemin sans déf. de x de n à
tous les éléments de dcu(x,n) et dpu(x,n)
Exemple : Ici, trois chemins sont nécessaires !
par exemple : 1-2-4-6, 1-2-3-2-4-6 et 1-2-(3-2)2-4-5-6
p-use(4,5) : y
5
c-use(5) : z
def(5) : z
toutes_les_utilisations est plus fort que
toutes_les_définitions
c-use(6) : z
INSA -- Test de Logiciels
81
Chemin définition/utilisation p.r.à. x (du-path w.r.t. x)
Déf: p = i-..-j-k est
un chemin définition/utilisation par rapport à x ssi :
1. x ∈ def(i)
2a. soit x ∈ c-use(k) alors p est un chemin sans déf. de x
de i à k et p se trouve sur un chemin simple
2b. soit x ∈ p-use(j,k) alors p est un chemin sans déf.
de x de i à j et p se trouve sur un chemin simple
2009
INSA -- Test de Logiciels
INSA -- Test de Logiciels
82
Chemin définition/utilisation : exemples
du_path w.r.t. x : 1-2-3
du_paths w.r.t. y :
1
1-2-4-5, 1-2-4-6,
1-2-3-2-4-5,
1-2-3-2-4-6
2
c-use(3) : x,z,w
def(3) : z,w
du_paths w.r.t. z :
1-2-3,1-2-4-5,1-2-4-6,
3-2-3,3-2-4-5,3-2-4-6,
5-6
3
p-use(2,4) : w
4
p-use(4,6) : y
du_paths w.r.t. w :
83
2009
c-use(1) : ∅
def(1) : x,y,w,z
p-use(2,3) : w
1-2-3,1-2-4,3-2-3,3-2-4
2009
80
p-use(2,4) : w
4
2009
2009
Critère structurel : toutes_les_utilisations
p-use(2,3) : w
c-use(3) : x,z,w
def(3) : z,w
Déf : Un ensemble C de chemins du
GDU (N,A,e,s) satisfait toutes_les_définitions ssi
∀n ∈ N et ∀x ∈ def(n),
∃Ci ∈ C tel que
Ci inclut un chemin sans déf. de x
de n à un élément de dcu(x,n) ou dpu(x,n)
INSA -- Test de Logiciels
6
p-use(4,5) : y
5
c-use(5) : z
def(5) : z
c-use(6) : z
84
Relation entre les critères (“est plus fort que”)
Critère structurel : tous_les_chemins_du
Déf: C satisfait tous_les_chemins_du 1 c-use(1) : ∅
def(1) : x,y,w,z
ssi ∀n∈ N et ∀x∈ def(n),
C inclut tous les chemins
2
p-use(2,3) : w
définition/utilisation
par rapport à x
c-use(3) : x,z,w
p-use(2,4) : w
C1 subsume C2 (noté C1 ⇒ C2) ssi
∀GDU, ∀ensemble de chemins P qui satisfait C1,
P satisfait aussi C2
3
def(3) : z,w
4
p-use(4,5) : y
p-use(4,6) : y
Ici, 5 chemins !
1-2-4-6, 1-2-4-5-6,
5 c-use(5) : z
def(5) : z
1-2-(3-2)2-4-6,1-2-3-2-4-5-6
6
c-use(6)
:
z
1-2-3-2-4-6
2009
INSA -- Test de Logiciels
85
Les liens entre critères liés au GDU et au GFC
Critères liés au GDU
Propriétés :
- relation transitive ( C1 ⇒ C2 et C2 ⇒ C3 alors C1 ⇒ C3 )
- définit un ordre partiel entre les critères
Ex: tous_les_chemins_du subsume toutes_les_utilisations
2009
INSA -- Test de Logiciels
86
[Rapps & Weyuker 1985]
Et en plus…
tous_les_chemins
Critères liés au GFC
tous_les_chemins_du
tous_les_chemins_du
toutes_les_utilisations
tous_les_chemins
toutes_les_utilisations
toutes_les_c_use/
quelques_p_use
toutes_les_p_use/
quelques_c_use
tous_les_arcs
toutes_les_définitions
toutes_les_p_use
tous_les_arcs
toutes_les_définitions
2009
tous_les_sommets
INSA -- Test de Logiciels
tous_les_sommets
87
tous_les_chemins n’est pas fiable !
Spéc : F(n) = n²
a
ush P(ush n)
b
return(n+n)
INSA -- Test de Logiciels
88
Freeware:
- Gcov / gcc www.netadmintools.com/html/1gcov.man.html
- Hansel (Oregon University)
hansel.sourceforge.net
- Quilt / Junit
quilt.sourceforge.net
Outils commerciaux :
- IPL Cantata++ / ADATest
- IBM Rational Test Realtime
www.iplbath.com/products
www-306.ibm.com/software/awdtools/test/realtime
Mais okF(0,P(0)) et ¬okF(1,P(1))
donc tous_les_chemins n’est pas fiable !
2009
INSA -- Test de Logiciels
Quelques outils disponibles...
Prog : ush P(ush n) { return(n+n);}
Ici, tous_les_chemins est couvert par a-b
On a
COMPLETEP({0}, tous_les_chemins)
COMPLETEP({1}, tous_les_chemins)
2009
- LDRA Testbed
89
2009
www.ldra.co.uk/pages/testbed.htm
INSA -- Test de Logiciels
90
Units of language
Functions in C
TEST UNITAIRE
AVEC CUNIT
Task in ADA
Methods or classes in C++ and Java
Predicates in Prolog
…
2009
INSA -- Test de Logiciels
91
2009
Unit testing frameworks
INSA -- Test de Logiciels
92
Unit testing: atomic operation
Select test input variable values
- JUnit, Parasoft’s Jtest for Java
- CUnit, CTC++, IBM Rational Test Real Time for C
- Parasoft’s C++Test, Cantata++… for C++
…
Define expected output values (a.k.a. oracle)
http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks
Code a test script and register it in a
database
Run the test !
2009
INSA -- Test de Logiciels
93
Cunit (http://cunit.sourceforge.net/) -- 1
94
Automated
Output to XML file, Non-interactive
Basic
Flexible programming interface, Non-interactive
Console
Console interface (ANSI C), Interactive
Curses
Graphical interface (Unix only), Interactive
Built as a static library which is linked with
the user’s test script
provides a rich set of assertions for testing
common data types.
INSA -- Test de Logiciels
INSA -- Test de Logiciels
Cunit (http://cunit.sourceforge.net/) -- 2
Lightweight system for writing, managing
and running unit test for C programs
2009
2009
95
2009
INSA -- Test de Logiciels
96
Typical test script: test_gcd.c
Example
#include "Basic.h"
typedef unsigned short ush;
void test_gcd(void) {
CU_ASSERT(4 == gcd(24, 28));
CU_ASSERT(4 == gcd(28, 24)); }
main() {
CU_pSuite pSuite = NULL;
Select a test input: (28, 24)
ush gcd(ush u, ush v)
{
while( u > 0 )
{
if ( v > u )
{
u = u + v;
v = u - v;
u = u * v;
}
u = u - v;
}
return v;
}
Define expected output: 4
if (CUE_SUCCESS != CU_initialize_registry())
return CU_get_error();
Define another test input : (24,28)
Expect output: 4
pSuite = CU_add_suite("Suite_1", 0, 0);
if (!pSuite) { CU_cleanup_registry();
return CU_get_error(); }
if ((!CU_add_test(pSuite, "test of fprintf()", test_gcd))
{ CU_cleanup_registry();
return CU_get_error(); }
Script and run the test !
CU_basic_run_tests();
CU_cleanup_registry();
return CU_get_error(); }
2009
INSA -- Test de Logiciels
97
2009
INSA -- Test de Logiciels
98
Let’s play, now !
Makefile
CUnitHeaders=/c/CUnit-2.1-0/include/CUnit
CUnitLibs=/c/CUnit-2.1-0/lib
Download and install Cunit (README)
requires Jam, MinGW on windows
http://cunit.sourceforge.net
test_gcd: gcd.o test_gcd.o
$(CC) $^ -L$(CUnitLibs) -lcunit -o $@
Code gcd.c, test_gcd.c and Makefile
gcd.o: gcd.c
$(CC) -c -D static= gcd.c
Run and explain…
test_gcd.o: test_gcd.c
$(CC) -c -I$(CUnitHeaders) test_gcd.c
clean:
2009
INSA -- Test de Logiciels
$(RM) gcd.o test_gcd.o
test_gcd.exe
99
JUnit for Java
2009
INSA -- Test de Logiciels
100
Plan complet du cours
0. Préliminaires
1. Test logiciel : principes
2. Génération automatique de test
http://www.irisa.fr/lande/gotlieb/resources/JUnit_Tutorial.mp4
3. Techniques de test fonctionnel
4. Test de logiciel orienté-objet
5. Test à partir de modèles
2009
INSA -- Test de Logiciels
101
2009
INSA -- Test de Logiciels
102
Rappels: définition du test de programme
Plan
- Tester = exécuter un programme P pour mettre
en évidence la présence de fautes, par rapport à
sa spécification F
2. Génération automatique de cas de test
2.1 Test aléatoire
2.2 Test statistique structurel
2.3 Méthode dynamique
2.4 Evaluation symbolique
2.5 Méthode à contraintes
- Recherche de contre-exemples :
∃X tq
P(X) ≠ F(X) ?
- Hypothèse de travail : oracle disponible
2009
INSA -- Test de Logiciels
103
Rappels des notations
Dom(P)
Donnée de test :
X
Jeu de test
T =
Ran(P)
{Xi}i
(ex : chemins de P)
j
=1..N
Bool
P(int i,int j)
{
if( C1 )
else ...
Dom(P)
X2
X3
X5
okF(X1,P(X1))
okF(X2,P(X2))
...
X4
2009
104
- Procédé de sélection de données de test
- Induit parfois une « partition » sur le domaine d’entrée
∈ Dom(P)
Oracle okF : Dom(P) x Ran(P)
X1
INSA -- Test de Logiciels
Critère de sélection C
Programme P :
:
2009
INSA -- Test de Logiciels
Dom(P)
C1∧¬C2
C1∧C2
if( C2)
else ...
}
105
Couverture déterministe d’un critère C
¬C1∧¬C2
¬C1∧ C2
i
2009
INSA -- Test de Logiciels
106
Couverture probabiliste du critère C
Génération aléatoire de données de test
selon une distribution de probabilités
(ou profil d’entrée)
Génération d’une seule donnée de test
par élément à vérifier !
Dom(P)
X4
X1
Dom(P)
X2
X1
X3
X5
INSA -- Test de Logiciels
107
X6
X8
Repose sur une hypothèse d’uniformité :
une seule donnée de test suffit pour tout le sous-domaine
2009
X2
X7
X4
2009
X3
INSA -- Test de Logiciels
108
2.1 Test aléatoire
Qualité de test pour le test aléatoire : QN
Loi de probabilité uniforme sur le domaine d’entrée
QN = probabilité que (un de ces) X soit détecté après
la génération de N DT aléatoires
(i.e. chaque DT est équiprobable)
- Utilisation de générateurs de valeurs pseudo-aléatoires
- Nécessité de disposer d’un oracle automatique
- Condition d’arrêt à déterminer (nombre de DT à générer,
critère de test couvert)
2009
INSA -- Test de Logiciels
109
= pf
= Q1+ (1-Q1).pf
(1-pf)n-1. Q1= pf .(1-pf)n-1
(1-pf)n-2. Q2= pf .(1-pf)n-2 + (1-pf)n-1.Q1
…
(1-pf).Qn-1 = pf . (1-pf). + (1-pf)2. Qn-2
Qn = pf
+ (1-pf). Qn-1
Remarques :
- l’évaluation de pf repose sur la connaissance des fautes
- pas de lien avec les critères de test
2009
INSA -- Test de Logiciels
110
Dom(P)
A2
QN = 1 – (1-pf)N
INSA -- Test de Logiciels
C.Q.F.D.
111
[Thévenod-Fosse 89]
pc = min { p{x∈A} | A ∈ SC }
A3
SC = {A1,..,A4}
Ici p{x∈A1} < p{x∈A2} < p{x∈A3} < p{x∈A4} donc le
test aléatoire couvre « mieux » A4 que A1, ce qui n’est
pas2009
satisfaisant !
INSA -- Test de Logiciels
112
Plan
2. Génération automatique de cas de test
qN = probabilité que chaque élément de SC soit activé après
la génération de N DT aléatoires
2.1 Test aléatoire
2.2 Test statistique structurel
2.3 Méthode dynamique
2.4 Evaluation symbolique
2.5 Méthode à contraintes
qN = 1 – (1-pc)N
Corollaire : si pC≠0 et pC≠1
A1
A4
Qualité de test pour le test statistique : qN
Théorème :
QN = 1 – (1-pf)N
p{x∈A} : probabilité qu’une DT aléatoire x couvre l’élément A
Q1 = pf
Q2 = pf + (1-pf).Q1
…
Qn-1= pf + (1-pf).Qn-2
Qn = pf + (1-pf).Qn-1
= Qn-2 + (1-Qn-2).pf
= Qn-1 + (1-Qn-1).pf
2009
Théorème :
Efficacité du test aléatoire pour couvrir un critère ?
Preuve
Q1
Q2
…
Qn-1
Qn
On a :
pf = probabilité que ∃X généré aléatoirement tq P(X) ≠ F(X)
N ≥ ln(1-qN)
ln(1- pC)
NB : qN ≠ QN la qualité de test pour le test aléatoire (en général)
2009
INSA -- Test de Logiciels
113
2009
INSA -- Test de Logiciels
114
2.2 Test statistique structurel
qN = 1 – (1 – pC)N pour N=2, 8, 16 cas de test
Déf : C est couvert avec une probabilité qN
si tout élément de SC a une probabilité au moins qN d’être
couvert au cours de N exécutions avec des DT aléatoires
Remarques :
- ∀JT fini, aucune garantie de couverture du critère
N = 16
- couvrir C avec une probabilite qN devient
l’objectif de test
N=8
N=2
- conséquence : maximiser pc= min { p{x∈A} | A ∈ SC}
2009
INSA -- Test de Logiciels
115
2009
INSA -- Test de Logiciels
116
1ère étape : calculer un profil d’entrée tq PA1= ..=PAk=1/k
Algorithme pour le critère tous_les_chemins
Dom(P)
A1
A2
qN = 1 – (1 – pC)N
A3
A4
Calcul des proba. sur Dom(P)
afin que PA1 = .. =PAk= 1/k
1ère étape : calculer un profil d’entrée tq PA1= ..=PAk=1/k
2ème étape : choisir qN et en déduire N, le nombre de DT
3ème étape : générer N DT selon PA1 ,..,PAk
PA : probabilité qu’une donnée de test aléatoire couvre l’élément A
2009
INSA -- Test de Logiciels
117
2009
INSA -- Test de Logiciels
118
3ème étape : générer N DT selon PA1 = ..= PAk = 1/k
2ème étape : choisir qN et en déduire N
Si qN = 0.85
A1
A2
A3
N = 8 convient
A4
2009
INSA -- Test de Logiciels
119
2009
INSA -- Test de Logiciels
120
Test statistique structurel : exemple (1)
Test statistique structurel : exemple (2)
(I,B,C) ∈ Dom(P) = {-231,..,231-1} x {0,1} x {0,1}
objectif de test : couvrir tous_les_chemins
avec qN = 0,99
I≥0
Calcul des proba. sur Dom(P) afin que :
P1-2-5-6 = P1-2-3-5-6 = P1-2-3-4-5-6 = P1-2-3-4-6 = ¼
1
2
on pose :
x = P{I < 0}, y = P{B}, z = P{C}
2
I<0
3
¬B
P1-2-5-6 = P{ I < 0 }
C
P1-2-3-5-6 = P{ I ≥ 0 } . P{ B }
4
P1-2-3-4-5-6 = P{ I ≥ 0 } . P{ ¬B } . P{ C }
¬C
P1-2-3-4-6 = P{ I ≥ 0 } . P{ ¬B } . P{ ¬C }
2009
1
B
5
4
(1-x) . y = ¼
C
5
¬C
2009
INSA -- Test de Logiciels
122
Test statistique structurel : limites et extensions
- le biais introduit par les chemins non-exécutables n’est
pas pris en compte
2
I≥0
I<0
3
B
¬B
C
5
¬C
6
2009
¬B
6
121
1
4
B
(1-x) . (1-y) . (1-z) = ¼
6
Test statistique structurel : exemple (3)
Nbre de DT à générer (si qN = 0.99 ) :
Par la relation
N ≥ ln(1-qN) / ln(1- pC)
on obtient N ≥ 16
I<0
3
d’où :
x=¼
(1-x) . (1-y) . z = ¼
INSA -- Test de Logiciels
Profil d’entrée :
P{I < 0} = 1/4 et P{I ≥ 0} = 3/4
P{B}
= 1/3 et P{¬B} = 2/3
P{C}
= 1/2 et P{¬C} = 1/2
I≥0
INSA -- Test de Logiciels
123
- génération du profil d’entrée pour les critères
tous_les_sommets, tous_les_arcs nécessite une prise en
compte fine des boucles
- générateur uniforme dans un sous-domaine d’entrée
défini sous contraintes difficile à réaliser
Mais fonctionne bien avec des données expérimentales !
[Thévenod-Fosse,
Waeselynck 91]
2009
INSA -- Test de Logiciels
124
Test statistique structurel : travaux et outils
Exercice :
LAAS – groupe TSF :
Evaluation expérimentale sur quelques modules de
surveillance d’un réacteur nucléaire (critères GFC+GDU)
SESAME : test statistique et analyse de mutation
short P(short x, short y, short z)
{
short t ;
1. if (x < y)
2.
if (y < z)
3.
t=z;
else
4.
t=y;
else
5.
if (x > z)
6.
t=x;
else
7.
t = z;
8. return t;
}
IRISA / Celtique :
AUGUSTE (LRI) : Test statistique et structures combinatoires
Projet GENETTA : Test statistique structurel pour Java Card
LSR-IMAG – équipe VaSCo :
Test statistique fonctionnel de programmes Lustre -LUTESS
2009
a) Que calcule P ?
b) Déssiner le GFC de P
c) Calculer un profil d’entrée
qui rende équiprobable
chacun des chemins de P
d) Déterminer le nombre N de
DT à générer pour couvrir
tous_les_chemins avec
qN = 0.8
Indications : ln(0.2)=-1.6 et ln(0.75)=-0.28
INSA -- Test de Logiciels
126
[Korel 90]
2.3 Méthode dynamique
Plan
Objectif : Calcul de X tel que le chemin c soit sensibilisé ?
2. Génération automatique de cas de test
{X | c=exec(P,X)}
2.1 Test aléatoire
2.2 Test statistique structurel
2.3 Méthode dynamique
2.4 Evaluation symbolique
2.5 Méthode à contraintes
2009
Dom(P)
INSA -- Test de Logiciels
127
2009
Méthode dynamique orientée-chemin
e
Principe :
Transformer le problème en
un problème de minisation d’une
fonction objectif, sous contraintes
n2
n1
2009
n3
n4
n5
= problème classique de
Recherche Opérationnelle
INSA -- Test de Logiciels
129
}2009
INSA -- Test de Logiciels
INSA -- Test de Logiciels
n2
n4
n3
n6
s
130
Idée : utiliser des exécutions du programme
Relat
< 0
≤ 0
< 0
≤ 0
= 0
< 0
X
minimiser Fn
k-nk+1
(X)
en conservant e-n1-..-nk parcouru
Avec la technique de la variable alternée--[Glass & Cooper 65]
si X=(x1,..xN), xi varie, xj est fixée ∀j≠i
* basée sur des essais de valeurs
* méthode directe (sans utilisation de différentielles)
* heuristique incomplète !
Nota : Fd(X) dépend implicitement des variables d’entrée
2009
k+1
n1
Etape critique : minimiser la fonction de branche
Fonction de branche Fd(X) à valeurs réelles :
Fonction de branche Fd(X)
E2 – E1
E2 – E1
E1 – E2
E1 – E2
abs(E1 – E2)
- abs(E1 – E2)
2) identifier nk (ou pk) le premier sommet
pour lequel nk+1 ≠ pk+1
n5
3) X minimiser Fn -n (X)
en conservant e-n1-..-nk parcouru
s
e
X
random ;
tant que( exec(P,X) ≠ e-n1-..nq-s)
{
1) noter le flot (par instrumentation)
exec(P,X) = e-p1-..-pj-s
k
n6
Fonction de branche : définition
Décision d
E1 > E2
E1 ≥ E2
E1 < E2
E1 ≤ E2
E1 = E2
E1 ≠ E2
128
Méthode dynamique : algorithme
Objectif :
Calcul de X tel que c = exec(P,X) ?
Minimiser la fonction de branche F(X)
INSA -- Test de Logiciels
131
2009
INSA -- Test de Logiciels
132
Exemple: programme Puissance(X,Y)
Méthode dynamique : algorithme
e
X
random ;
tant que( exec(P,X) ≠ e-n1-..nq-s)
{
1) noter le flot (par instrumentation)
exec(P,X) = e-p1-..-pj-s
n1
n2
n4
2) identifier nk (ou pk) le premier sommet
pour lequel nk+1 ≠ pk+1
n5
3) X minimiser Fn -n (X)
k
k+1
s
INSA -- Test de Logiciels
133
2009
Méthode dynamique orientée-chemin : exemple (1)
Calcul de X tq a-b-(c-b)2-d-f
(X,Y)
(18,-34)
1) exec(P,(18,-34))=
a-b-(c-b)2-(c-b)32-d-e-f
2) donc k=b-d et
Fb-d((X,Y))= abs(w)
on a Fb-d(18,-34)=32
par la méthode de la variable alternée :
(X,Y) (18,-2) et Fb-d(18,-2)=0
2009
X2
c
P(short x,y)
w= abs(y)
z= 1.0
b
w != 0
return(z)
y<0
e
f
135
Limites :
technique de minimisation limitée à l’essai de valeurs
heuristique incomplète
Extensions :
- Illinois Institute of Technology (USA) – Bogdan Korel
tous_les_arcs + analyse dynamique de flot de données
- University of York (UK) – group Testsig
minimisation de la fonction de branche par recuit-simulé
- University of Arizona (USA) – projet et outil TGEN
relaxation itérative + découverte dynamique d’invariants
INSA -- Test de Logiciels
b
w != 0
z= z * x
w= w-1
y<0
z=1.0 / z
e
f
INSA -- Test de Logiciels
134
Calcul de X tq a-b-(c-b)2-d-f
par la méthode de la variable alternée :
(X,Y) (18,2) et
exec(P,(18,2))= a-b-(c-b)2-d-f
2009
X2
c
a
P(short x,y)
w= abs(y)
z= 1.0
b
w != 0
z= z * x
w= w-1
d
y<0
z=1.0 / z
return(z)
e
f
INSA -- Test de Logiciels
136
Bibliographie (sélective) pour ce cours
Méthode dynamique : limites et travaux
2009
P(short x,y)
w= abs(y)
z= 1.0
d
3) exec(P,(18,-2))=
a-b-(c-b)2-d-e-f
4) donc k = d-f et
Fd-f((X,Y))= -y
on a Fd-f((18,-2))=2
z= z * x
w= w-1
z=1.0 / z
INSA -- Test de Logiciels
c
a
Méthode dynamique orientée-chemin : exemple (2)
a
d
while ( w != 0 )
{
z =z*x;
w=w-1;
}
if ( y<0 )
z = 1.0 / z ;
return(z) ;
}
n6
en conservant e-n1-..-nk parcouru
}2009
n3
double P(short x, short y) {
short w = abs(y) ;
double z = 1.0 ;
137
[Duran & Ntafos 84]
«An Evaluation of Random Testing»
IEEE Trans. on Software Engineering SE-10 N°4 July 1984
[Thévenod-Fosse & Waeselynck 91
«An Investigation of Statistical Software Testing»
Journal of Software Testing, Verification and Reliability Vol1
N°2 Juil-Sept. 1991
[Korel 90] «Automated SoftwareTest Data Generation»
IEEE Trans. on Software Engineering SE-16 N°8 Aug. 1990
2009
INSA -- Test de Logiciels
138
Rappels (notations et un résultat)
Plan
∈ Dom(P)
Donnée de test :
X
Jeu de test
:
T =
Oracle okF
: Dom(P) x Ran(P)
exec(P,X)
: chemin complet du GFC sensibilisé par X
{Xi}i
2. Génération automatique de cas de test
=1..N
Bool
2.1 Test aléatoire
2.2 Test statistique structurel
2.3 Méthode dynamique
2.4 Evaluation symbolique
2.5 Méthode à contraintes
Soit e un élément du GFC de P (sommet, arc ou chemin),
existence de X tel que e soit inclus dans exec(P,X) ?
Weyuker 79 : indécidable dans le cas général !
2009
INSA -- Test de Logiciels
2.4 Evaluation symbolique
139
[King 76, Clarke 76]
Utilisation d’expressions algébriques pour représenter
les valeurs des variables
Utilisé en vérification (preuve),
optimisation dans les compilateurs, spécialisation,
en génération automatique de cas de test, etc.
INSA -- Test de Logiciels
INSA -- Test de Logiciels
141
Etat symbolique
Exécution symbolique simple : exemple
a
P(short x,y)
short w= abs(y)
double z= 1.0
Ex : a-b-(c-b)2-d-f avec X,Y
b w != 0
a: w := abs(Y); z := 1.0 ;
z= z * x
b: abs(Y) != 0;
c w= w-1
c: z := X; w := abs(Y) – 1;
b: abs(Y)-1 != 0;
d y<0
c: z := X * X; w := abs(Y) – 2;
b: abs(Y)-2 = 0;
z=1.0 / z e
d: Y ≥ 0
return(z) f
f: return(X * X)
2009
INSA -- Test de Logiciels
142
<Path,State,PC> : exemples
Notations : P un programme de GFC (N,A,e,s),
X vecteur d’entrées symboliques,
Var(P) dénote l’ensemble des variables internes de P
Définition (Etat symbolique) : <Path, State, PC> où :
Path = ni-..-nj est un chemin (partiel) du GFC
State = {<v,ϕ>}v∈Var(P) -- ϕ une expr. algébrique de X
-- ck condition portant sur X
PC = c1∧.. ∧ cn
< a, {<z, ⊥>, <w, ⊥>}, true>
a
< a-b-c-b,
{<z, X>, <w, abs(Y)-1>},
abs(Y) != 0 >
b
c
< a-b-(c-b)2-d-f,
{<z, X2>, <w, abs(Y)-2>},
(abs(Y) != 0)∧(abs(Y) != 1)
∧(abs(Y) = 2)∧(Y ≥ 0) >
NB : PC pour Path Condition
2009
140
Evaluation (avant) d’un chemin du GFC
avec des valeurs symboliques
Technique d’analyse orientée-chemin du GFC
- Exécution symbolique simple
- Evaluation symbolique dynamique
- Evaluation symbolique globale
2009
2009
INSA -- Test de Logiciels
2009
INSA -- Test de Logiciels
w != 0
z= z * x
w= w-1
d
y<0
z=1.0 / z
return(z)
143
P(short x,y)
short w= abs(y)
double z= 1.0
e
f
144
Etat symbolique : propriétés
Analyses avant et arrière
Analyse avant :
- suivi de Path dans le sens d’exécution
<Path, State, PC> se calcule par induction sur
chaque instruction des sommets de Path
- intéressant pour le calcul des états symboliques
complets
soit SPC l’ensemble solution de PC
∀X∈SPC, Path est inclus dans exec(P,X)
Si SPC = ∅ alors Path est non-exécutable
ex : < a-b-d-e-f, {…}, abs(Y)=0 ∧ Y<0 >
2009
INSA -- Test de Logiciels
145
Ex : a-b-(c-b)2-d-f avec X,Y
a
PC f,d: Y ≥0
b
X2
PC c: Y ≥0, w-1 = 0
c
PC b: Y ≥0, w-1 = 0, w != 0
PC b: Y ≥0, w-2 =0, w-1 != 0,w != 0
2009
return(z)
INSA -- Test de Logiciels
P(short x,y)
short w= abs(y)
double z= 1.0
a
y<0
b
c
PC:
(abs(Y) != 0)∧(abs(Y) != 1)
∧(abs(Y) = 2)∧ (Y ≥ 0)
P(short x,y)
short w= abs(y)
double z= 1.0
w != 0
z= z * x
w= w-1
d
y<0
+
z=1.0 / z
e
z=1.0 / z
Résolution interactive des conditions
f
return(z)
147
2009
e
f
INSA -- Test de Logiciels
148
Evaluation symbolique dynamique
- Simplifications algébriques + traitement “manuel”
[King 76, Howden 76, Coen-Porisini et al. 91, Coward 95]
- Programmation Linéaire mixte –[Clarke 76, Boyer et al. 75]
- Essais de valeurs + retour arrière [Ramamoorthy et al 76]
Problème 1 : hypothèses très fortes sur
les programmes analysés
Problème 2 : choix d’un chemin au préalable
chemin éventuellement non-exécutable !
INSA -- Test de Logiciels
146
X2
a-b-(c-b)2-d-f
Résolution interactive des conditions
2009
INSA -- Test de Logiciels
Par exécution symbolique simple
(analyse arrière de préférence)
w != 0
z= z * x
w= w-1
d
PC c: Y ≥0, w-2 = 0, w-1 != 0
PC a: Y ≥0, abs(Y)-2 = 0,
abs(Y)-1 != 0, abs(Y) != 0
2009
Génération automatique de données de test
Analyse arrière : exemple
PC b: Y ≥0, w = 0
Analyse arrière :
- suivi de Path dans le sens inverse d’exécution
- intéressant pour le calcul de PC car moins coûteux en
place mémoire (State n’est pas calculé)
149
Evaluation symbolique simultanée d’un chemin
concrètement exécuté, avec une donnée de test DT
Le chemin suivi est celui de exec(P,DT)
Implantation par instrumentation de toutes les instructions
Fournit une vue symbolique de PC,
utile pour la mise au point du programme
2009
INSA -- Test de Logiciels
150
Evaluation symbolique globale : principe
Evaluation symbolique globale : exemple
<z1, 1.0>,
<w1, abs(Y)>
Représentation de tous les chemins par un arbre
d’exécution
Nécessite une analyse des boucles (loop analysis) :
∧ PC: Y<0
zk+1 = zk * X
wk+1 = wk - 1
INSA -- Test de Logiciels
b
<zk+1, zk * X>,
<wk+1, wk - 1>
Utile pour la preuve de programme et l’optimisation mais
très coûteux en temps de calcul et en place mémoire
151
échec
2009
∧ PC: Y≥0
<z,1.0>
c
∧ PC: Y<0
∧ PC: Y≥0
<z, 1/zk+1>
<z, zk+1>
w != 0
z= z * x
w= w-1
d
∧ PC: wk+1 = 0
P(short x,y)
short w= abs(y)
double z= 1.0
y<0
z=1.0 / z
return(z)
e
f
INSA -- Test de Logiciels
152
Problems for symbolic evaluation techniques
Propriétes : diagramme commutatif
Programme P, X vecteur d’entrées symboliques, DT donnée
Econc : exécution concrète
Esymb : évaluation symbolique globale
P(X), DT
PC: abs(Y) != 0
z1 = 1.0
w1 = abs(Y)
while( w != 0 )
{
z = z*x ;
w = w-1 ;
}
2009
PC: abs(Y) = 0
a
Number of iterations in loops must be selected prior to any symbolic execution
Arrays
int P(int i) {
P(X), X DT
A[47] = 18;
A[29] = 46;
if ( A[i] < 6 { …
A[47],A[29] et A[i] are seen as a single variable A.
Note that interesting solutions exist for this problem (Coen-Porisini & De Paoli 1993)
Exec. concrète
Eval. symb. glob.
Symbolic execution constrains the shape of dynamically allocated objects
int P(struct cell *t) {
if( t == t->next ) { …
Econc(P(DT)) =
Esymb(P(X)) DT
Esymb(P(X)), DT
t
constrains t to:
key next
?
2009
INSA -- Test de Logiciels
153
Travaux et outils pour l’évaluation symbolique
2009
INSA -- Test de Logiciels
154
On-the-fly selection of feasible paths:
The PathCrawler tool
* PathCrawler/CAVEAT(CEA) Vérification de programmes C
* SYMBAD/SESADA (Université Polytech. de Milan)
Tableaux, Spécialisation de programme ADA
N. Williams, B. Marre, P. Mouy and M. Roger. PathCrawler: Automatic Generation
of Path Tests by Combining Static and Dynamic Analysis. In Proc. Dependable
Computing - EDCC 2005, Budapest, Hungary, April 2005
http://www-list.cea.fr/labos/fr/LSL/test/pathcrawler/index.html
* MulSaw project (MIT) – Model-Checking pour Java
* PREfix, SLAM (Microsoft Reliability Group) -- Détection de
fautes pour C
Addresses the problem of non-feasible paths in path-oriented test data generator
for C programs
Outils commerciaux :
MALPAS (TA Consultancy – UK) – SPADE pour ADA
An (important) emerging idea in CBT: papers in PLDI (Godefroid et al. 2005),
ESEC/FSE (Sen et al. 2005), POPL (Godefroid 2007), …
2009
INSA -- Test de Logiciels
155
A randomized algo. based on dynamic symbolic execution and constraint
satisfaction over finite domains (a proprietary constraint library in Eclipse Prolog)
2009
INSA -- Test de Logiciels
156
An example (1)
The idea
1
1
2
2
3
4
1
1
3
2
f(
{
3
b
4
5
Generate a random input and
dynamic symbolic exec. over
the corresp. feasible path
4
5
Backtrack and try to
solve the remaining CS
return j;
)
j = 2;
if( i ≤ 16 )
j = j * i;
157
1
2009
INSA -- Test de Logiciels
( i = 15448)
2
f
Path 1-3-5
3
f(
{
int i
t
return j;
4
f
j = 2;
if( i ≤ 16 )
j = j * i;
j1=2
i > 16
if( j > 8)
j = 0;
j1 > 8
159
t
4
f
Unsatisfiable, therefore
Path 1-3-4 is non-feasible
2009
An example (4)
INSA -- Test de Logiciels
160
An example (5)
1
j = 2;
if( i ≤ 16 )
j = j * i;
3
return j;
}
2
f
5
INSA -- Test de Logiciels
)
t
Try to solve
)
5
int i
158
1
t
}
f(
{
4
f
An example (3)
if( j > 8)
j = 0;
2009
t
5
INSA -- Test de Logiciels
Random imput generation
int i
3
}
An example (2)
f(
{
2
f
if( j > 8)
j = 0;
If unsatisfiable then path is
non-feasible and problem comes
from the last constraint
Else coverage of feasible
path is improved
2009
t
)
j = 2;
if( i ≤ 16 )
j = j * i;
b
5
Try to solve the CS where
the last constraint is refuted
int i
1
t
Bactrack and try to solve
( i = 2 ) -- Path 1-2-3-5
if( j > 8)
j = 0;
2
f
j1=2
i <= 16
3
f(
{
int i
t
t
)
j = 2;
if( i ≤ 16 )
j = j * i;
Bactrack and try to solve
j1 = 2
i <= 16
j2 = j1*i
if( j > 8)
j = 0;
j2 > 8
2
f
3
t
( i = 10) -- Path 1-2-3-4-5
return j;
4
f
}
return j;
5
2009
INSA -- Test de Logiciels
4
f
All-paths covered with three test
data (i = 15448, i = 2, i = 10)
}
5
161
2009
INSA -- Test de Logiciels
162
Plan
The PathCrawler method: discussion
2. Génération automatique de cas de test
Requires to bound the number of iterations in loops
suitable for automatic test data generation for the All-k-paths criterion
2.1 Test aléatoire
2.2 Test statistique structurel
2.3 Méthode dynamique
2.4 Evaluation symbolique
2.5 Méthode à contraintes
Performance of the method depends on the first initial random input
Numerous extensions to handle pointers as input parameters, logical decisions,
function calls, bit-to-bit operations
2009
INSA -- Test de Logiciels
163
An example of the core problem
int i
if( j > 8)
j = 0
3
f(
{
2
f
int i
t
if( j > 8)
j = 0
value of i to get there ?
f
)
j = 2
if( i ≤ 16 )
j = j * i
4
i > 16 ⇒ j = 2
i ≤ 16 ⇒ j = 2 * i
i ≤ 16, 2 * i > 8
return j
return j
}
}
5 ≤ i ≤ 16
5
2009
164
j>8
t
)
j = 2
if( i ≤ 16 )
j = j * i
INSA -- Test de Logiciels
Intuition of our approach
1
f(
{
2009
INSA -- Test de Logiciels
165
2009
INSA -- Test de Logiciels
166
2.5 Méthode à contraintes
[Bicevskis 79, Gotlieb et al 98]
* Technique d’analyse du GFC orientée-but
Goal-oriented test data generation
A three-step process:
* Transformation systèmatique du problème en un
problème de résolution de contraintes
Generate a constraint model of the whole program
Choose a goal: point to be reached or property to be refuted
Generate a test data that respects the model and satisfies the goal
Useful for generating test data that reach a single testing objective
(reach a statement or a branch, find a counter-example to a property, etc.)
Main tools: InKa (Gotlieb Botella Rueher 2000), GATEL (Marre 2000),
EUCLIDE (Gotlieb 2008)
2009
INSA -- Test de Logiciels
167
2009
INSA -- Test de Logiciels
168
A constraint model of imperative programs
SSA form
Each use of a variable refers to a single definition
Viewing an assignment statement as a relation requires to rename the variables
x1 := x0 + y0;
y1 := x1 – y0;
x2 := x1 – y1;
x := x + y;
y := x – y;
x := x – y;
i2 = i1 + 1
i := i + 1
At the junction nodes
1
Static Single Assignment (SSA) form (Cytron 1991)
or single assignment language
i := ...
3
2009
INSA -- Test de Logiciels
169
SSA : example
a
b
c
PSSA(short x,y)
w1= abs(y)
z1= 1.0
P(short x,y)
short w= abs(y)
double z= 1.0
a
w != 0
b
w3 =φ( w1,w2)
z3 = φ( z1,z2)
w3 != 0
d
y<0
z= z * x
w= w-1
d
z2 = z3 * x
w 2= w 3 - 1
c
y<0
z=1.0 / z
e
e
z5 = φ(z4,z3)
return(z5)
return(z) f
2009
ush
3
... := i + ...
J 2 = J1 * I
I = J
I < J
Conditionnal (SSA)
If D then C1; else C2; v3=φ(v1,v2)
i3 := φ( i1,i2)
... := i3 + ...
INSA -- Test de Logiciels
170
- élimine les anti-dépandences (chemins_ud) et les
dépandences-de-sortie (chemins_dd)
D = définitions de x,
U = utilisations de x
le nombre de chemins_du par rapport à x est
en O(|D|x|U|) dans P, en O(|A|) dans PSSA
Nota: attention, |Var(PSSA)| >> |Var(P)|
INSA -- Test de Logiciels
Utilisation des
dépendances de contrôle
= ensemble de conditions à vérifier
pour atteindre e
Arithmetical constraints {=, <,..}
j2 = j1 * i
i == j
i < j
172
Cond1
t
Cond2
t
t
(D /\ C1 /\ v3=v1) \/ (¬D /\ C2 /\ v3=v2)
Nota : calculable syntaxiquement si
le programme est structuré
v3=v1 \/ (D1 /\ C1 /\ ¬D2 /\ v3=v2 ) \/ …
173
Ce = ¬ Cond4 ∧ Cond2 ∧ Cond1
2009
INSA -- Test de Logiciels
Cond3
f
Cond4
t
INSA -- Test de Logiciels
i2 := ..
2
Testing objective (1)
I ∈ 0 .. 232-1
Assignment, decision
2009
i1 := ...
Domain constraint
i
Iteration (SSA)
v3=φ(v1,v2) while D do C
1
- SSA autorise la commutativité des instructions
f
Constraint system
Variable declaration
i := ...
- les GFCs (N,A,e,s) de P et de PSSA sont identiques
2009
SSA form
2
Forme SSA : propriétés
- si
alors
z4 =1.0 / z3
φ_functions
f
e
174
Testing objective (2)
Problems for goal-oriented test data generation
- Constraint solving over disjunctions of constraints is required
(conditionals, switch, iterations)
- In functional testing, property to be refuted (e.g. a post-condition of the program)
- Conditional aliasing problems
Ex: JML specification of method debit() from the SUN’s Wallet Java Card program
//@ requires amount >= 0;
ensures balance == \old(balance) – amount;
signals (DebitException) amount > balance;
@*/
public void debit(int amount) {...}
How to reach branch 5-6 ?
1.
2.
3.
4.
5.
6.
Ce = ¬( balance = old_balance – amount)
...
if( C )
p = &i ;
i = 10 ;
*p = 0 ;
if( i < 5 )
...
« reaching branch 5-6 » ⇒ « p points to i at statement 4 » ⇒ « C is satisfied »
2009
INSA -- Test de Logiciels
175
2009
INSA -- Test de Logiciels
176
Bibliographie (sélective) pour ce cours
InKa: a goal-oriented test data generator
based on constraint combinators
[King 76]
« Symbolic Execution and Program Testing »
Communications of ACM Vol 19, N°7, Jul. 1976
Automatic Test Data Generation using Constraint Solving Techniques
A. Gotlieb, B. Botella, M. Rueher
[Clarke 76]
«A System to Generate Test Data and Symbolically Execute Programs »
IEEE Trans. on Software Engineering SE-2 N°3 Sep. 1976
[Bicevskis, Borzovs, Straujums,Zarins,Miller 79]
«SMOTL – A System to Construct Samples for Data Processing Program
Debugging»
IEEE Trans. on Software Engineering SE-5 N°1 Jan. 1979
2009
INSA -- Test de Logiciels
177
ACM International Symposium on Software Testing and Analysis (ISSTA'98), Clearwater
Beach, FL USA, March 1998
Addresses the problem of loops, non-feasible paths, floating-point numbers and pointer
aliasing in goal-oriented test data generator for C programs
A deterministic algo. based on SSA, Constraint combinators over finite domains
(built over SICStus clp(fd) constraint library)
More than 10 years of Research, three prototype tools, fifteen published papers
2009
178
Conditional: the combinator ite
Modelling an error-free semantics
0
The constraint model of programs does not have to handle
errors or exceptions as it is targeted to generate test data for detecting
functional faults
int f( int x, int y) {
return( x / y )
}
INSA -- Test de Logiciels
Then_part
v := Decision ;
if(v)
2
1
Else_part
3
R=X/Y
Executing f with (x=1, y=0) throws an exception while the constraint
R = X / Y just removes 0 from the domain of Y. Therefore, the possible erroneous
execution is not considered by the constraint model. This is ok as the goal of CBT
is to detect functional faults and not runtime errors !
ite( V, CTHEN, CELSE, MIN, MOUT) :• V=1
→ CTHEN ∧ MOUT = MTHEN
• V=0
→ CELSE ∧ MOUT = MELSE
• ¬(V=1∧ CTHEN∧ MOUT = MTHEN) → V=0 ∧ CELSE∧ MOUT = MELSE
• ¬(V=0∧CELSE∧ MOUT = MELSE) → V=1 ∧ CTHEN∧ MOUT = MTHEN
• MOUT := Proj(OUT, MTHEN ∪ MELSE)
2009
INSA -- Test de Logiciels
179
2009
MIN := Proj(IN, MTHEN ∪ MELSE)
INSA -- Test de Logiciels
180
Iteration: the combinator w
2
1
Example (1)
V := Decision ;
while( V )
Body
f(
{
3
I ∈ 0 .. 232-1,
J1 = 2,
ite( I ≤ 16, J2 = J1 * I ∧ J3 = J2,
RET = J5.
return j;
}
Where ∇ stands for a widening operator
INSA -- Test de Logiciels
181
Example (2)
2009
INSA -- Test de Logiciels
I=4
Impossible
1≤I≤4 ?
f(
{
I ∈ 0 .. 232-1,
J1 = 2,
ite( I ≤ 16,
J2 = J1 * I ∧ J3 = J2, J3 = J1),
ite( J3 > 8, J4 = 0 ∧ J5 = J4, J5 = J3),
RET = J5.
int i
RET = 8 ?
RET = 12 ?
INSA -- Test de Logiciels
Test datum: I = 10
)
j = 2;
if( i ≤ 16 )
j = j * i;
if( j > 8)
j = 0;
return j,
}
2009
182
Example (3)
5 ≤ I ≤ 16
RET = 2
J3 = J1),
ite( J3 > 8, J4 = 0 ∧ J5 = J4, J5 = J3),
if( j > 8)
j = 0;
• ¬(V=1 ∧ CBODY ) → V=0 ∧ MOUT=MIN
• ¬(V=0 ∧ MOUT=MIN)→ V=1 ∧CBODY ∧ w(V,CBODY,MBODY,MOUT)
• MOUT := Proj(OUT, MBefore ∇ MBody)
MIN := Proj(IN, MBefore ∇ MBody)
I = 18 ?
)
j = 2;
if( i ≤ 16 )
j = j * i;
w(V, CBODY, MIN,MOUT) :• V=1 → CBODY ∧ w(V, CBODY,MBODY,MOUT)
• V=0 → MOUT = MIN
2009
int i
I ∈ 0 .. 232-1,
J1 = 2,
ite( I ≤ 16,
J2 = J1 * I ∧ J3 = J2,
J3 = J1),
ite( J3 > 8, J4 = 0 ∧ J5 = J4, J5 = J3),
RET = J5.
J3 > 8 ?
2 ≤ RET ≤ 8
183
2009
INSA -- Test de Logiciels
184
Extensions (in CELTIQUE)
The InKa method: discussion
Handling conditional pointer aliasing problems
constraint-based test data generation for pointer programs
(Gotlieb Denmat Botella COMPSAC’05, ASE’05, IST’07)
Handles nicely conditonals and loops
Handling floating-point numbers in constraint-based structural test data
generation (Botella Gotlieb Michel STVR 2006)
First introduction of constraint satisfaction techniques in
structural software testing
Efficient handling of conditional and iterations based on Abstract Interpretation
techniques (Denmat Gotlieb Ducassé CP 2007)
Suitable for generating test data in front of a single testing objective
(to complete an existing test suite)
Efficient implemention in progress (access through a web service) :
EUCLIDE (Gotlieb ICST 2009)
Can be stucked on infinite loops (time-out required)
also http://euclide.gforge.inria.fr/
2009
INSA -- Test de Logiciels
185
2009
INSA -- Test de Logiciels
186
Récapitulatif des techniques pour le test structurel
Eval. symbolique
Conclusions sur cette partie du cours
- Test et preuve sont complémentaires
- Par essence, le test est une recherche de contre-exemples
- Test structurel et fonctionnel sont complémentaires
Test statistique
- Techniques de génération de cas de test variées
Méthode à
contraintes
- Apport fondamental des « Contraintes » au domaine du Test
Méthode
dynamique
2009
INSA -- Test de Logiciels
187
Plan complet du cours
2009
INSA -- Test de Logiciels
188
Génération automatique de données de test (1)
0. Préliminaires
1. Test logiciel : principes
Techniques élémentaires
2. Génération automatique de test
- Test exhaustif
- Test par échantillions
- Test aléatoire
3. Techniques de test fonctionnel
4. Test de logiciel orienté-objet
5. Test à partir de modèles
2009
INSA -- Test de Logiciels
189
2009
INSA -- Test de Logiciels
190
Test exhaustif : limitation et intérêt
Test exhaustif
- Mais, généralement impraticable !
Dom(P)
P (ush x1, ush x2, ush x3)
{ ... }
232 possibilités × 232 possibilités × 232 possibilités = 296 possibilités
- Parcours exhaustif du domaine d’entrée des programmes
- Séléction de toutes les données de test possible
ex d’objectif : atteindre une instruction dans le programme
- Equivalent à une preuve de correction du programme
2009
INSA -- Test de Logiciels
- Estimation de la taille de l’espace de recherche
face à un objectif de test
191
2009
INSA -- Test de Logiciels
192
Test par échantillion
Test aléatoire
Dom(P)
Loi de probabilité uniforme sur le domaine d’entrée
(i.e. chaque DT est équiprobable)
X5 X6
X1 X2 X3
X4
- Utilisation de générateurs de valeurs pseudo-aléatoires
Forme faible du test exhaustif : test par échantillion
Exemples :
{0, 1, 2, 232-1} pour un ush
{NaN, -INF,-3.40282347e+38, -1.17549435e-38, -1.0, -0.0,.. }
pour un float (IEEE 754)
2009
INSA -- Test de Logiciels
193
- Nécessité de disposer d’un oracle automatique
- Condition d’arrêt à déterminer (nombre de DT à générer,
critère de test couvert)
2009
- Procédé de sélection de données de test
- Induit parfois une « partition » sur le domaine d’entrée
Génération d’une seule donnée de test
par élément à vérifier !
(ex : chemins de P)
j
Dom(P)
Dom(P)
X4
C1∧¬C2
C1∧C2
if( C2)
else ...
}
¬C1∧¬C2
X1
X2
X3
¬C1∧ C2
i
2009
INSA -- Test de Logiciels
195
Couverture probabiliste du critère C
X5
X4
196
A2
A1
A3
SC = {A1,..,A4}
A4
X6
X8
INSA -- Test de Logiciels
Dom(P)
X2
X7
2009
p{x∈A} : probabilité qu’une DT aléatoire x couvre l’élément A
Dom(P)
X1
Repose sur une hypothèse d’uniformité :
une seule donnée de test suffit pour tout le sous-domaine
Efficacité du test aléatoire pour couvrir un critère ?
Génération aléatoire de données de test
selon une distribution de probabilités
(ou profil d’entrée)
2009
194
Couverture déterministe d’un critère C
Critère de sélection C
P(int i,int j)
{
if( C1 )
else ...
INSA -- Test de Logiciels
X3
INSA -- Test de Logiciels
197
Ici p{x∈A1} < p{x∈A2} < p{x∈A3} < p{x∈A4} donc le
test aléatoire couvre « mieux » A4 que A1, ce qui n’est
pas2009
satisfaisant !
TestINSA
statistique
structurel [Thévenod19890]
-- Test de Logiciels
Génération automatique de données de test (2)
« The program reads three integer values from a card. The
three values are interpreted as representing the lengths of
the sides of a triangle. The program prints a message that
states whether the triangle is scalene, isocele, or
equilateral »
[Myers 79]
Techniques de test fonctionnel
- Analyse partitionnelle
- Test aux limites
- Test à partir de Graphes Cause/Effet
2009
INSA -- Test de Logiciels
Ecrire un jeu de test que vous sentez être adéquate pour
tester ce programme
199
Quelques remarques générales sur le test fonctionnel
- Génération de données de test + oracle pour ces
données (à la différence du test structurel)
n
pass / fail
INSA -- Test de Logiciels
201
Analyse partitionnelle (2)
- Division du domaine d’entrée en classes valides et invalides
- Choix d’un représentant dans chacune des classes
d’équivalence
- Existence de règles générales de découpage (non uniques)
a ≤ 0, a> 0 ou a<0, a=0,a>0
∅, [a,b] où a < b < ∞, [-∞,+∞]
∅, {a}, {a,b}, {a,b,c}, ...
nil, a
, ...
nil nil
INSA -- Test de Logiciels
et
∀i, j ∈1..n, Ci ∩Cj = ∅
i=1
2009
INSA -- Test de Logiciels
202
Partitionnement unidimensionnel
- Permet au testeur de passer d’un nombre infini de données
à un nombre fini et limité de données de test
2009
Analyse partitionnelle (1)
U Ci = D
i
Exécution
des tests
200
- Soit D le domaine d’entrée, {C1,..,Cn} est une
partition de D ssi :
implementation
Entier
:
Intervalle :
Ensemble :
Arbre bin. :
INSA -- Test de Logiciels
- Idée : Découper le domaine d’entrée en classes
d’équivalence : ensembles d’entrées aboutissant
au même comportement fonctionnel
Génération
de tests
Jeu de test
2009
2009
- Technique de test majoritairement employé en
présence de spécifications informelles
spécifications
Correction ?
Un test pour soi-même
203
Considérer une variable à la fois. Ainsi, chaque variable
d’entrée du programme conduit à une partition du
domaine d’entrée. Cette méthode est appelée
partitionnement unidimensionnel
Ce type de partitionnement est le plus utilisé (et le plus
simple à mettre en oeuvre). Néanmoins, il n’exerce pas
certaines combinaisons pouvant conduire à détecter
des fautes
2009
INSA -- Test de Logiciels
204
Partitionnement multidimensionnel
Partitionnement unidimensionnel : example
Considérer le domaine d’entrée comme le produit
Cartésien des domaines de chaque variable d’entrée.
Cette méthode conduit à la création d’une unique
partition. Cette méthode est appelée partitionnement
multidimensionnel.
PGCD(ENTIER a, ENTIER b)
Classes valides
C1 : a = 0,
C2 : a > 0,
D1 : b = 0,
D2 : b > 0
Grand nombre de cas de test, difficiles à gérer
manuellement. Cependant, bien que certaines classes
créées puissent être invalides, cette méthode offre une
grande variété de cas de test.
2009
INSA -- Test de Logiciels
205
PGCD(ENTIER a, ENTIER b)
2009
INSA -- Test de Logiciels
206
L’expérience montre que les programmeurs font
souvent des erreurs aux bornes des classes
d’équivalence
Classes valides
C1 : a = b = 0
C2 : a = b, a > 0, b > 0
C3 : a >= 0, b >= 0, a ≠ b
Par exemple, si le programme P est sensé calculer
une fonction F1 lorsque x<0 est vraie et calculer F2
sinon et qu’il calcule F1 uniquement lorsque x< -1
alors P contient une faute qui peut ne pas être
révelée par une analyse partitionnelle (x ≤ 0, x > 0
ou x<0, x=0, x>0).
Classes invalides
C4 : a < 0, b < 0
C5 : a < 0, b > 0
C6 : a > 0, b < 0
INSA -- Test de Logiciels
Classes invalides
C3 : a < 0,
D3 : b < 0
Erreurs aux limites
Partitionnement multidimensionnel : example
2009
Problème :
a = b = 0 appartient à C1 et à D1
207
Test aux limites
2009
INSA -- Test de Logiciels
208
Test aux limites de l’intervalle [1,100]
1
- Idée : Identification des données de test « limites » définies
par la spécification suite à l’analyse partitionnelle
0
- Sélection de données de test aux bornes valides et
invalides
1
100
2
99 100
101
Mais combinatoire importante en présence de vecteurs
d’entrées
définition de voisinages discrets
- Formalisation de la notion de limite difficile dans le cas
général
heuristiques de choix des valeurs
Ecrire des définitions possibles de voisinages discrets
d’1 point en dimension 2, puis généralisez en dimension n
2009
INSA -- Test de Logiciels
209
2009
INSA -- Test de Logiciels
210
Graphes cause-effet : example (1)
Graphes cause-effet
- Idée : Réseau logique qui relie les effets d’un programme
(sorties) à leurs causes (entrées)
4 types de symboles :
Analyse des causes :
A1 : le caractère de la première colonne est A
A2 : le caractère de la première colonne est B
A3 : le caractère de la deuxième colonne est un chiffre
Analyse des effets :
M1 : programme ok
M2 : message X12
M3 : message X13
négation
identité
~
OU logique
ET logique
∨
∧
2009
« Le caractère dans la colonne 1 doit être un A ou un B.
Dans la colonne 2, il doit y avoir un chiffre. Si le premier
caractère est erroné, le message d’erreur X12 doit être
imprimé. Si dans la colonne 2 nous n’avons pas de
chiffre, alors le message X13 est imprimé »
INSA -- Test de Logiciels
211
Graphes cause-effet : example (2)
2009
INSA -- Test de Logiciels
212
Graphes cause-effet : génération de cas de test
- Causes et effets sont vus comme des variables booléennes
~
A1
∨
Analyse des causes :
A1 : le car de col 1 est A
A2 : le car de col 1 est B
A3 : le car de col 2
est un chiffre
Analyse des effets :
M1 : programme ok
M2 : message X12
M3 : message X13
M2
E
A2
∧
~
A3
2009
M1
M3
213
Matrice de décision
~
∨
∧
~
A3
2009
A1 et A2 vrais où A1 : le car de col 1 est A
A2 : le car de col 1 est B
2009
INSA -- Test de Logiciels
214
Génération de cas de test concrets
M2
E
A2
- Elimination des combinaisons invalides : «comportements
inobservables» (représentées par une contrainte sur le
graphe cause effet)
Par ex:
INSA -- Test de Logiciels
A1
- Génération automatique d’une matrice de décision
(matrice booléenne, Vrai : 1 Faux : 0)
à partir du graphe cause-effet
Cause A1 A2 A3 M1 M2 M3
-effet
CT 1
0 0 0 0
1
1
CT 2
M1
M3
0
0
1
0
1
0
CT 3
0
1
0
0
0
1
CT 4
0
1
1
1
0
0
CT 5
1
0
0
0
0
1
CT 6
1
0
1
1
0
0
INSA -- Test de Logiciels
215
CT 1
A1 A2 A3 M1 M2 M3
0 0 0 0
1
1
CT 2
0
0
1
0
1
0
« C1 », X12 émis
CT 3
0
1
0
0
0
1
« Bz », X13 émis
CT 4
0
1
1
1
0
0
« B3 », ok
CT 5
1
0
0
0
0
1
« Ak », X13 émis
CT 6
1
0
1
1
0
0
« A4 », ok
Analyse des causes :
A1 : le car de col 1 est A
A2 : le car de col 1 est B
A3 : le car de col 2
est un chiffre
2009
« Ca », X12, X13 émis
Analyse des effets :
M1 : programme ok
M2 : message X12
M3 : message X13
INSA -- Test de Logiciels
216
Réduction de la combinatoire
Technique de réduction sur le graphe cause-effet
- Si n = nombre de causes, m = nombre d’effets
alors matrice de décision de taille 2n x (n+m)
dans le pire cas
ne peut-être gérée automatiquement
si n est grand (> 30)
- Comment réduire la combinatoire ?
~
A1
∨
M2
E
A2
Idée : Eliminer les CT redondants en identifiant ceux
ayant des comportements similaires (mêmes effets) bien
qu’ayant des causes différentes
Par construction,
(A1 = 1, A2 = 1)
(A1 = 1, A2 = 0)
(A1 = 0, A2 = 1)
conduisent à E = 1 et
aux mêmes effets
∧
~
A3
M1
Seul un des trois est choisi
M3
Règles similaires pour les autres
connecteurs
Ex: CT3 et CT5
2009
INSA -- Test de Logiciels
217
Exercice :
INSA -- Test de Logiciels
218
Exercice (2):
The Sendfile command.
In a given network, the sendfile command is used to send a file to a
user on a different file server. The sendfile command takes three
arguments: the first argument should be an existing file in the
sender’s home directory, the second argument should be the name
of the receiver’s file server, and the third argument should be the
receiver’s userid. If all the arguments are correct, then the file is
successfully sent ; otherwise the sender obtains an error message.
INSA -- Test de Logiciels
1) Modéliser en premier lieu le distributeur sans alarme avec un graphe cause-effet
Puis modéliser le distributeur complet avec alarmes.
3) Réduire la matrice et générer quelques
cas de test représentatifs
219
Modélisation sans alarme
Causes :
C0 = Appuyer sur la touche t1
C1 = Appuyer sur la touche t2
C2 = Appuyer le verre contre la gâchette
Considérons un distributeur de boissons.
Cet appareil comporte 2 touches lumineuses pour le choix du genre de boisson
désiré. Chacune d'elles clignote s'il n'y a plus de boisson dans le réservoir
correspondant et, dans ce cas, une alarme est émise durant 20 secondes, toutes les 3
minutes. L'alarme est automatiquement inhibée au bout de 15 minutes. Pour que la
distribution ait lieu, il faut appuyer sur une touche valide, puis appuyer le verre contre
la gâchette, sous l'orifice. L'écoulement s'arrête et la touche s'éteint lorsque le verre
n'est plus appuyé. Il se peut toutefois que cette dernière reste appuyée ou que le
liquide déborde du verre. En s'écoulant, le liquide traverse une grille et est recueilli
dans un récipient. Si ce dernier se remplit l'alarme est activée, comme ci-dessus.
2) Générer une matrice de décision
1. Modéliser cette commande avec un graphe cause-effet
2. Générer une matrice de décision
2009
2009
2009
INSA -- Test de Logiciels
220
Modélisation avec alarme
Causes :
C0 = Appuyer sur la touche t1
C1 = Appuyer sur la touche t2
C2 = Appuyer le verre contre la gâchette
C3 = Plus de boisson dans le réservoir
C4 = Récipient plein
Effets :
E0 = la boisson demandée coule
E1 = la touche t1 s’éteint
E2 = la touche t2 s’éteint
C0
∧
∧
Effets :
E0 = la boisson demandée coule
E1 = la touche t1 s’éteint
E2 = la touche t2 s’éteint
E3 = Alarme activée
C0
E0
∧
~
∧
∧
E0
C3
∧
C1
~
C2
2009
~
INSA -- Test de Logiciels
E3
C1
E1
C4
∧
C2
E2
221
2009
~
∧
~
~
~
INSA -- Test de Logiciels
∧
E1
E2
222
Matrice de décision
C0
Regroupement fonctionnel et cas de test
C1
C2
C3
C4
E0
E1
E2
E3
CT 1 0
0
0
0
0
0
0
0
0
CT 2 0
0
0
0
1
0
0
0
1
CT 3 0
1
1
1
0
0
0
0
1
Causeeffet
CT 4 1
0
1
0
0
1
0
0
0
CT 5 1
0
0
0
0
0
1
0
0
Caus
eeffet
C0
C1
C2
C3
C4
E0
E1
E2
E3
CT 1
0
0
0
0
0
0
0
0
0
CT 2
0
0
0
0
1
0
0
0
1
CT 3
0
1
1
1
0
0
0
0
1
CT 4
1
0
1
0
0
1
0
0
0
CT 5
1
0
0
0
0
0
1
0
0
…
…
2009
INSA -- Test de Logiciels
223
Plan du cours d’aujourd’hui
INSA -- Test de Logiciels
224
Langages OO : objets qui modélisent un problème
et collaborent entre eux pour trouver une solution
-> les techniques de test utilisées pour les
programmes impératifs doivent être adaptées pour
prendre en compte les spécificités des langages OO
Model-Based Testing
INSA -- Test de Logiciels
t1 est appuyée et la gâchette
enfoncée
la boisson coule
Langages impératifs : fonctions qui transforment
des entrées en sortie
2. Test de logiciel orientés-objet
2009
Fonctionnellement équivalents
Langages orientés objet / langages impératifs
1. Techniques de test élémentaires
3.
2009
Le récipient est plein
L’alarme se déclenche
225
Langages OO et test : un aperçu des
difficultés
2009
INSA -- Test de Logiciels
226
References
Encapsulation des données
Comment connaître les états internes des objets dont les attributs
sont privés ?
[1] Testing Object-oriented Systems,
Models, Patterns, and Tools,
Robert V. Binder, 2000, Addison-Wesley
Dépendances fortes entre certaines classes
Dans quel ordre tester les classes ?
Que tester dans une classe qui hérite d’une autre ?
Polymorphisme
Plusieurs parties de code peuvent “se cacher” derrière un appel
de méthode polymorphe
2009
INSA -- Test de Logiciels
227
[2] A Practical Guide to Testing
Object-Oriented Software,
John D. McGregor et David A. Sykes,
2001, Addison-Wesley
2009
INSA -- Test de Logiciels
228
Principe du test de classe
Partie 1
Unité = la classe
Augmente la confiance que l’on a dans l’implémentation des unités
Vérifie que l’implémentation d’une classe répond à sa
spécification
-> si l’implémentation de la classe est correcte, chaque instance de
la classe devrait fonctionner correctement
Test de classe
2009
INSA -- Test de Logiciels
Une fois les classes testées séparément : les erreurs lors de
l’intégration de la classe sont plus probalement liées à un interfaçage
incorrect des unités qu’à une implémentation incorrecte de cette
classe
229
Pour chaque classe, décider si on la teste :
comme une unité
comme un composant d’une partie plus large du système
Facteurs de décision :
Rôle de la classe dans le système, degré de risque associé
Complexité de la classe
⌧Nombres d’états, d’opérations, associations avec les autres
classes
Effort à fournir pour tester la classe
Illustration : si la classe fait partie d’une librairie, la tester
intensivement même si tester coûte cher / prend du temps
INSA -- Test de Logiciels
231
Comment tester ?
Avant l’intégration de la classe
Test de régression après tout changement de code
Modification de code liée à un bug : des cas de test doivent
être ajoutés ou modifiés pour détecter ce bug lors des tests
futurs
2009
INSA -- Test de Logiciels
232
Le développeur est susceptible de faire des erreurs
d’interprétation de la spécification
N’utiliser que le code pour identifier les cas de test risque de
propager ces erreurs
Un script de test :
crée des instances de classe et un environnement ;
envoie un message à une instance ;
vérifie le résultat de ce message : valeur retournée, état
de l’instance, modification des paramètres d’entrée, valeur
des attributs statiques de la classe ;
Si langage avec gestion mémoire, détruit les instances
INSA -- Test de Logiciels
créées.
230
Comment choisir des cas de test pertinents ?
Construction d’un script de test qui exécute les cas de test
pour une classe et collecte les résultats des exécutions
2009
INSA -- Test de Logiciels
Quand tester ?
Quelles classes tester ?
2009
2009
233
Méthode préconisée :
créer des cas de test à partir de la spécification ;
augmenter la suite de tests selon l’implémentation.
Remarque : pour le reste de cette partie 1, nous nous
restreignons au test de classes dites primitives, c’est à dire
indépendantes des autres classes.
2009
INSA -- Test de Logiciels
234
Utilisation des preconditions
Utilisation des pre- et postconditions
Precondition en OCL
Contribution
Objectif : définir des cas de test pour une méthode à partir de ses
pre- et postconditions
true
(true,Post)
pre1
(pre1,Post)
(not pre1,Exception)●
Idée générale :
déterminer toutes les combinaisons possibles de situations pour
lesquelles une précondition peut être vérifiée et une postcondition
peut être atteinte ;
créer des cas de test pour couvrir ces situations avec des valeurs
spécifiques, incluant des valeurs typiques et des valeurs aux
limites ;
dans le cas d’une programmation de type défensive, prévoir aussi
des cas où les préconditions ne sont pas respectées
not pre1
(not pre1,Post)
(pre1,Exception) ●
pre1 and pre2
(pre1 and pre2,Post)
(not pre1 and pre2, Exception) ●
(pre1 and not pre2, Exception) ●
(not pre1 and not pre2, Exception) ●
pre1 or pre2
(pre1,Post)
(pre2,Post)
(pre1 and pre2, Post)
(not pre1 and not pre2, Exception) ●
2009
INSA -- Test de Logiciels
235
pre1 xor pre2
pre1 implies pre2
If pre1 then pre2
else pre3 endif
2009
Contribution
Postconditions en OCL
(pre1 and not pre2, Post)
(not pre1 and pre2, Post)
(pre1 and pre2, Exception) ●
(not pre1 and not pre2, Exception) ●
post1
(Pre, post1 and post2)
(not pre1,Post)
(pre2,Post)
(not pre1 and pre2, Post)
(pre1 and not pre2, Exception) ●
(Pre, post1)
(Pre, post2)
(Pre, post1 and post2)
post1 xor post2
(Pre, post1 and not post2)
(Pre, not post1 and post2)
(pre1 and pre2,Post)
(not pre1 and pre3,Post)
(pre1 and not pre2, Exception) ●
(not pre1 and not pre3, Exception) ●
post1 implies post2
(Pre, not post1 or post2)
If post1 then post2
else post3 endif
(Pre and ◘, post2)
(Pre and not ◘, post3)
avec ◘ une condition qui rend post1 vraie
au moment où s’applique la postcondition
237
Exercice: bâtir des cas de test pour la classe Velocity,
dans le cadre d’une Programmation Défensive
Velocity()
Velocity(speed : int, dir:int)
getSpeed() : int
getSpeedX(): int
getSpeedY(): int
getDirection() : int
setSpeed(speed : int);
setDirection(dir : int);
reverse();
reverseY();
reverseX();
Velocity::setDirection(dir:int)
pre : 0<=dir and dir<360
post : direction=dir and speed=speed@pre
Exemple extrait de [2]
INSA -- Test de Logiciels
2009
INSA -- Test de Logiciels
238
Critères de test basés sur le flot de contrôle
Critères pour le test de programmes impératifs sont
applicables
Couverture de toutes les instructions
Couverture de toutes les branches
Etc.
Velocity::reverseX()
pre : true
post : speed = speed@pre and direction =
if direction@pre<=180
then (180 – direction@pre)
else (540-direction@pre)
θ
2009
Contribution
(Pre,post1)
post1 or post2
INSA -- Test de Logiciels
Velocity
236
post1 and post2
● Dans le cas d’une programmation défensive
speed : int
direction : int
● Dans le cas d’une programmation
défensive
INSA -- Test de Logiciels
Utilisation des postconditions
Utilisation des preconditions (suite)
Precondition en OCL
2009
Mais, des critères spécifiques et mieux adaptés peuvent
être définis
X
239
2009
INSA -- Test de Logiciels
240
Exemple d’un critère de test basé sur le flot des
données
Soient mj et mk des méthodes appelées
par la méthode m
Soient :
v : variable d’instance
ij : instruction de la méthode mj
qui définit v
ik : instruction de la méthode mk
qui utilise v
Partie 2
mj{
…
ij
…
}
m k{
…
ik
…
}
Test d’intégration
c
Le critère est couvert si :
(v, ij, ik) faisable, un cas de test pour m qui sensibilise
un chemin c entre ij et ik sans redéfinition de v
E
A
2009
INSA -- Test de Logiciels
241
2009
INSA -- Test de Logiciels
242
Analyse de dépendances
Notion de bouchon de test
Bout de code sans fonctionnalité qui vise à remplacer un code
fonctionnel
Exemples de dépendances entre classes :
Invocation de méthode de B dans A
Objets B utilisés en tant que paramètres de
méthodes de A
Héritage (cf partie 3)
Utile lorsque le code fonctionnel n’est pas disponible, ou en test
d’intégration pour tester unitairement les méthodes
Ex: int m(int a, int b) {return 0;} à la place de
int m(int a, int b) {if(…) return(f(a)) else return(f(b));…}
Créer un graphe de dépendances
L’utilisation de bouchons est une pratique courante, en test
croisé de logiciels embarqués (cibles non dispo.) et en test de
logiciels OO (composants non dispo.)
2009
INSA -- Test de Logiciels
243
INSA -- Test de Logiciels
244
Analyse de dépendances: graphe de dépendances
Analyse de dépendances: diagramme de classes
Has Unique ►
2009
AcctNum
FinancialService
Has ►
0..*
Account
Transaction
Uses
2..*
Account
Applied to ▲
FinancialService
0..*
Provided as ►
Transaction
Uses
Rates
Money
Money
AcctNum
utilise
Array[Int]
0..*
In Effect for ▲
Posted for ▼
1..1
Rates
Extrait de [1]
2009
INSA -- Test de Logiciels
245
2009
INSA -- Test de Logiciels
246
Intégration Bottom-Up
Intégration Bottom-Up
Méthode d’intégration recommandée pour les programmes objets
L’intégration débute par les composants qui sont les plus
indépendants
2009
Script de test
Script de test
bouchon
bouchon
composant sous test
composant sous test
interface sous test
interface sous test
composant testé
composant testé
Interface testée
Interface testée
INSA -- Test de Logiciels
247
Intégration Bottom-Up
2009
248
Script de test
Script de test
bouchon
bouchon
composant sous test
composant sous test
interface sous test
interface sous test
composant testé
composant testé
Interface testée
Interface testée
INSA -- Test de Logiciels
INSA -- Test de Logiciels
INSA -- Test de Logiciels
Intégration Bottom-Up
249
Intégration Bottom-Up
2009
2009
2009
INSA -- Test de Logiciels
250
Intégration Bottom-Up
Script de test
Script de test
bouchon
bouchon
composant sous test
composant sous test
interface sous test
interface sous test
composant testé
composant testé
Interface testée
Interface testée
251
2009
INSA -- Test de Logiciels
252
Intégration Bottom-Up
Intégration Top-down
Avantages :
Possibilité de débuter l’intégration dès qu’un composant de
niveau feuille dans le graphe de dépendance est prêt
Pas d’écriture de bouchons
Méthode d’intégration privilégiant le test des composants des
niveaux les plus élevés de l’arbre de dépendance
Inconvénients :
Beaucoup de scripts de test à écrire
Si un composant proche des feuilles dans le graphe est
modifié, certains tests de composants qui en dépendent
doivent être ré-exécutés
Le composant principal du système est souvent à la racine
du graphe. Il est testé en dernier et risque de ne pas être
assez testé si le temps manque.
2009
INSA -- Test de Logiciels
253
Intégration Top-down
2009
composant sous test
interface sous test
composant testé
Interface testée
2009
INSA -- Test de Logiciels
254
Script de test
Script de test
bouchon
bouchon
composant sous test
composant sous test
interface sous test
interface sous test
composant testé
composant testé
Interface testée
Interface testée
INSA -- Test de Logiciels
INSA -- Test de Logiciels
bouchon
Intégration Top-down
255
Intégration Top-down
2009
Script de test
2009
INSA -- Test de Logiciels
256
Intégration Top-down
Script de test
Script de test
bouchon
bouchon
composant sous test
composant sous test
interface sous test
interface sous test
composant testé
composant testé
Interface testée
Interface testée
257
2009
INSA -- Test de Logiciels
258
Intégration Top-down
Intégration Top-down
Avantages :
Possibilité de tester tôt les composants les plus dépendants
(les plus hauts dans l’arbre de dépendance)
⌧démonstration des fonctionnalités des composants de haut
niveau disponible rapidement
Script de test
bouchon
Peu de scripts de test à écrire
composant sous test
interface sous test
Test de non régression systématique à chaque ajout de
composant
composant testé
Interface testée
2009
INSA -- Test de Logiciels
259
Intégration Top-down
2009
INSA -- Test de Logiciels
260
Cas de dépendances cycliques
Inconvénients :
Beaucoup de bouchons à écrire
Le graphe de dépendance peut comporter des composantes
fortement connexes
A
L’ajout d’une contrainte (ex : précondition) à un composant
proche des feuilles peut rendre nécessaires des changements
dans le code de beaucoup de composants qui en dépendent
Difficulté d’atteindre une forte couverture des critères de test
pour les composants les plus bas dans l’arbre. Ils ne sont
testés que dans le contexte de l’application sous test.
2009
INSA -- Test de Logiciels
261
C
B
Possibilité 1 : intégration Big-Bang
Principe : tester toutes les classes ensemble. Les dépendances
ne sont pas exploitées pour définir un ordre de test.
Avantage : nombre d’exécutions de cas de test limité
Inconvénient : en cas d’erreur, toutes les classes sont aussi
susceptibles les unes que les autres de l’avoir provoquée.
2009
INSA -- Test de Logiciels
262
Cas de dépendances cycliques
Partie 3
Possibilité 2 : utilisation de bouchons
A
C
Bouchonnage minimal
B
A
C’
Bouchon spécifique
C’A
A
C’B
B
C
Test en présence
d’héritage
C
B
Avantage : intégration progressive des composants
Inconvénient : écriture de bouchons
2009
INSA -- Test de Logiciels
263
2009
INSA -- Test de Logiciels
264
Utilisation de l’héritage pour le test
Héritage de cas de test
Principe: si une classe a déjà été testée alors l’effort de test pour
les classes qui en héritent peut s’en trouver réduit
Hypothèse : le comportement associé à une sous-classe est un
rafinement du comportement de la classe de base.
Soit D héritant de C :
⌧préconditions de D : les mêmes ou moins fortes que celles de C
( précond(D)
précond(C) )
⌧postconditions de D : les mêmes ou plus fortes que celles de C ;
( postcond(C)
postcond(D) )
-> processus de test incrémental et hiérarchique. Les cas de test
hérités et additionnels dépendent des modifications apportées dans
D par rapport à C
⌧Invariant de D : le même ou plus fort que celui de C
( inv(C)
inv(D) )
2009
INSA -- Test de Logiciels
265
Quels cas de test ajouter pour la sous-classe ?
Dans la suite de cette partie, C désigne une classe et D une
de ses sous-classes.
C
D
Ajout d’une opération dans l’interface de D et potentiellement
dans son implémentation :
Ajout de cas de test basés sur sa spécification
Si l’opération est implémentée : ajout de cas de test basés
sur l’implémentation et pour le test d’intégration
2009
INSA -- Test de Logiciels
Si D hérite de C :
Sont aussi hérités de C par D :
⌧les cas de test basés sur la spécification ;
⌧la plupart des cas de test basés sur l’implémentation ;
⌧la plupart des cas de test issus des tests d’intégration
Des cas de test doivent parfois être ajoutés aux cas de test
hérités
267
Quels cas de test ajouter pour la sous-classe ?
2009
Modification dans D de la spécification d’une opération m déclarée
dans C :
Ajout de cas de test basés sur la spécification de m dans D
Ré-exécution des cas de tests de C pour m dans D
Surcharge dans D d’une opération m héritée de C :
Réutilisation de tous les cas de test basés sur la spécification
Revoir les cas de test basés sur l’implémentation et ceux pour
le test d’intégration : réutilisation d’une partie de ceux de C et
ajout de nouveaux cas de test
2009
269
INSA -- Test de Logiciels
268
Exercice: quels cas de test ajouter pour tester
Rectangle, connaissant les tests de Polygone ?
Polygone
coins : Point[]
Polygone(Point[])
getCoins() : Point[]
translate(Vector);
aire() : int
affiche_caractéristiques();
Remarque sur la ré-exécution de cas de test : en pratique, tous
les cas de test hérités sont ré-exécutés. En effet, l’effort
nécessaire à la sélection des cas de test à ne pas ré-exécuter est
supérieur à l’effort nécessaire pour les exécuter de nouveau
INSA -- Test de Logiciels
266
Quels cas de test ajoutés pour la sous-classe ?
Méthodes héritées telles quelles par D :
Les cas de test de C pour ces méthodes sont encore valides
⌧ils n’ont pas besoin d’être réexécutés en général…
⌧…sauf pour les méthodes qui utilisent des méthodes qui ont
été modifiées dans D. En ce cas, des cas de test basés sur
l’implémentation doivent aussi être ajoutés
2009
INSA -- Test de Logiciels
Utilise aire()
Rectangle
Rectangle(Point[]);
aire() : int
estCarre() : bool
2009
INSA -- Test de Logiciels
270
Rappel sur la liaison dynamique
A
- int a
Code Java
int foo(int i){
+ <<constr>> A() : A
+
m() : int
type déclaré de a : A
A a;
if (i<0){
Comment tester en
présence de polymorphisme
par liaison dynamique ?
a=new A();
B
a=new B();
+ <<constr>> B() : B
+
m() : int
}
if (a.m() < 7){
…
C
- int c
+ <<constr>> C() : C
+
m() : int
2009
INSA -- Test de Logiciels
271
}
type effectif de a : B
le type effectif de a dépend de la
branche suivie dans le if-then-else
méthode m() appelée : soit A::m() soit
B::m() selon le type effectif de a. C::m()
ne peut pas être appelée.
…
}
INSA -- Test de Logiciels
272
Critère de test structurel et polymorphisme
Critère de test structurel et polymorphisme
Soit m polymorphe, appelée par o de type déclaré A:
Si m et/ou m sont polymorphes,
j
k
Soient mj et mk des méthodes
appelées
par“se
la cacher”
méthode m
plusieurs codes
peuvent
derrière les appels de méthodes en
Soient :
fonction du type de l’objet sur lequel
v : variable d’instance elles s’appliquent
ij : instruction de la méthode mj
c
qui définit v
ik : instruction de la méthode mk
mk{
…
qui utilise v
2009
type effectif de a : A
} else {
- int b
mj{
…
ij
…
}
A
- int a
A::m, B::m ou C::m peuvent être appelées
Cependant, le type effectif de o ne peut être que A
ou B, ainsi l’appel de C::m() ne peut être couvert !
+ m () : int
B
- int b
+ m () : int
Déterminer les types effectifs possible nécessite une
analyse globale de l’application (coûteux et complexe)
ik
…
}
Le critère est couvert si :
(v, ij, ik) faisable, un cas de test pour m qui sensibilise
un chemin c entre ij et ik sans redéfinition de v
C
- int c
+ m () : int
E
-> la mesure fiable du critère de couverture est compromise
(problème à rapprocher de la détermination des chemins executables)
A
Si mj et/ou mk sont polymorphes, il faut
déterminer ces triplets pour chaque corps de
méthode potentiellement
exécuté.
INSA -- Test de Logiciels
2009
273
2009
INSA -- Test de Logiciels
274
Problématique des classes abstraites
Classe abstraite = classe sans instance, à l’implémentation
incomplète – Utile pour la généricité et la lisibilité
Comment tester les classes
abstraites ?
Problème pour le test : impossible à tester en tant que
telle puisque pas instanciable.
Pratique de vérification usuelle : revue du code uniquement !
Nécessité de tester les opérations de la classe abstraite
au travers des sous-classes
2009
INSA -- Test de Logiciels
275
2009
INSA -- Test de Logiciels
276
Comment tester une classe abstraite ?
Comment tester une classe abstraite ?
Problèmes posés par l’approche 1 :
Les bouchons sont parfois difficiles à écrire :
⌧Soit f une méthode implémentée dans la classe abstraite, qui
appelle la méthode abstraite g de la même classe.
Approche 1 : définition d’une classe concrète uniquement
pour pouvoir tester la classe abstraite
Abstract_C
abstract class Abstract_C{
abstract int g(int a);
int f(int a){
int i = g(a);
…
}
Concrete_C
}
Dans la classe concrète, les méthodes abstraites de la classe
abstraite sont implémentées -> bouchons
2009
INSA -- Test de Logiciels
277
Problèmes posés par l’approche 1 :
⌧ Soient, Abstract_C et Abstract_D deux classes telles que
Abstract_D hérite de Abstract_C ;
⌧ Concrete_C et Concrete_D les classes qui leur sont
respectivement associées à des fins de test.
2009
Concrete_C
Approche 2 : Tester la classe abstraite avec son premier
descendant
Abstract_C
D
Hypothèse sous-jacente: si D passe sans problème les cas de test
alors Abstract_C les passe également sans problème
Abstract_D
INSA -- Test de Logiciels
Concrete_D
279
2009
INSA -- Test de Logiciels
280
Comment tester une classe abstraite ?
Problème posé par l’approche 2 :
L’hypothèse n’est pas toujours valide !
⌧ Si D surcharge une méthode f de Abstract C alors la
méthode f de Abstract_C n’est pas testée. Il faudra la
tester dans une autre sous-classe de Abstract_C qui ne
surcharge pas cette méthode f.
Approche 3 : Utiliser une compilation conditionnelle pour avoir
dans un même fichier :
la classe abstraite sous test avec ses méthodes abstraites
Une version de la classe où chaque méthode abstraite est
remplacée par une implémentation (bouchon)
Ex : #ifdefined(TEST)
<bouchon>
#endif
Abstract_C
int f()
D
Problème posé par l’approche 3 :
le code est peu lisible
int f()
INSA -- Test de Logiciels
278
Abstract_C
Comment tester une classe abstraite ?
2009
INSA -- Test de Logiciels
Comment tester une classe abstraite ?
Comment tester une classe abstraite ?
L’héritage multiple est nécessaire
pour que Concrete_D hérite des bouchons
créés dans Concrete_C
-> OK en C++, mais en Java
l’héritage multiple de classe
n’est pas autorisé
2009
⌧L’implémentation de g doit permettre de respecter la
postcondition de la fonction g.
-> le coût est parfois très élevé si g est une fonction complexe
281
2009
INSA -- Test de Logiciels
282
Plan du cours d’aujourd’hui
Test de logiciel orienté-objet:
conclusions
Spécificités à prendre en compte pour le test
(abstraction, encapsulation, modularité) pour ne pas rejouer trop
de test inutiles
1. Techniques de test élémentaires
2. Test de logiciel orientés-objet
Difficultés particulières :
- Test en présence de polymorphisme (liaison dynamique)
3.
Model-Based Testing
- Test de classes abstraites
2009
INSA -- Test de Logiciels
283
Model-Based Testing
2009
INSA -- Test de Logiciels
284
Model-Based Testing
Génération de tests à partir de modèles
Processus de test à partir de modèles
Modélisation
Exigences
Modèle formel
Modèle formel
StateCharts,B,UML,…
Ensemble de
Spécifications et
développement
Génération de Test
Cas de test
générés
Directives de
génération
Générateur
de tests
Cas de tests
• séquence de stimuli
• résultats attendus
Génération de scripts
Scripts de tests
exécutables
Validation
Directives de génération (définition d’un scénario de tests) :
Critères de couverture du modèle
Critères de sélection sur le modèle
Implémentation
Originalité du MBT : construire le modèle dans le but d’automatiser le test
2009
INSA -- Test de Logiciels
285
2009
INSA -- Test de Logiciels
286
Reference
« Practical Model-based Testing »
M. Utting, B. Legeard, 2008
Modéliser pour tester
Stratégies de génération de test
Sélection des tests – Critères de couverture
Exemple d’outils : SIMULINK DESIGN VERIFIER
2009
INSA -- Test de Logiciels
287
2009
INSA -- Test de Logiciels
288
Modéliser pour tester
Modéliser pour tester
Modéliser pour tester (1)
Modéliser pour tester (2)
Modèle abstrait
modèle fonctionnel (et non modèle d’architecture et/ou
d’implémentation)
Modèle détaillé et précis
Le modèle doit permettre de calculer les cas de test et les
résultats attendus
établir automatiquement le verdict de test
Modèle validé et vérifié
Si le verdict de test « Fail » : l’erreur est-elle dans
l’implantation ou dans le modèle ?
2009
Modèle adapté aux objectifs de test
Plus le modèle intègre d’informations inutiles par rapport aux
objectifs de tests, plus cela génère de « bruit » en
génération de tests
Modèle tenant compte des points de contrôle et d’observation
du système sous test
Génération
des tests
Génération
des scripts
Modèle fonctionnel
INSA -- Test de Logiciels
289
Modéliser pour tester
2009
Notations de modélisation
Systèmes de transitions (Etats / Transitions / Evénements)
⌧Flow Charts / CFGs
⌧Data Flow Diagrams
⌧Diagrammes d’état
Diagrammes objet & association (hiérarchie, héritage, …)
⌧Diagrammes de classe (UML)
⌧Modèles Entité-Relation
Représentation Pré/Post conditions
⌧OCL (Object Constraint Language) pour UML
⌧JML (Java Modeling Language) pour Java
⌧Machine Abstraite B
Applications type contrôle-commande (automobile, énergie, aéronautique, …)
Statecharts, Matlab/Simulink, Lustre, Signal
Applications mobiles et logiciels enfouis (télécom, électronique grand public,
carte à puces, monétique, …)
Pré/Post conditions (UML/OCL, B, …)
Systèmes d’information
Modélisation objet (UML)
2009
Représentation : Graphique (plus « intuitive » ) ou textuelle (plus précise)
INSA -- Test de Logiciels
291
Notation
Présentation
UML 2.0
(Diag.
Classe +
OCL + Diag.
État)
Statecharts
Unified
Modeling
Language
Diag. Etat
Méthode
formelle
2009
INSA -- Test de Logiciels
292
Classification des techniques de génération
Choix de notations
2009
290
Modéliser pour tester
Critères de choix d’une notation / type
d’application
Notation B
Banc de test
INSA -- Test de Logiciels
++
. Grande
diffusion
. Variété de
diagrammes
Quelques outils…
--
Systèmes de transitions :
IOLTS (STG – IRISA, TORX – Univ. Nijmegen)
Statecharts (AGATHA – CEA)
. Peu précise
. Pas de
sémantique
Pré/post conditions – Machine abstraites
ASML (Microsoft Research)
B (LTG)
UML/OCL (LTG, UML-Casting, …)
. Bien adapté - . Faible sur les
contrôleurs données
systèmes
Embarqués
. Sémantique . Apprentissage
claire
. Précision
INSA -- Test de Logiciels
293
Systèmes hybrides (discret/continus)
Simulink (Mathworks)
Langages synchrones
Lustre (GATEL – CEA)
2009
INSA -- Test de Logiciels
294
Modéliser pour tester
Noyau de la norme GSM 11.11
Exemple – La norme carte à puces GSM 11-11
La norme GSM 11-11 défini l’interface entre le Mobile (téléphone
GSM) et la puce SIM – Subscriber Identifier Module
Commandes :
Verify_Chv(chv,code),
Change_Chv(chv,code1,code2),
MF
Disable_Chv(code),
La puce SIM est une carte à puces qui contient toutes les données
utilisateurs et gére la protection de l’accès
Arborescence de
fichiers
Enable_Chv(code),
Unblock_Chv(chv,
code_unblock1, code_unblock2),
Le standard GSM 11-11 propose 21 API incluant la gestion du PIN –
Personal Identifier Number – et du PUK – Personal Unblocking Key –
et la lecture et mise à jour de données.
DF_GSM
ed_iccid
Select_File(ff),
Read_Binary,
Update_Binary(data),
ed_lp
ed_imsi
ed_ad
Reset,
2009
INSA -- Test de Logiciels
295
Modèle en B de la norme GSM 11-11 (fragment) – 1/4
CONSTANTS
FILES_CHILDREN,
PERMISSION_READ,
MAX_CHV,
MAX_UNBLOCK,
PUK
INSA -- Test de Logiciels
296
PROPERTIES
FILES_CHILDREN : FILES <-> FILES &
FILES_CHILDREN = {(mf|->df_gsm), (mf|->ef_iccid),(df_gsm|->ef_lp),
(df_gsm|->ef_imsi),(df_gsm|->ef_ad)} &
PERMISSION_READ : EF --> PERMISSION &
PERMISSION_READ = {(ef_imsi|->never),(ef_lp|->always),
(ef_iccid|->chv),(ef_ad|->adm)} &
MAX_CHV = 3 &
MAX_UNBLOCK = 10 &
PUK : CODE &
PUK = a_3
SETS
FILES = {mf,df_gsm,ef_iccid,ef_lp,ef_imsi,ef_ad};
PERMISSION = {always,chv,never,adm};
VALUE = {true, false};
BLOCKED_STATUS = {blocked, unblocked};
CODE = {a_1,a_2,a_3,a_4};
DATA = {d_1,d_2,d_3,d_4}
2009
INSA -- Test de Logiciels
Modèle en B de la norme GSM 11-11 (fragment) – 2/4
MACHINE GSM_11-11
DEFINITIONS
MF == {mf};
DF == {df_gsm};
EF == {ef_iccid,ef_lp,ef_imsi,ef_ad};
COUNTER_CHV == 0..MAX_CHV;
COUNTER_UNBLOCK_CHV == 0..MAX_UNBLOCK
2009
VARIABLES
current_file,
current_directory,
counter_chv,
counter_unblock_chv,
blocked_chv_status,
blocked_status,
permission_session,
pin,
data
297
Modèle en B de la norme GSM 11-11 (fragment) – 3/4
2009
INSA -- Test de Logiciels
298
Modèle en B de la norme GSM 11-11 (fragment) – 4/4
sw <-- VERIFY_CHV(code) =
PRE
code : CODE
THEN
IF (blocked_chv_status = blocked)
THEN
sw := 9840
ELSE
IF (pin = code)
THEN
counter_chv := MAX_CHV || permission_session(chv) := true || sw := 9000
ELSE
IF (counter_chv = 1)
THEN
counter_chv := 0 || blocked_chv_status := blocked ||
permission_session(chv) := false || sw := 9840
ELSE
counter_chv := counter_chv - 1 || sw := 9804
END
END
END
INVARIANT
…
((blocked_chv_status = blocked) => ((chv|->false) : permission_session)) &
((counter_chv = 0) <=> (blocked_chv_status = blocked)) &
((counter_unblock_chv = 0) <=> (blocked_status = blocked))
INITIALISATION
current_file := {} ||
current_directory := mf ||
counter_chv := MAX_CHV ||
counter_unblock_chv := MAX_UNBLOCK ||
blocked_chv_status := unblocked ||
blocked_status := unblocked ||
permission_session := {(always|->true),(chv|->false),(adm|->false),(never|->false)} ||
pin := a_1 ||
data := {(ef_iccid|->d_1),(ef_lp|->d_2),(ef_imsi|->d_3),(ef_ad|->d_4)}
END;
2009
INSA -- Test de Logiciels
299
2009
INSA -- Test de Logiciels
300
Modélisation en B pour la génération de tests
CHANGE_Pin(old_code, new_code) =
PRE
old_code ∈ Nat ∧ new_code ∈ Nat
THEN
Niveau Machine Abstraite
IF counter_pin = 0
THEN
(sans raffinement, mono-machine)
sw := 9840
ELSE
IF code_pin = old_code
Permet une bonne prise en compte des
THEN
données et des traitements
code_pin := new_code
||
counter_pin := 3
||
permission_session := true ||
sw := 9000
Bon niveau d’abstraction
ELSE IF counter_pin =1
THEN
counter_pin := 0
permission_session := false
sw := 9840
ELSE
counter_pin := counter_pin – 1
sw := 9804
END END END END END ;
2009
INSA -- Test de Logiciels
sw
Modéliser pour tester
Stratégies de génération de test
Sélection des tests – Critères de couverture
Exemple d’outils : SIMULINK DESIGN VERIFIER
||
||
||
301
Analyse de
besoins
Ingénieur
modélisation
INSA -- Test de Logiciels
Spécifications
fonctionnelles
Documentation
Développement
Support du
développement
Modèle existant
Adaptation
Modèle pour le test
fonctionnel
Modélisation
Ingénieur
validation
Génération
des tests
302
Processus Model-Based Testing – Schéma 2
Processus Model-Based Testing – Schéma 1
2009
2009
Ingénieur
validation
Cas de test
INSA -- Test de Logiciels
303
Génération
des tests
Pilotage
2009
Cas de test
INSA -- Test de Logiciels
304
Composition d’un cas de test
Génération automatique de tests fonctionnels
Un cas de test généré se décompose en quatre parties:
Préambule : séquence des stimuli depuis l’état initial jusqu’à un
état recherché pour réalisé le test,
Automatiser les stratégies classiques :
Analyse partitionnelle des données d’entrée
Test aux limites
Couverture de critères de test défini sur le modèle
Corps : appel des stimuli testé
Identification : appel d’opérations d’observation pour consolider
l’oracle (facultatif)
Postambule : chemin de retour vers l’état initial ou un état connu
permettant d’enchaîner automatiquement les tests
Ou bien sélection de comportements à tester en priorité
Objectif : Maîtriser la combinatoire des cas de test
Préambule
2009
INSA -- Test de Logiciels
305
2009
Corps
Identification
INSA -- Test de Logiciels
Postambule
306
Pilotage du banc de test et simulation de
l’environnement
Problématique de la traduction des tests générés en scripts
exécutables
A partir des cas de tests abstraits, d’un source de test
générique et d’une table d’observabilité et d’exécutabilité,
les scripts exécutables sur le banc cible sont générés.
Le pilotage du banc permet une exécution des tests et
un verdict automatiques.
Nomage des appels et variables : Les tests générés sont des séquences d’appel
sur les opérations ou stimuli définis au niveau du modèle
Table de correspondance entre noms du modèle (variables et appels) et
noms de l’environnement d’exécution des tests
langage de tests : L’environnement d’exécution des tests prend en entrée un
langage de définition des scripts exécutables (TTCN, JUnit, Cunit, Pluto, …)
Définition d’un pattern générique au sein duquel les appels seront insérés
Pattern de test
générique
Table d’observabilité et
d’exécutabilité
Génération des scripts
de tests exécutables
Cas de test
générés
2009
Verdict de test : Les tests générés comprennent le résultat attendus
Le verdict est construit par comparaison entre le résultat attendu et le
résultat obtenu pendant l’exécution du script de test
Script de tests
exécutables
INSA -- Test de Logiciels
307
3140 tests
240
MagIC 500
Invali d in pu ts
Schlumberger device
Classes de comportements
du système
1570 comportements
INSA -- Test de Logiciels
Vali d in pu ts
La définition des classes
d’équivalence permet de
passer d’un nombre infinis de
données d’entrée à un nombre
fini et limité de données de
test.
Ou tput s
INSA -- Test de Logiciels
309
Test aux bornes des domaines des variables du
modèle
4
Inférieur à 4
11
De 4 à 10
Supérieur à 10
Le test aux bornes produit à la fois des cas de test valides
(tests nominaux dans l’intervalle) et invalides
(tests de robustesse hors intervalle)
2009
INSA -- Test de Logiciels
2009
INSA -- Test de Logiciels
Classes de comportements
P1: x ≤ 0
P2: x > 0 ∧ x ≤ 40
P3: x > 40 ∧ x ≤ 100
311
310
Analyse partitionnelle - Exemple
Invariant
x ∈ -1000 .. 1000
Preop
x ≤ 100
Postop
IF x ≤ 0 THEN y := default
ELSE IF x ≤ 40
THEN y := low
ELSE y:= high
END END
10
3
Une classe d’équivalence
correspond à un ensemble de
données de tests qui activent
le même comportement.
Sy stem
Tests pour toutes les configurations
cartes possibles et les valeurs aux bornes
Tests pour une configuration particulière
2009
308
Analyse partitionnelle des domaines des
données d’entrée
Maîtriser la combinatoire : exemple de la
validation terminal Carte Bancaire
2,64 Milliards de combinaisons
de données possibles
2009
2009
P1
P2
P3
Ensemble de tous les états du
système qui permettent d’activer
l’opération
INSA -- Test de Logiciels
312
Calcul des données de test aux bornes
Prédicats après partitionnement
P1: x ≤ 0
P2: x > 0 ∧ x ≤ 40
P3: x > 40 ∧ x ≤ 100
Tests aux bornes
BG1 x = -1000
BG2 x = 0
BG3 x = 1
BG4 x = 40
BG5 x = 41
BG6 x = 100
2009
Modéliser pour tester
X
BG1
Stratégies de génération de test
P1
BG2
X
X
BG3
P2
BG4 X
Sélection des tests – Critères de couverture
Exemple d’outils : SIMULINK DESIGN VERIFIER
X
BG5
P3
X BG6
INSA -- Test de Logiciels
313
Génération des tests à partir de critères
2009
Critères de conditions multiples dans les décisions
Toutes les décisions
Toutes les conditions
Toutes les décisions / conditions modifiées (MC/DC)
Toutes les conditions/decisions multiples
…
Critères de sélection
Focaliser la génération sur certains comportements
Evolution du modèle
Sélectionner les tests par différentiel de comportements entre deux
versions du modèle
SUR LE MODELE…
Cas utilisateur
Animer le modèle pour définir des cas de test
INSA -- Test de Logiciels
314
Critères de couverture
Critères de couverture du modèle
Obtenir le niveau de dépliage et de couverture souhaité à partir du
modèle
2009
INSA -- Test de Logiciels
315
2009
INSA -- Test de Logiciels
316
Diagramme d’états du contrôleur de vitesse
Critères de couverture
Critères de conditions multiples dans les décisions
Toutes les décisions
Toutes les conditions/décisions
Toutes les décisions / conditions modifiées (MC/DC)
Toutes les conditions/decisions multiples
Critères de couvertures des valeurs aux bornes
équivalentes
Une valeur
Toutes les valeurs
Conditions multiples
2009
INSA -- Test de Logiciels
317
2009
INSA -- Test de Logiciels
318
Diagramme d’états du contrôleur de vitesse
Critères de couverture
Critères de conditions multiples dans les décisions
Toutes les décisions
Toutes les conditions/décisions
Toutes les décisions / conditions modifiées (MC/DC)
Toutes les conditions/decisons multiples
Critères de couvertures des valeurs limites équivalentes
Une valeur
Toutes les valeurs
Critères de couverture des transitions
Toutes les transitions
Toutes les paires de transitions
Valeurs aux limites
2009
INSA -- Test de Logiciels
319
Diagramme d’états du contrôleur de vitesse
2009
INSA -- Test de Logiciels
320
Critères de sélection
Focus sur le modèle
Sélection sur le choix des opérations / événements activables
Sélection par choix sur les variables / valeurs du modèle
Transition
Evolution du modèle
Test de tous les comportements ajoutés ou modifiés
Test des comportements inchangés
Cas définis par l’utilisateur
Animation du modèle pour définir des séquences
d’activation: le générateur de test permet la production de
l’oracle de test
2009
INSA -- Test de Logiciels
321
2009
INSA -- Test de Logiciels
322
Conclusion du cours
Modéliser pour tester
Validation des logiciels dans le Monde Industriel
essentiellement basée sur le test logiciel
Stratégies de génération de test
Spécificité du test des logiciels orientés-objet
Sélection des tests – Critères de couverture
Approches complémentaires:
Exemple d’outils : SIMULINK DESIGN VERIFIER
Code-based Testing vs Model-based Testing
Nombreux outils pour tous les langages et notations de
modèles
2009
INSA -- Test de Logiciels
323
2009
INSA -- Test de Logiciels
324

Documents pareils