3.2.2/ G ´ENERATION DE TEST´ A PARTIR D` ’UNIOLTS
Algorithme 3.2.1 G ´en ´eration de cas de tests `a partir d’un IOLTS donn ´e [Tre99] ENTREES´ : T = hS, s0, Σin∪Σout∪ {τ}, ∆i
SORTIES: TC= hST C, s0, ΣT Cin ∪ΣT Cout, ∆T Ci// cas de test
VARIABLES: s, s0 ∈ S, a ∈Σin∪Σout, i : entier
DEBUT´ 1: s ← s0
2: tant que true faire
3: pour chaque ´etat puits s de TC diff ´erent de pass et f ail faire 4: i ← pick({0, 1, 2}) //pick(X) choisit al ´eatoirement un ´el ´ement de X.
5: si i= 0 alors 6: a ← pick(Σin) 7: s0 ← succ(s, a) 8: ajouter s→ s−a 0dans T C 9: sinon 10: si i= 1 alors
11: pour chaque a ∈Σout faire
12: s0 ← s a f ter a
13: si s0
, ∅ alors
14: ajouter s→ s−a 0dans T C
15: sinon
16: ajouter s→ f ail−a dans T C
17: fin si
18: fin pour
19: sinon
20: changer l’ ´etat s avec pass dans T C
21: fin si 22: fin si 23: fin pour 24: fin tant que FIN.
Nous pr ´esentons dans cette partie un algorithme de g ´en ´eration de tests pour les syst `emes de transitions `a entr ´ees/sorties bas ´es sur la relation de conformit ´e ioco. Un
cas de test T C= hST C, s0, ΣT Cin ∪Σ T C out ∪ {τ
T C}, ∆T Cid’un IOLTS T = hS, s
0, Σin∪Σout∪ {τ}, ∆i
est un IOLTS tel que ST C ⊆ S ∪ { f ail, pass} et ΣT C
out = Σin et ΣT Cin = Σout. Ainsi, le test
´emet des entr ´ees `a destination de la sp ´ecification et rec¸oit des sorties de celle-ci. Un algorithme de g ´en ´eration de tests al ´eatoire `a partir d’un IOLTS est propos ´e dans [Tre99]. Cet algorithme est pr ´esent ´e dans l’algorithme 3.2.1. A chaque it ´eration de l’algorithme, le cas de test est augment ´e par l’ajout des nouvelles transitions dans T C. `A chaque ´etape, l’algorithme propose de choisir al ´eatoirement entre les trois possibilit ´es suivantes :
• arr ˆeter en ´emettant le verdict pass (ligne 20), • ´emettre une entr ´ee a si c’est possible (ligne 5-8),
• recevoir les sorties et ajouter une transition qui m `ene `a un verdict f ail en cas de sortie non autoris ´ee (ligne 10-18).
Une transition reliant deux nœuds est ´etiquet ´ee par une action (d’entr ´ee ou de sortie). L’algorithme peut d ´ecider de stopper un chemin dans l’arbre en ajoutant un verdict pass.
3.3/
G ´
ENERATION DE TESTS´
A PARTIR DE`
PA
Un programme peut ˆetre mod ´elis ´e par un automate fini. La g ´en ´eration de tests `a partir de cette abstraction a un risque d’avoir de nombreux tests abstraits qui ne sont pas concr ´etisables c’est `a dire qu’il n’existe pas les ´el ´ements de l’abstraction et le pro- gramme. Les automates `a pile peuvent ˆetre des abstractions de programmes r ´ecursifs. C’est une abstraction qui peut ˆetre pr ´ecise qu’une abstraction d’un programme par un automate fini. Il est possible d’obtenir moins de tests non concr ´etisables `a partir de cette abstraction car un cas de test d’un PA d ´epend des appels de fonctions r ´ecursives.
On pr ´esente dans cette partie des m ´ethodes diff ´erentes de g ´en ´eration de tests `a partir d’un PA. Les crit `eres de couvertures d’un PA sont toutes les localit ´es, toutes les transi- tions, etc. Les auteurs de [HM15] proposent une m ´ethode de g ´en ´eration de tests `a partir d’un automate `a pile selon un nouveau crit `ere qui est bas ´e `a la fois sur les localit ´es et sur les configurations de la pile.
3.3.1/ MODELISATION D´ ’UN PROGRAMME RECURSIF PAR UN´ PA
Un programme r ´ecursif peut ˆetre mod ´elis ´e par un automate `a pile. L’abstraction d’un programme r ´ecursif par un automate `a pile est expliqu ´ee dans [DHKM14b]. Elle consiste `a mod ´eliser en premier le programme r ´ecursif par un graphe de flot de contr ˆole qui ne tient pas compte des appels r ´ecursifs. Puis, on calcule un PA `a partir du graphe de flot de contr ˆole. Le PA a les m ˆemes transitions que le graphe de flot de contr ˆole sauf les transitions qui font des appels r ´ecursifs. Les transformations sont les suivants : soit tr une transition d’appel r ´ecursif, on ajoute au PA une transition d’empilement de la localit ´e source de tr vers la localit ´e initiale du PA, puis une transition de d ´epilement du m ˆeme symbole de chaque localit ´e finale du PA vers la localit ´e cible de tr. Ensuite, on retire tr du PA.
par : u0= 0 u1= 1 un= un−1+ un−2pour tout n> 2 (3.1)
On peut exprimer directement cette d ´efinition par l’algorithme 3.3.1 de calcul r ´ecursif. Les instructions de cet algorithme sont ´etiquet ´ees de l0 `a l6. La Fig. 3.6 d ´ecrit le graphe de
flot de contr ˆole de ce programme. La Fig. 3.7 pr ´esente un PA qui est une abstraction du programme 3.3.1 en utilisant le graphe de flot de contr ˆole de la Fig. 3.6 et en y effectuant les transformations d ´ecrites ci-dessus. Le PA contient les m ˆemes transitions que celles du graphe de flot de contr ˆole sauf les transitions (l3, res1 = Fib(n − 1), l4) et (l4, res2 =
Fib(n − 2), l4). Pour la transition (l3, res1 = Fib(n − 1), l4), deux transitions ont ´et ´e ajout ´ees
au PA car il existe une seule localit ´e finale dans le graphe de flot de contr ˆole. Soit F+et F− respectivement les actions d’empilement et de d ´epilement du symbole F. Les deux transitions sont (l3, Fib+1, l0) qui est l’appel r ´ecursif de la fonction Fib(n − 1) et la transition
(l6, Fib−1, l4) qui est le retour d’appel Fib(n − 1). Pour la transition (l4, res2 = Fib(n − 2), l4),
les transitions (l4, Fib+2, l0) qui est l’appel r ´ecursif de la fonction Fib(n − 2) et la transition
(l6, Fib−2, l5) qui est le retour d’appel Fib(n − 2) sont ajout ´ees au PA. Ainsi,Γ = {Fib1, Fib2}
etΣ = {int res1, n 6 1, n > 1 return n, return res1+ res2 }.
Algorithme 3.3.1 Algorithme r ´ecursif calculant le neme nombre de la suite de Fibonacci
Fib(n)
int Fib(int n)
l0: int res1, res2;
si l1 : n6 1 alors l2: return n ;
sinon
l3: res1= Fib(n − 1) ; //Fib+1
l4: res2= Fib(n − 2) ; //Fib+2
l5: return res1+ res2;
fi l6 : end. l0 l1 l2 l3 l4 l5 l6 int res1 n6 1 n> 1 return n
return res1+ res2
res1= Fib(n − 1) res2= Fib(n − 2)