Sunteți pe pagina 1din 22

Vericare si validare software

Testare white-box. Acoperire cu teste


10 octombrie 2011

Testarea white-box

Genereaz a teste bazat pe structura intern a a codului Alte denumiri: glass box, clear box, open box Terminologie alternativ a testare comportamental a (black-box) / structural a (white-box) Comparat ie: black-box: la orice nivel / white-box: mai ales la nivel de modul white-box: modicarea codului modicarea testelor white-box: u sureaz a detectarea erorilor de codare, dar nu poate detecta erori de omisiune ( n cod sau specicat ii)

Structura unui program: terminologie

Graful de ux de control (control ow graph) Reprezentare sub form a de graf a structurii programului si implicit a c ailor sale de execut ie Noduri = instructiuni Muchii (evtl. etichetate cu condit ii): secvent ierea ntre instruct iuni Uzual, instruct iunile n linie dreapt a: grupate mpreun a basic block = secvent a de instruct iuni cu un singur punct de intrare si de ie sire (f ar a salturi n mijlocul codului, sau din mijloc afar a)

Acoperirea prin teste: (code) coverage

= criteriu pentru a m asura dac a un set de teste e adecvat La ce bun astfel de criterii ? [ Burnstein ] Ce propriet a ti ale programului s a examin am ? Ce date de test select am pentru aceste propriet a ti ? Ce obiective cantitative stabilim pentru testare ? S-a testat sucient sau nu ?

Idealul (... de neatins)

= testarea tuturor execut iilor programului adic a a tuturor c ailor prin graful de ux de control (CFG) Dar: num arul c ailor prin program e n general innit (cicluri, etc.) trebuie s a ne multumim cu criterii structurale mai modeste dar nu la nt amplare trebuie alese judicios

Acoperirea la nivel de instruct iune

statement coverage (line coverage, basic block coverage) Teste suciente pentru a executa ecare instructiune de program Criteriu evident necesar (cod neexecutat = cod netestat) De regul a evident si insucient char a[5], *s = NULL; if (len < 5) s = a; *s = t; Un test cu len = 4 acoper a toate instruct iunile; nu g ase ste eroarea

Acoperirea la nivel de ramicat ie

