• Aucun résultat trouvé

Exemple d’une sp ´ecification et de trois impl ´ementations

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)