Documente Academic
Documente Profesional
Documente Cultură
TESTAREA PROGRAMELOR OO
1.1. INTRODUCERE N TESTAREA POO
Introducere n testare
Testarea software este o etap important i plin de provocri din dezvoltarea programelor.
n cadrul acestui proces sunt descoperite evidene ale defectelor i se verific dac programul
este conform cu specificaiile. Testarea nu trebuie confundat cu depanarea, -care implic
descoperirea surselor erorilor-, i nici cu etapa de corectare a erorilor.
Testarea este o parte necesar (dar insuficient) din asigurarea calitii programelor.
Asigurarea calitii cuprinde activiti destinate prevenirii i nlturrii defectelor, iar testarea
poate contribui la mbuntirea calitii prin identificarea problemelor devreme n procesul de
dezvoltare, nainte de scrierea codului. Testarea nainte de scrierea codului presupune o
munc mai strns a dezvoltatorilor cu testerii i viceversa.
Perspectiva testrii este atitudinea testerului, care are sarcina dificil de a pune sub semnul
ntrebrii toate aspectele legate de softul testat. Fr a citi codul, un tester trebuie s
anticipeze greelile i optimizrile pe care le poate face un dezvoltator i apoi s construiasc
teste pentru detectarea acestora. De aceea, n multe privine, a fi un tester bun este mai dificil
dect a fi un dezvoltator bun, ntruct testarea solicit o bun nelegere a procesului de
dezvoltare i a produselor sale dar i abilitatea de anticipa erori posibile. Cutarea greelilor
trebuie ghidat att de cutarea sistematic, ct i de intuiie iar scopul final este de a
demonstra faptul c un soft se comport conform specificaiei sale, i nu execut nimic din
ceea ce nu i se cere s execute.
Importana testarii rezid nu doar din faptul c aceasta ofer o asigurare c un sistem software
face ceea ce trebuie s fac (i nimic n plus) dar i din asigurarea utilizatorilor mpotriva
cderilor programului ce pot duce la pierderi de timp, proprieti, clieni, sau chiar viei.
Scopul procesului este scrierea de programe mai mentenabile, reutilizabile, flexibile, etc.
Ne vom ocupa n cadrul primului capitol de testarea sistemelor orientate obiect, structurate pe
componente. Acestea au avantajul c testarea poate ncepe din timpul dezvoltrii sistemului
(testarea modelelor de analiz i design) ceea ce reduce costurile i sporete eficiena. Vom
urmri ce, cnd i cum testm n programele orientate obiect, comparativ cu testarea
procedural (spre exemplu, motenirea i polimorfismul introduc noi provocri testerilor), i
vom presupune ca procesul de dezvoltare al programului este incremental.
Noiunile de testare prezentate sunt utile programatorilor, -care deja testeaz software, dar vor
s cunoasc mai multe despre testarea programelor orientate obiect; dar i managerilorresponsabili cu dezvoltarea software, care doresc s tie cum i unde testarea se ncadreaz n
planul global. De asemenea, dezvoltatorii sunt rspunztori cu testarea programelor pe care le
produc, i trebuie s considere testarea n timpul analizei, design-ului i activitilor de
implementare.
Scenariul de dezvoltare software
Vom presupune n continuare ca procesul este incremental, cu iteraii la fiecare etap
(increment) (modificri n modul de dezvoltare a programului introduc implicit modificri n
maniera de testare). n plus, vom considera i c dispunem de modelele software n UML, i
Analizeaz puin.
Creeaz puin din design.
Implementeaz puin.
Testeaz ce poi.
(Testeaz ce poi include ceea ce poi tehnic face, n condiiile constrngerilor de timp i
resurse).
Un avantaj al sistemelor dezvoltate incremental este faptul c testarea se poate face la sfritul
fiecrei etape. Pentru un program orientat obiect exista urmtoarele tipuri de testri:
Testarea modelului
Testarea claselor
Testarea interaciunilor
Testarea sistemului (i subsistemelor)
Testarea acceptrii
Testarea n situaii finale
Plan A
Plan B
receptor
emitor
Valoare ntoars/ exceptie
Figura
Din perspectiva testrii orice mesaj are un emitor -care decide cnd trimite mesajul, i poate
grei n aceasta decizie i orice mesaj are un receptor -care poate nu este (nc) pregtit pentru
mesajul primit. n plus, orice mesaj poate include parametri actuali, folosii de receptor n
prelucrarea mesajului. Obiectele folosite ca parametri trebuie s se afle n starea corect
nainte (i dup) procesarea mesajului, i trebuie s implementeze interfaa ateptat de
receptor.
3. Interfaa este o agregare de declaraii de comportament, nrudite n raport cu un anumit
concept. O interfa este un set constructiv pentru specificaii, ce definete mulimea complet
a comportamentelor publice ale unei clase. n Java exist conceptual dedicat de interface,
iar n C++ o interfa este o clas de baz abstract, doar cu metode pur virtuale, publice.
Interfeele ncapsuleaz specificaii de operaii, specificaii ce vor sta la baza construirii de
clase; i dac interfaa cuprinde comportamente nerelaionate cu ansamblul, implementarea va
avea un design nesatisfcator. Interfaa trebuie privit i prin prisma relaiilor sale cu alte
interfee/ clase: ea se poate specifica drept tipul unui parametru al unui comportament, pentru
a permite ca orice implementator al interfeei s fie folosit ca parametru.
4. Clasa reprezint o mulime de obiecte cu aceeai baz conceptual, constituind un element
de baz n definirea programelor orientate-obiect, n timp ce obiectele sunt elemente de baz
n executarea programelor orientate-obiect. Crearea de obiecte definite de o anumit clas se
numeste instaniere (un obiect este o instan a unei clase). Specificaia unei clase definete ce
poate s fac fiecare obiect al clasei, iar implementarea clasei descrie cum face fiecare obiect
ceea ce face. n C++ fiierele header (.h) descriu specificaia, iar fiierele surs (.cpp) conin
implementarea (Figura). n Java, dei specificaia i implementarea sunt n acelai fiier,
exist totui o separaie logic ntre ce i cum.
Clasele statice. Din perspectiva testrii, o clas cu membri statici trebuie tratat ca un obiect,
i trebuie creat o succesiune de teste att pentru clas n sine, ct i pentru instanele sale.
Trebuie s fim ntotdeauna sceptici n legtur cu datele statice, non-constante, asociate cu o
clas, deoarece acestea pot afecta comportamentul instanelor.
I. Specificaia unei clase definete ce reprezint clasa, ce poate o instan a clasei s fac, si
include cte o specificaie pentru fiecare operaie a clasei.
Operaie = aciune ce poate fi aplicat unui obiect, cu un anumit efect. Operatiile se clasifica
n:
Operaii inspector (accesator)- care furnizeaz informaii despre obiecte, fr a
le modifica (valori ale unor date membru, starea obiectului etc.). (n C++ ele
trebuie declarate const);
Operaii modificatoare- care schimb starea unui obiect prin modificarea
valorii unor atribute ale obiectului
Testarea operaiilor inspector difer de a operaiilor modificator. Exist operaii care sunt i
inspectori, i modificatori, i operaii care execut modificri doar n anumite condiii, i pe
care le vom clasifica drept operaii modificator. Este o bun decizie de design OO ca o
operaie s fie ori modificator, ori inspector, dar nu ambele n acelai timp, acest aspect
uurnd testarea. Constructorii (ce iniializeaz instane noi) i destructorii (care efectueaz
procesrile necesare nainte de sfritul vieii obiectului) sunt diferii de accesatori i
modificatori prin faptul c sunt implicit invocai la crearea/ distrugerea obiectelor (unele
invocri sunt vizibile n program, unele nu).
Exemplu:
X=a+b+c
Tmp1=a+b;
Tmp2=tmp1+c;
X=tmp2
Specificarea operaiilor. Fiecare operaie din specificaia clasei trebuie s aib ataate un
neles i nite constrngeri (fiecare operaie s aib o specificaie care descrie ce face
aceasta). O bun specificare a semanticii operaiilor este critic att pentru dezvoltare ct i
pentru testare. Semantica trebuie specificat n diferite puncte:
Precondiii
Postcondiii
Invariani
Precondiiile unei operaii descriu condiii ce trebuie s fie ndeplinite nainte ca operaia s
se poat executa, si se exprim n termenii atributelor obiectului ce conine operaia i/sau
atributelor parametrilor actuali ai mesajelor ce solicit executarea operaiei.
Postcondiiile unei operaii descriu condiii ce trebuie s fie ndeplinite dup execuia
operaiei, i se exprim n termeni de:
atributele obiectului ce conine operaia;
atributele parametrilor actuali ai mesajului ce solicit execuia operaiei;
o valoare de rspuns a operaiei i/sau
excepiile ce pot apare
Invarianii descriu condiii ce trebuie ndeplinite constant pe parcursul duratei de via a
obiectului. Un invariant de clas descrie o mulime de granie operaionale pentru o instan a
unei clase, fiind o postcondiie implicit pentru fiecare operaie (dar invarianii pot fi nclcai
n timpul execuiei). Acetia se pot exprima n termeni de atribute/stri ale obiectului.
Programarea defensiv. n acest caz, interfaa se definete n primul rnd din perspectiva
primitorului, i a presupunerilor fcute de acesta asupra strii sale, i asupra valorii intrrilor
(argumente sau valori de date globale), la momentul cererii. Operaiile ntorc o indicaie
asupra strii cererii: succes/ eec pentru un anumit motiv (valoare de intrare greit). Scopul
principal al programrii defensive este s determine garbage in pentru a elimina garbage
out. Dezavantajele acestei abordri sunt:
mrete complexitatea software: transmitorul trebuie s corecteze n funcie de
ieirile posibile ale operaiei (lipsa de ncredere nu poate fi doar de partea
primitorului, ci i a transmitorului -care verific ieirile operaiei);
Crete dimensiunea codului i a timpului de execuie.
n concluzie, programarea defensiv reflect o lips de ncredere a transmitorului fa de
primitor, iar n programarea contractual, responsabilitatea e mprit mutual ntre
transmitor i primitor (primitorul proceseaz o cerere pe baza unor intrri presupuse a
ndeplini precondiiile, iar transmitorul presupune postcondiiile ndeplinite dup procesarea
cererii). Cele dou tehnici se pot combina. Design-ul interfeelor prin programare contractual
elimin necesitatea ca primitorul s verifice precondiiile deci programarea contractual este
mai eficient din perspectiva programului i programatorului, dar dezavantajul este ca n
contextul execuiei programului, nu putem fi siguri de respectarea contractului. Aadar,
trebuie ca toate interaciunile s fie testate n programarea contractual.
Deci, prin prisma testrii, programarea contractual simplific testarea claselor dar complic
testarea interaciunilor (trebuie s ne asigurm c fiecare transmitor ndeplinete
precondiiile), n timp ce programarea defensiv complic testarea claselor (cazurile de test
trebuie s acopere toate rezultatele posibile) dar i testarea interaciunilor (trebuie s ne
asigurm c se produc toate rezultatele posibile i c sunt tratate corect de transmitor).
O idee ce vine n sprijinul testrii este aceea de a verifica din timpul design-ului dac
precondiiile, postcondiiile i invarianii sunt testabili:
Sunt constrngerile exprimate clar?
Specificaia include metode de verificare a precondiiilor?
Din perspectiva testrii, n programarea contractual trebuie testate doar situaiile n care
precondiiile sunt satisfcute, iar n programarea defensiv trebuie s testm fiecare intrare
posibil pentru a verifica dac ieirea este tratat corespunztor.
referii polimorfic, (aceasta mrete numrul de tipuri posibile de parametri ce trebuie testai)
i permite unei operaii s specifice rspunsuri sub forma de referine polimorfice (aici clasa
real a referinei pote fi incorect sau neateptat pentru transmitor).
O prim conlcuzie important este c natura dinamic a limbajelor orientate obiect acord mai
mult importan testrii unei suite de configuraii din timpul execuiei.