branch coverage (decision coverage) Testeaz a ecare valoare posibil a a unei decizii (true/false) Def. mai precis a: testeaz a si ecare intrare/ie sire din program n general, implic a acoperirea instruct iunilor (ecare instruct iune e pe o ramur a; v. except ie mai jos) In categoria deciziilor / ramicat iilor se includ: instruct iuni switch/case (ramicat ii multiple) generarea de except ii Atent ie: funct ii sau efecte laterale n expresii de decizie if (a && (b || f(x, y)) nu executa f dac aa si b sunt adev arate

Acoperirea la nivel de condit ie

condition coverage O condit ie e o expresie boolean a elementar a dintr-o decizie Necesit a teste pentru ecare valoare posibil a a ec arei condit ii Aparent mai complex a dec at decision coverage, dar NU o include! Exemplu: if (x > 5 && y == 3) { /* ceva cod */ } Dou a teste: x = 6, y = 2 si x = 4, y = 3 genereaz a toate valorile posibile ( T si F, respectiv F si T) Dar n ambele cazuri, decizia urmeaz a ramura fals

Acoperirea mixt a decizie/condit ie

condition/decision coverage Necesit a acoperirea simultan a a ambelor criterii Fat a de cele dou a criterii individuale poate necesita teste suplimentare, sau doar recombinarea lor de ex. pentru if (x > 5 && y == 3) /* ceva cod */ se poate atinge tot cu dou a teste: x = 6, y = 3, si x = 4, y = 2 Poate insucient a: efectul unor condit ii le poate masca pe altele

Multiple condition coverage

Testeaz a toate combinat iile posibile pentru subexpresiile deciziei Exponential a in numarul de conditii (2n teste pentru n condit ii) adesea nefezabil de implementat Practic, toate cele 2n combinat ii pot irealizabile (c and condit iile nu sunt independente) pot irelevante (limbaje cu evaluare n scurt-circuit) n general, cerint a nu se justic a

Modied Condition/Decision Coverage

Unul din cele mai puternice criterii; dezvoltat la Boeing, e o cerint a pentru software n domeniul aeronautic (standard DO-178B) Cerint ele complete pentru o suit a de teste MC/DC: Toate punctele de intrare si ie sire din program atinse Fiecare decizie exercitat a pe ambele ramuri Fiecare condit ie ia ambele valori Fiecare condit ie e dovedit a s a afecteze decizia din care face parte (se p astreaz a xe cel alalte condit ii, variind condit ia de interes)

Modied Condition/Decision Coverage (contd)

Construirea unei suite MC/DC: Pentru a && b sunt necesare testele: f t Pentru a || b sunt necesare testele: f f

tf ft

tt tf

Suita rezultat a e aceea si pentru evaluare scurt-circuit sau nu. a b a && b f t f (1) t f f (2) t t t (3) Indic am perechea de teste din suit a relevant a pentru ecare condit ie: (1) si (3) arat a c a a poate inuent a decizia (2) si (3) arat a c a b poate inuent a decizia

Construirea unei acoperiri MC/DC


Un test e un sir de valori f si t pentru cele n variabile. Form am recursiv testele pentru o formul a al atur and testele ( sirurile) pentru subformule. In lista L de teste pentru o expresie, marc am un test F cu rezultat f, si un test T cu rezultat t. Cazul de baz a: o singur a variabil a: F = f, T = t, R = (doar 2 teste). Cazul e1 && e2 . Al atur am testele pentru e1 si e2 : - combin am lista L1 \ {T1 } cu T2 (vor avea aceea si valoare ca n L1 , pentru c a e2 = T ). Din acestea, marc am F = F1 T2 ca test cu valoarea f. - simetric, combin am T1 cu toat a lista L2 \ {T2 } - form am testul T = T1 T2 care d a valoarea t. Cazul e1 || e2 . Similar: - form am testul F = F1 F2 care d a valoarea f. - combin am testul F1 cu lista L2 \ {F2 }, si lista L1 \ {F1 } cu testul F2 . Din acestea, marc am T = T1 F2 ca test cu valoarea t.

Exemplu
Fie formula a && b && (c || d && e) Aplic am regula pentru a b a && b Fab f t f t f f Tab t t t cu perechile a: (0, 2) && la testele Fa = f , Ta = t , Fb = f , Tb = t : d e d && e (0) Fde f t f (0) si la fel (1) t f f (1) (2) Tde t t t (2) b: (1, 2) perechi: d: (0, 2) e: (1, 2)

Form am acum testele pentru c || (d && e) Color am fragmentele care provin din testele Fc , Fde , Tc c d e c || d && e perechi de teste Fcde f f t f (0) c: (0, 3) f t f f (1) d: (0, 2) f t t t (2) e: (1, 2) Tcde t f t t (3)

Exemplu (continuare)

Combin am testele construite pentru a && b si c || d && e. Am marcat folosirea testelor Fab si Tab , Tcde . F a f t t t t t b t f t t t t c t t f f f t d f f f t t f e t t t f t t rez f f f f t t (0) (1) (2) (3) (4) (5) perechi de teste a: (0, 4) b: (1, 4) c: (2, 5) d: (2, 4) e: (3, 4)

Din construct ie reiese direct c a n variabile necesit a n + 1 teste.

Acoperirea bazat a pe predicate

predicate(-complete) coverage, [T. Ball, 2004] Criteriile anterioare: NU coreleaz a ntre ele deciziile. ex. combinat ii a dou a decizii succesive n program necesar un criteriu mai apropiat de path coverage (care ar acoperi toate c aile de execut ie) Se identic a n predicate (condit ii) relevante n program Se ncearc a generarea tuturor combinat iilor posibile din cele S 2n (S st ari = locat ii n program, n predicate) coreleaz a ntre ele toate condit iile si locat iile din program

Predicate coverage: exemplu [T. Ball]


void partition(int a[], int n) { // assume(n>2); int pivot = a[0]; int lo = 1, hi = n-1; while (lo <= hi) { while (a[lo] <= pivot) lo++; while (a[hi] > pivot) hi--; if (lo < hi) swap(a,lo,hi); } }

E corect ? Detectat i o eroare ? Predicate relevante; condit iile din program: lo <= hi, lo < hi, a[lo] <= pivot, a[hi] > pivot

Criterii de acoperire pentru cicluri

[ Beizer, Software Testing Techniques ] Pentru cicluri simple: zero iterat ii (nu se intr a n ciclu) suplimentar: contor negativ: se comport a corect ? o iterat ie dou a iterat ii (poate prinde erori de init ializare) o valoare tipic a intermediar a N-1 iterat ii N iterat ii se ncearc a N+1 iterat ii (mai mult dec at nr. maxim presupus) Pentru minim nonzero: se ncearc a min-1, min, min+1 ...

Acoperire pentru cicluri multiple [ Beizer]

1. num ar minim de iterat ii exterioare testat i complet ciclul interior (ca si ciclu independent) 2. continu a merg and n exterior pentru cicluri: cu ciclurile interioare la o valoare tipic a si variind ciclul curent 3. n nal, variaz a simultan toate ciclurile de la min la max

Acoperirea prin mutat ii

Se ncearc a modicarea deciziilor / instruct iunilor dup a anumite tipare, pentru a se detecta dac a programul functioneaz a diferit Exemple: < modicat n <= , etc. +1 modicat n -1 sau ignorat limite modicate cu 1 a || b modicat n a, resp. b (e relevant testul eliminat?); la fel pentru a && b Dac a vreo mutat ie nu e prins a m acar de un test: e testele sunt insuciente e programul e potent ial gresit (sau are cod irelevant)

Criterii de acoperire pentru date

Criteriile de p an a acum: legate de uxul de control al programului O alternativ a: criterii legate de uxul de date (dataow coverage) Not iuni cheie: denirea unei variabile (def): un loc unde e atribuit a utilizarea unei variabile (use): un loc unde e citit a (folosit a ntr-o expresie, testat a ntr-o condit ie) diverse criterii de acoperire, ex.: all-defs, all-uses def-use coverage: acoperire cu un caz de test pentru ecare pereche (fezabil a) de denire-utilizare

C at de relevant a e acoperirea ?

complexitatea ciclomatic a a CFG-ului. Def. ntr-un graf, complexitatea ciclomatic aeE-V+2 (E = nr. de muchii, V = nr. de noduri) m asur a bun a pt. complexitatea unui program dorim acoperire mai mare pt. fragmentele mai complexe