Proiect individual Cerinta : Se da un nr n intre 0-20, un vector v de n elemente, un nr x intre 10-30 si un parametru p/i (par/ impar). Sa se afiseze cati divizori pari sau impari de-ai lui x se afla in vectorul v. 1. (a) partiționare în clase de echivalenţă
Domeniul de intrari: Exista 4 intrari: un intreg pozitiv n un vector de intregi v numarul pentru care caut divizori: x optiune de a cauta divizori pari sau impari: p
n trebuie sa fie intre 1 si 20, deci se disting 3 clase de echivalenta: N_1 = 1..20 N_2 = { n | n < 1 } N_3 = { n | n > 20 }
intregul n determina lungimea vectorului, deci nu determina clase suplimentare
x trebuie sa fie intre 10 si 30, deci se disting 3 clase de echivalenta: X_1 = 10..30 X_2 = { x | x < 10 } X_3 = { x | x > 30 }
optiunea de a cauta divizori pari sau impari este binara, deci se distring 2 clase de echivalenta P_1 = { p } P_2 = { i }
Clasele de echivalenta pentru intregul program se pot obtine ca o combinatie a claselor individuale: C_111 = { ( n , v , x , p ) | n in N_1, |v| = n, x in X_1, p in P_1 } C_112 = { ( n , v , x , p ) | n in N_1, |v| = n, x in X_1, p in P_2 } C_12 = { ( n , v , x , p ) | n in N_1, |v| = n, x in X_2 } C_13 = { ( n , v , x , p ) | n in N_1, |v| = n, x in X_3 } C_2 = { ( n , v , x , p ) | n in N_2 } C_3 = { ( n , v , x , p ) | n in N_3 }
Setul de date de test se alcatuieste alegandu-se o valoare a intrarilor pentru fiecare clasa de echivalenta. De exemplu: C_111 : (4 , [1,2,3,4] , 16 , ’p’ ) C_112 : (6 , [1,5,15,45,10,12] , 15 , ’i’ ) C_12 : (5 , [1,2,3,4,5] , 9 ,’p’) C_13 : (5, [1,2,3,4,5] , 35 , ’p’) C_2 : (0 , [] , 17 , ’p’) C_3 : (22, [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,0,1,2,3], 17, ’i’) 6 clase
Intrari n
v
x
p
Rezultat afisat “N trebuie sa fie mai mare decat 0 si mai mic sau egal cu 20” “N trebuie sa fie mai mare decat 0 si mai mic sau egal cu 20”
0 22 4
[1,2,3,4]
16
'p'
Afiseaza 2.
6
[1,5,15,45,10,12]
15
'i'
5
[1,2,3,4,5]
9
'p'
5
[1,2,3,4,5]
35
'p'
Afiseaza 3. “X trebuie sa fie mai mare decat 10 si mai mic sau egal cu 30” “X trebuie sa fie mai mare decat 10 si mai mic sau egal cu 30”
1. (b) analiza valorilor de frontiera
Odata ce au fost identificate clasele, valorile de frontiera sunt usor de identificat:
Valorile 0, 1, 20, 21 pentru n Valorile 9, 10, 30, 31 pentru x Valorile 0 si 20 pentru numarul de divizori ce pot fi gasiti pentru x
Deci se vor testa urmatoarele valori: N_1 : 1, 20 N_2 : 0 N_3 : 21 X_1 : 10, 30 X_2 : 9 X_3: 31
C_1 : c_11 are 0 divizori, c_12 are 20 divizori Pentru restul claselor se ia cate o valoare (arbitrara)
C_111: (1 , [4] , 10 , ’p’ ) , (1 , [4] , 30 , ’p’) , (20 , [3,5,7,9,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43] , 10 ‚’p’) , (20, [2,10,2,10,2,10,2,10,2,10,2,10,2,10,2,10,2,10,2,10] , 10 , ’p’) , (20 , [1,7,17,13,1,7,17,13,1,7,17,13,1,7,17,13,1,7,17,13] , 30 , ’p’), (20, [2,6,10,2,6,10,2,6,10,2,6,10,2,6,10,2,6,10,2,6] , 30 , ’p’)
C_112: (1 , [4] , 10 , ’i’ ) , (1 , [4] , 30 , ’i’) , (20 , [3,8,7,9,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,4] , 10 ‚’i’) , (20, [1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5] , 10 , ’i’) , (20 , [2,4,6,8,10,12,14,16,18,20,2,4,6,8,10,12,14,16,18,20}] , 30 , ’i’), (20 , [1,5,15,1,5,15,1,5,15,1,5,15,1,5,15,1,5,15,1,5] , 30 , ’i’)
C_12: (1 , [4] , 9 , ’p’ ) , (20 , [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2] , 9 , ’p’ ) ,
C_13: (1 , [4] , 31 , ’p’ ), (20 , [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2] , 31 , ’p’ )
C_2: (0 , [] , 12 , ’p’ )
C_3: (21 , [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3] , 12 , ’p’ )
n
Intrari v
1
[4]
1
[4]
20
[3,5,7,9,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43]
20
[2,10,2,10,2,10,2,10,2,10,2,10,2,10,2,10,2,10,2,10]
10 'p' 10 'p'
20
[1,7,17,13,1,7,17,13,1,7,17,13,1,7,17,13,1,7,17,13]
30 'p'
20
[2,6,10,2,6,10,2,6,10,2,6,10,2,6,10,2,6,10,2,6]
1
[4]
30 'p' 10 'i'
1
[4]
30
'i'
20 20
[3,8,7,9,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,4] [1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5]
10 10
'i'
20
[2,4,6,8,10,12,14,16,18,20,2,4,6,8,10,12,14,16,18,20]
30
'i' 'i'
20
[1,5,15,1,5,15,1,5,15,1,5,15,1,5,15,1,5,15,1,5]
30
'i'
1
[4]
9
'p'
20 1
[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2] [4]
20
[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2]
0
[]
21
[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2]
x
p 10 'p' 30 'p'
9 'p' 31 'p' 31 'p' 12 'p' 12 'p'
1. (c) partitionarea in categorii Pasi: 1. Descompune specificatia functionala in unitati ( programe, functii etc.) care pot fi testate separat : avem o singura unitate 2. Identifica parametrii: n, v, x, p
3. Gaseste categorii: n: daca este in intervalul valid 1..20 v: daca este de lungime minima, medie sau intermediara x: daca este in intervalul valid: 10..30 p: daca este ’p’ sau ’i’
4. Partitioneaza fiecare categorie in alternative:
n: <0, 0, 1, 2..19, 20, 21, >21 v: lungime minima, maxima sau intermediara x: <9, 9, 10, 11..29, 30, 31, >31 p: p,i
5. Scrie specificatia de testare
n 1) 2) 3) 4) 5) 6) 7)
{n|n<0} 0 1 2..19 20 21 { n | n > 21 }
v 1) { v | |v| = 1} 2) { v| 1 < |v| < 1} 3) { v | |v| = 20}
[ok, lungime1] [ok, lungime_medie] [ok, lungime20]
[if ok and lungime1] [if ok and lungime_medie] [if ok and lungime20]
x 1) 2) 3) 4) 5) 6) 7)
{x|x<9} 9 10 11..09 30 31 { x | x > 31 }
[ok, lungime1] [ok, lungime_medie] [ok, lungime20]
Din specificatia de testare ar trebui sa rezulte 7 * 3 * 7 * 2 = 294 de cazuri de testare. Pe de alta parte, unele combinatii de alternative nu au sens si pot fi eliminate. Acest lucru se poate face adaugand constrangeri acestor alternative. Constrangerile pot fi fie proprietati ale alternativelor fie conditii de selectie bazate pe aceste proprietati. In acest caz, alternativele vor fi combinate doar daca conditiile de selectie sunt satisfacute. Folosind acest procedeu, in exemplul nostru vom reduce numarul cazurilor de testare la 34. 6. Creeaza cazuri de testare n1 n2 n3v1x1 n3v1x2 n3v1x3p1 n3v1x3p2 n3v1x4p1 n3v1x4p2 n3v1x5p1 n3v1x5p2 n3v1x6 n3v1x7 n4v2x1 n4v2x2 n4v2x3p1 n4v2x3p2 n4v2x4p1 n4v2x4p2 n4v2x5p1 n4v2x5p2 n4v2x6 n4v2x7 n5v3x1 n5v3x2 n5v3x3p1 n5v3x3p2 n5v3x4p1 n5v3x4p2 n5v3x5p1 n5v3x5p2 n5v3x6 n5v3x7 n6 n7
7. Creeaza date de test Intrari n
v
x
p
1
[4]
5
'p'
1
[4]
9
'p'
1
[5]
10 'p'
1
[2]
10
1
[5]
16 'p'
1
[5]
16
1
[5]
30 'p'
1
[2]
30
1
[4]
31 'p'
1
[4]
4
[4,5,6,7]
37 'p' 5 'p'
4
[4,5,6,7]
4
[5,7,9,11]
4
[2,7,9,11]
4
[5,7,9,11]
4
[5,6,7,11]
4
[5,7,8,11]
4
[2,6,7,11]
4
[4,5,6,7]
4
[4,5,6,7]
20
[18,36,54,72,90,18,36,54,72,90,18,36,54,72,90,18,36,54,72,90]
5
'p'
20
[18,36,54,72,90,18,36,54,72,90,18,36,54,72,90,18,36,54,72,90]
9
'p'
20
[1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5]
20
[1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5]
20
[18,36,54,72,90,18,36,54,72,90,18,36,54,72,90,18,36,54,72,90]
20
[18,36,54,72,90,18,36,54,72,90,18,36,54,72,90,18,36,54,72,90]
20
[18,36,54,72,90,18,36,54,72,90,18,36,54,72,90,18,36,54,72,90]
20
[18,36,54,72,90,18,36,54,72,90,18,36,54,72,90,18,36,54,72,90]
20
[18,36,54,72,90,18,36,54,72,90,18,36,54,72,90,18,36,54,72,90]
20
[18,36,54,72,90,18,36,54,72,90,18,36,54,72,90,18,36,54,72,90]
-1 0 21 23
'i' 'i' 'i'
'p' 10 'p' 10 'i' 9
16 'p' 16 'i' 30 'p' 30 'i' 31 'p' 37 'p'
10 'p' 10 'i' 17 'p' 17 'i' 30 'p' 30 'i' 31 'p' 37 'p'
Nota: O alta categorie poate fi considerata numarul de divizori pe care ii are numarul x in vectorul v. Aceasta categorie poate fi adaugata celor existente.
2. public class MyClass { public int divizori(int n, int[] v, int x, char p) { // the following is just an example 1 if (n <= 0 || n > 20) { 2
throw new IllegalArgumentException("N trebuie sa fie mai mare decat 0 si mai mic sau egal cu 20");
}
3 if (n != v.length) { 4 throw new IllegalArgumentException("Dimensiunea vectorului trebuie sa fie N."); }
5 if (x < 10 || x > 30) { 6
throw new IllegalArgumentException("X trebuie sa fie mai mare decat 10 si mai mic sau egal cu 30");
}
7 if (p != 'p' && p != 'i') { 8
throw new IllegalArgumentException("P trebuie sa fie p-par sau i-impar");
}
int num = 0; /**numarul de divizori*/ 9 for (int i = 0; i < n; i++) { 10
if (p == 'p') {
11
if (x % v[i] == 0 && v[i] % 2 == 0) /**daca v[i] este divizor par*/
12
num++; }
13 else { 14
if (x % v[i] == 0 && v[i] % 2 == 1) /**daca v[i] este divizor impar*/
15 num++; } } 16 return num; } }
Statement Coverage Intrari
Rezultat afisat
Instructiuni parcurse
n
v
x
p
0
[]
15
'p'
1,2
1
[3,4]
15
1,3,4
1
[3]
9
'p' 'p'
1,3,5,6
1
[3]
15
's'
1,3,5,7,8
1
[10]
20
'p'
1,3,5,7,9,10,11,12,9,16
1
[9]
18
'i'
1,3,5,7,9,10,13,14,15,9,16
Decision Coverage Intrari n
v
x
Instructiuni parcurse
Rezultat afisat
p
"N trebuie sa fie mai mare decat 0 si mai mic sau egal cu 20" "Dimensiunea vectorului trebuie sa fie N." "X trebuie sa fie mai mare decat 10 si mai mic sau egal cu 30"
0 1
[] [3,4]
15 15
'p' 'p'
1
[3]
9
1 1 1
[3] [10] [2]
15 20 20
'p' 'p'
"P trebuie sa fie p-par sau i-impar" 1 0
1 1
[9] [2]
18 18
'i' 'i'
1 0
'p' 's'
Condition Coverage Intrari n
0
v
x
p
15
'p'
23 4
[] [5, 6, 9, 18, 36, 54, 72, 90, 18, 36, 54, 72, 90, 18, 36, 54, 72, 90, 18, 36, 54, 72, 90] [2,6,7,11]
16 30
'p' 'i'
1 4
[3,4] [2, 6, 7, 11]
15 30
'p' 'i'
Rezultat afisat "N trebuie sa fie mai mare decat 0 si mai mic sau egal cu 20" "N trebuie sa fie mai mare decat 0 si mai mic sau egal cu 20" 0 "Dimensiunea vectorului trebuie sa fie N." 0
Instructiuni parcurse
1
[3]
9
'p'
1 1 4 1
[3] [2] [2,6,7,11] [10]
33 18 30 20
'p' 'i' 'i' 'p'
1 1 1 4 1 1 1 1 1 1 1 1
[3] [10] [10] [2, 6, 7, 11] [9] [4] [4] [5] [4] [5] [9] [4]
14 20 20 30 18 18 16 18 16 18 18 18
Decizii if(n<=0 || n>20) if(n!= v.length) if(x<10 || x>30) if(p!='p' && p!= 'i') for(int i = 0, i
3.Formula lui McCabe V(G) = e – n + 1 e = numarul de muchii = 24 n = numarul de noduri = 16 V(G) = 24 – 16 +1 = 9
's' 'p' 'p' 'i' 'i' 'p' 'p' 'i' 'p' 'p' 'i' 'p'
"X trebuie sa fie mai mare decat 10 si mai mic sau egal cu 30" "X trebuie sa fie mai mare decat 10 si mai mic sau egal cu 30" 0 0 1 "P trebuie sa fie p-par sau iimpar" 1 1 0 1 0 1 0 1 0 1 0
Conditii individuale n<=0, n>20 n!=v.length x<10, x>30 p!='p' , p!='i' i
Circuite independente: 1) 1, 2, 3...9, 16, 1 2) 1, 3, 4, 5...9, 16, 1 3) 1, 3, 5, 6, 7, 9, 16, 1 4) 1, 3, 5, 7, 8, 9, 16, 1 5) 1, 3, 5, 7, 9, 16, 1 6) 9, 10, 11, 9 7) 9, 10, 11, 12, 9 8) 9, 10, 13, 14, 9 9) 9, 10, 13, 14, 15, 9
Expresia regulata obtinuta este: (1.2.3.4.5.6.7.8.9.(10.((11.9)*.12.9)* + ((13.14.9)*.15.9)*)* .16.1)*
Se ia n = 0 si n = 1 (1.1.1.1.1.1.1.1.1.(1.((1.1+null).1.1+null) + ((1.1.1+null).1.1+null) + null).1.1 + null) = = (1(1(1+1))1) =2 Numar de cai = 2 4.Set de test pentru acoperirea la nivel de cale:
Intrari
Rezultat afisat
Instructiuni parcurse
'p'
1
1,3,5,7,9,10,11,12,9,16
'i'
1
1,3,5,7,9,10,13,14,15,9,16
n
v
x
p
1
[10]
20
1
[9]
18
5. Folosind generatorul de mutanti, raportul a fost 100%, nu a mai ramas niciun mutant in viata!