Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
datele de test sunt generate pe baza implementarii (programului), fara a lua in considerare specificatia (cerintele) programului
pentru a utiliza metode structurale de testare programul poate fi reprezentat sub forma unui graf structurat
datele de test sunt alese astfel incat sa parcurga toate elementele (instructiune, ramura sau cale) grafului macar o singura data. In functie de tipul de elemente ales, vor fi definite diferite masuri de acoperire a grafului: acoperire la nivel de instructiune, acoperire la nivel de ramura sau acoperire la nivel de cale
Pentru o secventa de instructiuni se introduce un nod
if c then s1 else s2
while c do s repeat s until c
public class Test while (n<1||n>20);
System.out.println('input '+n+' character(s)');
for (i=0; i<n; i++)
a[i] = in.readCharacter();
nl = in.readCharacter();
do while ((response=='y') | response=='Y'));
}
Pentru a obtine o acoperire la nivel de instructiune, trebuie sa ne concentram asupra acelor instructiuni care sunt controlate de conditii (acestea corespund ramificatiilor din graf)
Intrari |
Rezultat afisat |
Instructiuni parcurse |
|||
n |
x |
c |
s |
||
a |
a |
y | |||
b |
n |
Testarea la nivel de instructiune este privita de obicei ca nivelul minim de acoperire pe care il poate atinge testarea structurala. Acest lucru se datoreaza sentimentului ca este absurd sa dai in functionare un software fara a executa macar odata fiecare instructiune.
Totusi, destul de frecvent, acesta acoperire nu poate fi obtinuta, din urmatoarele motive:
Existenta unei portiuni izolate de cod, care nu poate fi niciodata atinsa. Aceasta situatie indica o eroare de design si respectiva portiune de cod trebuie inlaturata.
Existenta unor portiuni de cod sau subrutine care nu se pot executa decat in situatii speciale (subrutine de eroare, a caror executie poate fi dificila sau chiar periculoasa). In astfel de situatii, acoperirea acestor instructiuni poate fi inlocuita de o inspectie riguroasa a codului
Avantaje:
Realizeaza executia macar o singura data a fiecarei instructiuni
In general usor de realizat
Slabiciuni:
Nu asigura o acoperire suficienta, mai ales in ceea ce priveste conditiile:
Nu testeaza fiecare conditie in parte in cazul conditiilor compuse (de exemplu, pentru a se atinge o acoperire la nivel de instructiune in programul folosit ca exemplu, nu este necesara introducerea unei valori mai mici ca 1 pentru n)
Nu testeaza fiecare ramura
Probleme suplimentare apar in cazul instructiunilor if a caror clauza else lipseste. In acest caz, testarea la nivel de instructiune va forta executiei ramurii corespunzatoare valorii adevarat, dar, deoarece nu exista clauza else, nu va fi necesara si executia celeilate ramuri. Metoda poate fi extinsa pentru a rezolva aceasta problema.
2. Testare la nivel de ramura (branch testing)
Este o extindere naturala a metodei precedente.
Genereaza date de test care testeaza cazurile cand fiecare conditie este adevarta sau falsa.
Intrari |
Rezultat afisat |
Instructiuni parcurse |
|||
n |
x |
c |
s |
||
Cere introducerea unui intreg intre 1 si 20 | |||||
a |
a |
y |
Afiseaza pozitia 1; se cere introducerea unui nou caracter | ||
b |
n |
Caracterul nu apare |
Avantaje:
Este privita ca etapa superioara a testarii la nivel de instructiune; testeaza toate ramurile (inclusiv ramurile nule ale instructiunilor if/else)
Dezavantaje:
Nu testeaza conditiile individuale ale fiecarei decizii
3. Testare la nivel de conditie (condition testing)
Genereaza date de test astfel incat fiecare conditie individuala dintr-o decizie sa ia atat valoarea adevarat cat si valoarea fals (daca acest lucru este posibil).
De exemplu, daca o decizie ia forma c1 || c2 sau c1 && c2, atunci acoperirea la nivel de conditie se obtine astfel incat fiecare dintre conditiile individuale c1 si c2 sa ia atat valoarea adevarat cat si valoarea fals
Nota: decizie inseamna orice ramificare in graf, chiar atunci cand ea nu apare explicit in program. De exemplu, pentru constructia for i := 1 to n din Pascal conditia implicita este i <= n
Decizii |
Conditii individuale |
while (n<1||n>20) |
n < 1, n > 20 |
for (i=0; i<n; i++) |
i < n |
for(i=0; !found && i<n; i++) |
found, i< n |
if(a[i]==c) |
a[i] = c |
if(found) |
found |
while ((response=='y') ||(response=='Y')) |
(response=='y') (response=='Y') |
Intrari |
Rezultat afisat |
Instructiuni parcurse |
|||
n |
x |
c |
s |
||
Cere introducerea unui intreg intre 1 si 20 | |||||
Cere introducerea unui intreg intre 1 si 20 | |||||
a |
a |
y |
Afiseaza pozitia 1; se cere introducerea unui nou caracter | ||
b |
Y |
Caracterul nu apare; se cere introducerea unui nou caracter |
Se concentreaza asupra conditiilor individuale
Poate sa nu realizeze o acoperire la nivel de ramura. De exemplu, datele de mai sus nu realizeaza iesirea din bucla while ((response=='y') ||(response=='Y')) (conditia globala este in ambele cazuri adevarata). Pentru a rezolva aceasta slabiciune se poate folosi testarea la nivel de decizie / conditie.
4. Testare la nivel de decizie / conditie (decision / condition testing)
Genereaza date de test astfel incat fiecare conditie individuala dintr-o decizie sa ia atat valoarea adevarat cat si valoarea fals (daca acest lucru este posibil) si fiecare decizie sa ia atat valoarea adevarat cat si valoarea fals.
Intrari |
Rezultat afisat |
Instructiuni parcurse |
|||
n |
x |
c |
s |
||
Cere introducerea unui intreg intre 1 si 20 | |||||
Cere introducerea unui intreg intre 1 si 20 | |||||
a |
a |
y |
Afiseaza pozitia 1; se cere introducerea unui nou caracter | ||
b |
Y |
Caracterul nu apare; se cere introducerea unui nou caracter | |||
b |
n |
Caracterul nu apare |
5. Testare la nivel de conditie multiple (multiple condition testing)
Genereaza date de test astfel sa fie incat sa parcurga toate combinatiile posibile de adevarat si fals ale conditiilor individuale.
Acesta este o modalitate de a identifica limita superioara pentru numarul de cai necesare pentru obtinerea unei acoperiri la nivel de ramura.
Se bazeaza pe formula lui McCabe pentru Complexitate Ciclomatica:
Dat fiind un graf complet conectat G cu e arce si n noduri, atunci numarul de circute linear independente este dat de:
V(G) = e - n + 1
Terminologie:
Graf complet conectat: exista o cale intre oricare 2 noduri (exista un arc intre nodul de stop si cel de start)
Circuit = cale care incepe si se termina in acelasi nod
Circuite linear independente: nici unul nu poate fi obtinut ca o combinatie a celorlalte
In exemplul nostru, adaugand un arc de la 25 la 1, avem:
n = 16, e = 22, V(G) = 7
Circuite independente:
a) 1..3, 4, 5, 6, 8, 9..13, 14, 17, 18, 21..23, 24, 25, 1..3
b) 1..3, 4, 5, 6, 8, 9..13, 14, 17, 19..20, 21..23, 24, 25, 1..3
c) 1..3, 4, 1..3
d) 6, 7, 6
e) 14, 15, 14
f) 14, 15, 16, 14
g) 9..13, 14, 17, 18, 21..23, 24, 25, 1
Acesta poate numele de set de baza
Orice cale se poate forma ca o combinatie din acest set de baza.
De exemplu
este o combinatie din: a, c (de 2 ori), d, f
Avantaje:
Setul de baza poate fi generat automat si poate fi folosit pentru a realiza o acoperire la nivel de ramura
Dezavantaje:
Setul de baza nu este unic, iar uneori complexitatea acestuia poate fi redusa
Genereaza date pentru executarea fiecarei cai macar o singura data
Problema: in majoritatea situatiilor exista un numar infinit (foarte mare) de cai
Solutie: Impartirea cailor in clase de echivalenta.
De exemplu: 2 clase pot fi considerate echivalente daca difera doar prin numarul de ori de care sunt traversate de acelasi circuit;
determina 2 clase de echivalenta: traversate de 0 ori si n ori, n > 1
Aplicatie:
Daca un program este structurat, atunci, folosindu-se o tehnica descrisa de Paige si Holthouse (1977), acesta poate fi caracterizat de o expresie regulata formata din nodurile grafului
while c1 do
begin
if c2 then
else . .
end
3.(4+5).6.2)*.7
se ia n = 0 si n = 1
3.(4+5).6.2 + null).7
numar de cai:
1.(1+1).1.1 + 1).1 = 3
repeat
if c2 then
else . .
until c1
4+5).6.(2.3.(4+5).6)*.7
se ia n = 0 si n = 1
4+5).6.(2.3.(4+5).6 + null).7
6 cai
Pentru exemplul nostru:
1.4.(1.4)*.5.6.(7.6)*.8.9.14.(15.(null+16).14)*17.(18+19).21.24.( 9.14.(15.(null+16).14)*17.(18+19).21.24)*.25
numar de cai
3.2+1) = 168 cai
Observatie: multe cai, din care o mare parte sunt nefezabile (de exemplu, iesirea de la inceput din cele doua instructiuni for)
Avantaje
Sunt selectate cai pe care alte metode de testare functionala (inclusiv testare la nivel de ramura) nu le ating
Dezavantaje:
Multe cai, din care o parte pot fi nefezabile
Nu exerseaza conditiile individuale ale deciziilor
Tehnica descrisa pentru generarea cailor nu este aplicabila direct programelor nestructurate
Copyright © 2024 - Toate drepturile rezervate