Testarea White Box

Download Report

Transcript Testarea White Box

TSCR -curs-
Ionescu Augustin-Iulian
2010
1
CAPITOLUL 6
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-2
Prezentare generală
Implică accesul la codul sursă al programului testat.
Se mai numesc şi tehnici de testare bazată pe cod, structurală, glass box, clear
box
Idea fundamentală este aceea de a executa fiecare porțiune de cod cel puțin
odată.
Corectitudinea rezultatului poate fi stabilită numai pe baza analizei specificațiilor.
Sunt utilizate ȋn special de dezvoltatorii de cod care-şi testează propriile programe.
Principalele tehnici white box sunt:
acoperirea instrucțiunilor;
acoperirea ramurilor;
testarea condițiilor
testarea condițiilor de ramificare;
testarea combinațiilor condițiilor de ramificare;
acoperirea căilor.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-3
Acoperirea instrucțiunilor
Se mai numeşte şi acoperire C0.
Urmăreşte executarea tuturor instrucțiunilor din unitatea testată ȋn scopul
depistării unor zone de cod mort, care nu pot fi accesate;
Primul pas ȋl reprezintă generarea grafului controlului fluxului;
Fiecare grup de instrucțiuni executate secvențial fără ramificări formează un
nod al grafului deoarece, neexistand ramificări, execuția primei instrucțiuni
din grup garantează execuția celorlalte.
Controlul fluxului este reprezentat prin arce orientate.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-4
Acoperirea instrucțiunilor (exemplu)
Pentru a trece prin toate nodurile, laturile
grafului vor trebui traversate ȋn următoarea
ordine:
a
IF
b
IF
f
a, b, f, g, h, d, e
DO
k
c
i
g
Criteriul de completitudine a testului:
WHILE
Acoperirea_instrucțiunilor =
(număr_instrucțiuni_executate/număr_total
instrucțiuni)*100%
h
ENDIF
d
ENDIF
e
2010
TSCR -curs-
Este cel mai slab dintre testele white-box deoarece
poate lăsa nedetectate multe defecte.
Ionescu Augustin-Iulian
6-5
Acoperirea ramurilor
ceea ce interesează este parcurgerea tuturor ramurilor din graful controlului
fluxului;
atenția este concentrată pe parcurgerea tuturor deciziilor atât pentru valoarea
TRUE cât şi pentru valoarea FALSE;
ȋn cazul unei instrucțiuni IF trebuie testate atât ramura THEN cât şi ELSE;
ȋn cazul instrucțiunilor CASE se testează toate variantele posibile;
ȋn cazul ciclărilor, se testează obligatoriu trecerea prin corpul ciclului dar şi
ȋntoarcerea la prima instrucțiune a ciclului.
Exemplu:
se observă că ȋn testul din exemplul precedent ramurile c, i, k nu au fost testate;
pentru a acoperi şi aceste ramuri, este necesar să mai fie executate următoarele
teste:
a, b, c, d, e;
a, b, f, g, i, h, d, e;
a, k, e.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-6
Acoperirea ramurilor
Apare o anumită redundanță datorită necesității de a parcurge anumite ramuri
ȋn cadrul mai multor teste, dar acest lucru nu poate fi ȋn general evitat;
Acoperirea_ramurilor =
(Numărul_ramurilor_testate/Numărul_total_al_ramurilor)*100%
Este un criteriu mai bun decât acoperirea instrucțiunilor deoarece garantează şi
acoperirea acestora, dar prețul de cost este mai mare.
Permite testarea tuturor condițiilor simple dar nu implică neapărat testarea
condițiilor complexe.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-7
Testarea condițiilor pe ramură
Permite testarea unor condiții de ramificare complexe prin testarea fiecărei
condiții atomice.
Prin condiție complexă ȋnțelegem o condiție formată din mai multe expresii
relaționale (condiții atomice) reunite prin operatori logici:
5<=nota_lab AND 5<=nota_examen
5<=nota AND nota<=10
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-8
Testarea condițiilor pe ramură
if (5<=nota_lab && 5<=nota_examen)
Conditia 1: 5<=nota_lab
Conditia 2: 5<=nota_examen
Cazuri de test pentru acoperirea ramurilor
ID caz
test
Valoare
nota_lab
Valoare
nota_examen
Valoarea condiției
compuse
1
7
4
False
2
7
8
True
Cazuri de test pentru testarea condițiilor pe ramură
2010
ID caz
test
Valoare
nota_lab
Valoare
nota_examen
condiția1
condiția 2
Valoarea condiției
compuse
1
4
8
False
True
False
2
7
8
True
True
True
3
7
4
True
False
False
TSCR -curs-
Ionescu Augustin-Iulian
6-9
Acoperirea căilor
Parcurgerea tuturor ramurilor grafului de control sau testarea condițiilor nu
sunt suficiente atunci când obiectul testat conține repetiții sau cicluri.
O cale este o secvență continuă de ramuri din graful de control, de obicei de
la intrarea ȋn program până la ieşirea din program.
Acoperirea căilor implică diverse posibilități de a parcurge codul testat.
Acoperirea căilor consideră dependența ȋntre ramuri, când parcurgerea unei
ramuri conduce ȋnapoi la ȋnceputul altei ramuri, ȋn timp ce ȋn acoperirea
ramurilor fiecare ramură este privită independent.
O ramură poate face parte din mai multe căi.
Un atribut important care se poate evalua din graful de control este
complexitatea ciclomatică, calculată cu formula lui McCabe:
V(G)=E-N+2
unde:
E – numărul ramurilor din graf;
N – numărul nodurilor grafului.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-10
Acoperirea căilor
Complexitatea ciclomatică este o masură a aşa numitelor căi independente
prin graf.
Această valoare ne indică de obicei limita superioară a numărului de cazuri
de test necesare acoperirii ramurilor/deciziilor.
Căile independente se determină printr-un proces iterativ, pornind de la o
cale cât mai simplă şi introducând apoi noi ramuri până când toate ramurile
au fost folosite.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-11
Acoperirea căilor (exemplu)
double calculate_price(
double baseprice, double specialprice,
double extraprice, int extras, double discount)
{
double addon_discount;
double result;
if(extras>=3) addon_discount=10;
else if(extras>=5) addon_discount=15;
else addon_discount=0;
if(discount>addon_discount)
addon_discount=discount;
result=baseprice/100.0*(100-discount)
+ specialprice
+ extraprice/100.0*(100-addon_discount);
return (result);
}
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-12
Acoperirea căilor (exemplu)
a
IF (extras>=3)
THEN
ELSE
d
V(G)=14-12+2=4
b
THEN
c
IF (extras>=5)
g
ELSE
e
f
h
ENDIF
i
a-b-c-j-k-l-n
a-b-c-j-m-n
a-d-e-f-i-j-m-n
a-d-g-h-i-j-m-n
j
IF (discount>=addon_discount)
THEN
k
m
l
ENDIF
n
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-13
Acoperirea căilor (exemplu)
//testcase 01
price=calculate_price(10000.00, 2000.00, 1000.00,3,0);
test_ok=test_ok&&(abs(price-12900.00)<0.01);
a, b, c, j, m, n
//testcase 02
price=calculate_price(25500.00, 3450.00, 6000.00,6,0);
test_ok=test_ok&&(abs(price-12900.00)<0.01);
a, b, c, j, m, n
acoperire_ramuri=6/14*100%=43%
//testcase 03
price=calculate_price(10000.00, 2000.00, 1000.00,0,10);
test_ok=test_ok&&(abs(price-12900.00)<0.01);
a, d, g, h, i, j, k, l, n
//testcase 04
price=calculate_price(25500.00, 3450.00, 6000.00,6,0);
test_ok=test_ok&&(abs(price-12900.00)<0.01);
a, b, c, j, k, l, n
acoperire_ramuri=12/14*100%=86%
Observație! Ramurile e şi f nu pot fi testate deoarece nu este posibil ca simultan extras<3 şi extras>=5.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-14
Utilizarea fluxului de date
Spunem că o variabilă este definită ȋntr-o instrucțiune dacă i se asignează o
valoare sau i se modifică valoarea.
Exemplu: nota=(4*nota_lab+6*nota_examen)/10;
Această instrucțiune se notează def pentru variabila nota.
Spunem că o variabilă este utilizată ȋntr-o instrucțiune dacă valoarea ei este
folosită pentru calculul valorii unei variabile sau pentru luarea unei decizii.
Exemple: nota=(4*nota_lab+6*nota_examen)/10; c-use pentru nota_lab
if (nota_lab<5)
p-use pentru nota_lab
Calea dintre definirea unei variabile şi utilizarea ei se numeşte cale def-use.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-15
Utilizarea fluxului de date
Pot fi identificate mai multe variante de testare a segmentelor de cale din
fluxul de date:
toate def
toate p-use
toate c-use/unele p-use
toate p-use/unele c-use
toate use
toate căile def-use
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-16
Utilizarea fluxului de date
1 USE dbSecretariat04_05
2 GO
3 DECLARE @Nume varchar(35),@Initiala varchar(8),@Prenume varchar(35), @Sex char(1),@DataNastere datetime
4 DECLARE cursDatePersonale CURSOR
FOR SELECT NumeStudent,InitialaStudent,PrenumeStudent,Sex,DataNastere
FROM tblStudent
5--utilizarea cursorului
6 OPEN cursDatePersonale
7 FETCH NEXT FROM cursDatePersonale INTO @Nume ,@Initiala ,@Prenume ,@Sex ,@DataNastere
8 WHILE @@FETCH_STATUS=0 BEGIN
9 PRINT (' ADEVERINTA')
10 PRINT (' ')
11 PRINT (' ')
12 PRINT ('Prin prezenta se adevereste ca'+' '+@Nume+' '+@Initiala+‘ '+@Prenume+' este student')
13 PRINT ('al facultatii de Automatizari,Calculatoare si Electronica')
14 PRINT (' ')
15 PRINT (' ')
16 PRINT (' '+CONVERT(char(10), GETDATE(),103)+'
17 DECAN')
18 PRINT (' Prof. dr. ing. Bobasu Eugen’)
19 PRINT (' ')
20 PRINT (' ')
21 FETCH NEXT FROM cursDatePersonale INTO @Nume, @Initiala, @Prenume, @Sex, @DataNastere
22 END
23 CLOSE cursDatePersonale
24 DEALLOCATE cursDatePersonale
25 GO
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-17
Utilizarea fluxului de date
1
2
3
4
5
6
7 @Nume ,@Initiala ,@Prenume ,@Sex ,@DataNastere def @@FETCH_STATUS def
8 @@FETCH_STATUS p-use
9
10
11
12 @Nume,@Initiala,@Prenume c-use
13
14
15
16 GETDATE() def, c-use
17
18
19
20
21 @Nume, @Initiala, @Prenume, @Sex, @DataNastere def @@FETCH_STATUS def
22
23
24
25
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-18
Utilizarea fluxului de date
Tabel pentru @nume
Tabel pentru @@FETCH_STATUS
ID pereche
def
use
ID pereche
def
use
1
7
12
1
7
8
2
21
12
2
21
8
ID pereche
def
use
1
7
12
2
21
12
ID pereche
def
use
1
7
12
2
21
12
Tabel pentru @prenume
Tabel pentru @initiala
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-19
Testarea ciclurilor
Dacă ciclul are de la 0 la n iterații, cazurile de test dezvoltate vor fi:
0 iterații;
o iterație;
două iterații;
k iterații k<n;
n iterații
n+1 iterații (dacă este posibil).
Dacă ciclul are de la n1 la n2 iterații, se va testa şi pentru k=n1-1.
Dacă este posibil, se va testa şi pentru n2+1.
Se vor avea ȋn vedere şi valori negative ale variabilei de ciclare.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-20
Testarea mutațiilor
Se consideră ca bază pentru generarea datelor de test şi pentru evaluarea
eficienței testării, defectele care ar putea să apară ȋn componenta testată.
Sunt luate ȋn considerare două ipoteze de lucru:
Ipoteza programatorului competent. Programatorii sunt profesionişti,
cunosc limbajele utilizate şi scriu programe aproape perfecte. Apar doar
puține erori simple.
Efectul de cuplare. Se consideră că testele suficient de puternice pentru
a pune ȋn evidență toate programele care diferă de programul testat doar
prin erori simple, vor face față şi detectării unor erori complexe.
Testarea mutațiilor are ca punct de plecare:
codul original al compnentei testate;
cazurile de test asociate;
rezultatele testului.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-21
Testarea mutațiilor
Vom numi mutant orice program obținut din cel original prin modificarea
unui operand, a unei constante sau a numelui unei variabile.
Testul original se aplică mutantului.
Dacă se obține un rezultat diferit de cel obținut cu programul original,
defectul a fost detectat şi spunem că mutantul a fost ucis.
Dacă mutantul produce aceleaşi rezultate ca şi programul original, testul
trebuie completat cu alte date de test pentru a ȋncerca să omorâm mutantul.
Există situații ȋn care nu există nici un caz de test prin care să putem distinge
programul original de mutant. În acest caz spunem că cele două programe
sunt echivalente.
Fie P un program şi Pi un mutant neechivalent al lui P. Se spune că un set de
teste T este corespunzător pentru mutații dacă pentru orice Pi există un caz de
test tT astfel ȋncât Pi(t)P(t).
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-22
Testarea mutațiilor
Măsura ȋn care un set de teste T este adecvat mutațiilor pentru programul P se
calculează cu relația:
MS(P,T)=număr_mutanți_ucişi/(număr _total_mutanți - număr_mutanți _echivalenți)
Varianta prezentată mai sus reprezintă testarea tare a mutațiilor.
Dacă se iau ȋn considerare numai anumite elemente afectate de mutații, se spune
că avem o testare slabă a mutațiilor.
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-23
Ordonarea parțiala a criteriilor de testare
Toate caile
Mutatii tari
Toate caile def-use
Mutatii slabe
Toate use
Toate c-use,
unele p-use
Toate c-use
Toate p-use,
unele c-use
Toate def
Toate p-use
Toate ramurile
Toate
instructiunile
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-24
2010
TSCR -curs-
Ionescu Augustin-Iulian
6-25