Documente Academic
Documente Profesional
Documente Cultură
Testarea este necesară și pentru programele scrise într-un limbaj “static” (pentru care se fac
verificări de corectitudine la compilare), dar cu atât mai mult pentru programe scrise într-un limbaj
dinamic și care nu beneficiază de verificările efectuate de un compilator.
În cursul dezvoltării unei aplicații, codul evoluează (fie datorită modificării cerințelor, fie prin
reproiectare sau prin refactorizare), dar prin teste ne putem asigura că acest cod modificat continuă să
respecte cerințele impuse (că este corect).
De ce Unit Testing?
1.Ajută dezvoltatorii să înțeleagă baza de cod și le permite să facă modificări rapide.
3.Testele unitare ajută la reutilizarea codului. Reutilizând atât codul, cât și testele către un nou proiect.
Modificând codul până când testele rulează din nou.
Scrierea de teste unitare, înainte de scrierea codului efectiv, încurajează coeziunea și un cuplaj
slab, în sensul că vom prefera pentru testare să definim clase și metode mai mici (care un singur rol în
aplicație) și cu mai puține dependențe între ele, astfel ca să poată fi testate izolat fiecare.
Cuplajul unei unități de cod poate fi de două feluri:
- Unitatea testată depinde de alte unități
- Alte unități de cod depind de unitatea testată
Este posibil ca unitatea de care depinde secvența testată (o resursă) să nu fie încă disponibilă, să
fie costisitor de utilizat sau să fie impredictibil în comportare. În aceste cazuri se folosesc obiecte
surogat de tip "stub" sau "mock" în locul unui "colaborator" din aplicația reală.
Obiectul surogat poate corespunde unui singur obiect din aplicația finală, unei componente,
unui nivel sau unui subsistem din aplicație.
Un obiect "stub" mimează parțial comportarea unui obiect real (indisponibil), prin transmiterea
unui răspuns corespunzător la fiecare cerere primită (printr-un apel de metodă), fără a ține seama de
succesiunea acestor cereri.
Un obiect "mock" mimează mai bine comportarea obiectului real, pentru că ține cont de
secvența apelurilor și de numărul lor, deci simulează întreaga interacțiune cu obiectul testat.
Testarea unitară în Java este facilitată de existenta mai multe produse software de tip “Test
Framework” dintre care mai folosite sunt JUnit, EasyMock, s.a.
În plus, cele mai importante IDE-uri (Eclipse, NetBeans, IDEA) facilitează efectuarea de teste
prin crearea unui subdirector pentru metodele de test, printr-o comandă (opțiune) de testare aplicație
(alta decât comanda “Run” pentru execuția aplicației) și prin afișarea în mod grafic a rezultatelor
testelor. Atunci când testele eșuează, nu se afișează toată secvența de apeluri de metode care a condus
la eroare “AssertionError” (așa cum se întâmplă în linia de comandă sau când se folosește un IDE mai
simplu care nu are regim special pentru testare unitară).
Elementele de testare unitară, pun la dispoziție unelte pentru a înregistra și repeta teste, pentru
ca testele unitare sa poată fi repetate ușor mai târziu (de regulă când se schimbă o parte din sistem)
astfel încât dezvoltatorul să fie convins ca noile modificări nu au stricat vechea funcționalitate. Acest
lucru mai este cunoscut ca testare regresivă.
Conceptele testării unitare și testării regresive sunt destul de vechi, dar popularitatea lor a
crescut brusc de curând, după apariția unei unelte de testare unitară pentru Java: JUnit.
Testarea unitară se referă la scrierea unor bucăți de cod, denumite cod de testare, care validează
codul de producție. Testarea majorității aplicațiilor devin așadar automată.
Platforme de testare
● C++
- CPPUnit
- Boost.Testing library
- CxxUnit
● Java
- JUnit
- TestNG
● .NET (C#, VB.NET, etc.)
- NUnit
Teste unitare
Pentru a fi rapide, testele unitare folosesc adesea așa-numitele "duble de testare". La fel cum
piloții de avioane învață într-un simulator înainte de a se urca în avion, testele unitare folosesc bucăți
de cod care seamănă cu codul de producție, dar în realitate folosesc doar la teste. Stub-urile și mock-
urile sunt cele mai întâlnite duble de testare, existând multe altele mai puțin folosite.
Un stub este o dublă de testare care întoarce valori. Stub-ul este similar cu o simulare foarte
simplă: atunci când apeși un buton, apare o valoare.
Un mock este o dublă de testare care validează colaborarea între clase. Mock-ul validează
apeluri de metode, cu anumiți parametri, de un anumit număr de ori. Din această cauză, un mock poate
fi folosit și la validarea apelurilor de metode care nu întorc valori.
Majoritatea unităților de program supuse testelor depind de alți “colaboratori” care pot fi unități
locale (alte metode din aceeași clasă), pot fi parametri ai metodelor testate sau pot fi chiar metode
aflate în alt calculator. Pentru a testa unități cu dependențe de alte unități trebuie înlocuiți colaboratorii
cu obiecte surogat (“stub” sau “mock”). Obiectele surogat se folosesc în testele unitare si vor fi
înlocuite cu obiecte reale în testele de integrare.
Crearea de obiecte surogat în Java se poate face în două feluri:
- Manual, prin scrierea metodelor clasei surogat;
- Automat (dinamic) utilizând un “framework” ca EasyMock, JMock, ș.a.
Clasa surogat scrisă manual trebuie să aibă aceleași metode cu clasa pe care o înlocuiește; acest
lucru se poate face prin extinderea clasei colaborator și redefinirea metodelor sau prin implementarea
unei interfețe definite în scopul testării.
In Java, pentru a facilita trecerea de la teste unitare la teste de integrare se folosesc fie interfețe
(pentru comunicarea cu obiectele surogat), fie obiecte de tip proxy, care interceptează cererile și le
dirijeaz ă fie către obiecte surogat, fie către obiecte reale.
Schema următoare arată o interfață între codul testat și codul de care depinde sau codul surogat
(care înlocuiește în teste codul real).
EasyMock este un framework de testare pentru aplicații Java care generează dinamic clase si
obiecte surogat si poate verifica ordinea apelurilor metodelor din obiectul surogat.
Dublele de testare pot fi create și folosind framework-uri speciale, cum ar fi mockito pentru
Java (a fost portat și pe alte limbaje) sau moc pentru .NET.
Inițial dublele de testare erau folosite doar în locurile unde era foarte greu să controlezi sistemul
sau unde testele erau încetinite de apeluri la sisteme externe. În timp, dublele de testare au ajuns să fie
folosite în toate testele unitare, dând naștere metodei "mockiste" de testare unitară.
Testele unitare sunt scrise de programator, în timp ce implementează o funcționalitate. Din
păcate, cel mai întâlnit mod de a scrie teste este cândva după ce a fost terminată implementarea.
Rezultatul este că testele sunt scrise având în minte cum ar trebui să funcționeze codul și nu testarea
lui.
Test „First Programming” este o metodă de a scrie teste care implică următorii pași:
crearea unui design pentru implementarea funcţionalităţii;
crearea minimului de cod necesar (compilabil, dacă limbajul folosit este
Prin aplicarea testului „First Programming”, programatorii se asigură că scriu teste unitare și că
testează ceea ce ar trebui să rezolve, nu implementarea soluției.
teste.
Programatorii trebuie să poată "mânui" fără teamă unelte precum: stub-uri, mock-uri,
teste de stare, teste de colaborare, teste de contract. De asemenea, programatorii trebuie să
înțeleagă ce cazuri merită și trebuie testate.
Greșeli comune
fost create. Dublele de testare ajută la obținerea unor teste scurte și rapide.
Numele testelor nu exprimă comportamentul testat. Numele testului poate da
exotice.
Cod de testare neîngrijit. Codul de testare este cel puțin la fel de important ca și
codul de producție, și trebuie întreținut cu aceeași grijă.
Dezvoltatorii care doresc să afle ce funcționalitate oferă o unitate și cum să o folosească pot
examina testele unitare pentru a obține o înțelegere de bază a API-ului unității.
Testarea unitară prin natura sa se concentrează pe o unitate de cod. Prin urmare, nu poate
detecta erori de integrare sau erori la nivel de sistem.
Elementele de testare unitara va pun la dispozitie unelte pentru a inregistra si repeta teste, pentru
ca testele unitare sa poata fi repetate usor mai tarziu (de regula cand se schimba o parte din sistem), astfel
incat dezvoltatorul sa fie convins ca noile modificari nu au stricat vechea functionalitate. Acest lucru e
cunoscut ca testare regresiva.
Conceptele testarii unitare si testarii regresive sunt destul de vechi, dar popularitatea lor a crescut brusc
de curand, dupa publicarea metodologiei de programare eXtreme si dupa aparitia unei unelte de testare
unitara pentru Java: JUnit.
Dezvoltarea bazată pe teste (TDD=Test Driven Development) este metodologia în care testele unitare se
scriu înainte de a scrie codul unitătilor testate. Scrierea timpurie a testelor este o activitate de proiectare ,
deoarece necesită întelegerea cerintelor si poate conduce la refactorizrea codului. TDD impune gândirea
codului în functie de intentiile lui si nu în functie de implementare.
Scrierea de teste unitare, înainte de scrierea codului efectiv, încurajează coeziunea si un cuplaj slab, în
sensul că vom prefera pentru testare să definim clase si metode mai mici (care un singur rol în aplicatie) si
cu mai putine dependente între ele, astfel ca să poată fi testate izolat fiecare.
Testarea unitara s-a impus in ultima perioada in dezvoltarea proiectelor scrise in limbajul Java ,pe masura
aparitiei unor utilitare gratuite de testare a claselor, care au contribuit la cresterea vitezei de programare si la
micsorarea drastica a numarului de bug-uri.
Cel mai folosit utilitar pentru testarea unitara a claselor Java este JUnit, mai este si TestNG, care se poate
descarca gratuit de pe site-ul http://www.junit.org . Arhiva este destul de mica si include un director
(junitxxx) cu documentatie (in directorul doc), documentatia API (in directorul javadoc), biblioteca de clase
junit.jar si exemple de clase de test (in directorul junit).
Metodele setUp() si tearDown() servesc la initializarea si distrugerea oricarui obiect utilizat in cadrul
testelor. Fiecare test ruleaza intr-un context propriu si apeleaza metoda setUp() inainte si metoda
tearDown()dupa fiecare metoda de test pentru a evita efectele secundare dintre teste.
Instantele TestCase se pot compune sub forma unor ierarhii TestSuite ce vor invoca automat toate metodele
test123() definite in fiecare instanta TestCase. O clasa TestSuite poate fi compusa din alte teste, instante
TestCase sau alte instante TestSuite.
Testarea unitară verifică, pentru fiecare unitate de program, faptul că, pentru anumite date initiale,
rezultatele sunt cele asteptate. In acest scop se scrie pentru fiecare metodă testată o functie de test în care se
folosesc asertiuni.
In functiile de test se folosesc în general obiecte ale clasei testate; aceste obiecte pot fi create în interiorul
metodei sau în afara metodelor de test. In acest scop sunt prevăzute în clasa de test metodele cu numele
“setUp” si “tearDown” (JUnit 3) sau metode cu orice nume dar adnotate cu @Before si @After. Metoda
“setUp” creează obiectele necesare metodelor de test si initializează variabile ale clasei care vor fi folosite în
metodele de test, înainte de fiecare test. Metoda pereche “tearDown” anulează operatiile din “setUp” si reface
starea initială, dacă e necesar.
Mai multe clase de test formează o suită de teste (“TestSuite”) care se execută automat, în câteva moduri
posibile:
Clasa “TestCase” extinde, la rândul ei, clasa “Assert” de la care preia mai multe metode de tip “assert” cu
rolul de a verifica îndeplinirea anumitor conditii.
JUnit annotations
Annotation Description
2
Annotation Description
@Test (expected = Fails if the method does not throw the named exception.
Exception.class) Eșuează dacă metoda durează mai mult de 100 de milisecunde.
@Test(timeout = 500)
public void testTimeout() {
@Test(timeout=100)
System.out.println("@Test(timeout) can be used to enforce timeout in JUnit4 test case");
while (1 == 1) {
}
}
Această metodă este efectuată înainte de fiecare test. Acesta este utilizat pentru a pregăti mediul de testare (de exemplu, citi date de intrare, inițializa clasei).
@Before
@Before
public void method()
public void setUp() {
System.out.println("@Before method will execute before every JUnit4 test");
}
Aceasta metoda este executată după fiecare test. Este folosit pentru a curăța mediul de testare (de exemplu, de a șterge datele temporare, a restabili valorile implicite). Se poate salva, de asemenea, memorie de curățare structuri de
memorie scumpe.
@After @After
public void method() public void tearDown() {
System.out.println("@After method will execute after every JUnit4 test");
}
Această metodă se execută o dată, înainte de începerea toate testele. Acesta este utilizat pentru a efectua activități intensive de timp, de exemplu,
@BeforeClass să se conecteze la o bază de date.metoda trebuie sa fie marcata cu modificatorul static.
public static void
method() Această metodă este executat o data, dupa ce toate testele au fost finalizate. Acesta este utilizat pentru a efectua activități de curățare, de
exemplu, să se deconecteze de la o bază de date. metoda trebuie sa fie marcata cu modificatorul static.
@AfterClass
public static void
method()
@Ignore Ignoră metoda de testare. Acest lucru este util atunci când codul care stau la baza a fost schimbat, iar
cazul de testare nu a fost încă adaptată. Sau, în cazul în care timpul de executie a acestui test este
prea lung pentru a fi incluse.
@Ignore("Not yet implemented")
@Test
public void testGetAmount() {
System.out.println("getAmount");
fail("@Ignore method will not run by JUnit4");
}
Test methods
Statement Description
3
Statement Description
Lasă metoda sa eșuează. S-ar putea fi folosite pentru a verifica dacă o anumită parte a codului nu este atins sau de a avea un test de faptul că nu înainte de codul de test este pus în aplicare. Parametrul
fail(String) String este opțional
assertTrue([message], boolean
condition)
Checks that the boolean condition is false.
assertFalse([message],
boolean condition)
Testează că două valori sunt aceleași. Notă: pentru tablouri nu este verificat de referință a conținutului de tablouri.
assertEquals([String
Test that float or double values match. The tolerance is the number of decimals
message], expected, actual)
which must be the same.
assertEquals([String message],
Checks that the object is null.
expected, actual, tolerance)
assertSame([String], expected,
Checks that both variables refer to different objects.
actual)
assertNotSame([String],
expected, actual)
Fiecare metodă de tip “assert” poate avea un parametru suplimentar de tip “String” care este un mesaj
afisat în caz că asertiunea (conditia) este falsă, dar întotdeauna o metodă “assert” generează o exceptie în
caz de asertiune falsă (“AssertionFailedError”).
4
}
import org.junit.Test;
import static org.junit.Assert.*;
public class MyUnitTest {
@Test
public void testConcatenate() {
MyUnit myUnit = new MyUnit();
String result = myUnit.concatenate("one", "two");
assertEquals("onetwo", result);
}
}
@Test
public final void whenTwoNumbersAreUsedThenReturnValueIsTheirSum()
{ Assert.assertEquals(3+6, StringCalculator.add("3,6"));
}
Exemplu:
@Test
public final void
whenNegativeNumbersAreUsedThenRuntimeExceptionIsThrown() {
RuntimeException exception = null;
try {
StringCalculator.add("3,-6,15,-
18,46,33"); } catch (RuntimeException e) {
exception = e;
}
Assert.assertNotNull("Exception was not thrown", exception);
Assert.assertEquals("Negatives not allowed: [-6, -
18]", exception.getMessage());
}
Exemplu:
@Test
public final void whenAddIsUsedThenItWorks() {
Assert.assertEquals(0, StringCalculator.add(""));
Assert.assertEquals(3, StringCalculator.add("3"));
Assert.assertEquals(3+6, StringCalculator.add("3,6"));
Assert.assertEquals(3+6+15+18+46+33,
StringCalculator.add("3,6,15,18,46,33"));
Assert.assertEquals(3+6+15, StringCalculator.add("3,6n15"));
Assert.assertEquals(3+6+15, StringCalculator.add("//;n3;6;15"));
Assert.assertEquals(3+1000+6,
StringCalculator.add("3,1000,1001,6,1234"));
}
Avantaje:
Testele pot fi salvate ca documentatie;
Este mai usor de realizat refactorizarea;
Ajuta la evitarea erorilor;
Programatorii care scriu teste sunt
mai productivi;
Se reduce timpul efectiv;
Dezavantaje:
Exista probleme care nu pot fi
rezolvate prin testare(
securitate);
Complicat de implementat cind
este nevoie sa treaca testele
functionale (implemetarea
interfetei, aplicatii cu BD);
Multimea de teste poate provoca
prea multa incredere, ceea ce
cauzeaza un control mai slab.
Introducere în testarea automată
Sunt multe lucruri pe care uneltele de testare automată nu le pot face şi este important să se
cunoască aceste limitări pentru a alege calea cea mai potrivită. Un sistem de testare automată nu
poate spune când ceva "arată bine" pe ecran sau când o poză sau fereastră nu este bine încadrată.
De asemenea un test automat nu poate decide dacă logica programului are lipsuri funcţionale decât
în măsura în care au fost definite complet cerinţele aplicaţiei respective. Unele teste, mai ales
pentru aplicaţii mici şi pentru aplicaţii care se concentrează mai ales pe grafică şi nu pe business
logic, sunt mult mai uşor realizabile de către operatorul uman decât de către un computer. De aceea
trebuie alcătuit un plan bine definit al procedurii de testare, când, unde şi în ce condiţii este fiabilă
introducerea automatizării.
Tipuri de unelte pentru testarea automată
Testarea manuală şi testarea automată sunt mai degrabă două procese diferite, decât două căi
diferite de a executa acelaşi proces: dinamica lor este diferită precum şi modul de a scoate în
evidență erorile.
Testarea manuală este mai folositoare în situaţiile în care este nevoie urgent de rezultatele
unor tipuri de teste specifice şi limitate, când se doreşte ca timpul de feedback să fie foarte scurt, iar
costurile să fie relativ mici. Cum îmbunătăţirea calităţii produsului implică costuri adiţionale pentru
găsirea erorilor şi gestionarea acestora până la repararea lor definitivă, testarea manuală s-a dovedit
a fi în timp extrem de costisitoare. Testarea manuală pe scară largă presupune alocarea de resurse
hardware şi umane destul de mari, iar riscul să apară erori este amplificat de factorul uman.
Testarea automată necesită un efort iniţial mai mare pentru planificarea, organizarea şi
producerea testului, criteriul principal în obţinerea de rezultate bune fiind planificarea atentă,
amănunţită şi precisă a acestuia.
alternativă interesantă este aşa-numita "testare parţială". Această soluţie este combinaţie
de jumătate testare manuală şi jumătate testare automată, aceasta din urmă fiind folosită numai acolo
unde se pot obţine beneficii maxime.
Testarea automată se doreşte a fi soluţia ideală pentru reducerea timpului de dezvoltare şi a
costurilor. O echipă de testeri poate să pornească uneltele de testare automată, să le lase să ruleze şi
în final să colecteze şi să analizeze rezultatele. Timpul este astfel mai bine organizat şi poate fi
petrecut pentru izolarea şi raportarea erorilor.
În zilele noastre sunt multe unelte pe piaţă care pot ajuta la planificarea, execuţia şi crearea de
rapoarte în activitatea de testare. Majoritatea acestor unelte necesită cunoştinţe de specialitate
pentru a le implementa şi utiliza corespunzător. De asemenea, este bine de ştiut, că suitele
profesionale de unelte specializate în asigurarea calității oferă întotdeauna un produs de sine
stătător care preia partea de management de proiect şi pe cea de raportare a erorilor. Un asemenea
produs este de exemplu TestDirector de la firma Mercury Interactive – market leader în materie de
produse pentru asigurarea calităţii. Acest produs poate fi corelat cu diverse sisteme de control al
versiunii folosite în implementare şi poate fi configurat în aşa fel, încât rapoartele automate create
de uneltele de testare şi/sau monitorizare a aplicaţiilor să fie preluate automat în sistemul, astfel
încât citirea şi interpretarea manuală a rapoartelor de testare nu mai este necesară. Erorile sunt
parcurse și analizate de către TestDirector, care generează pe baza rapoartelor de testare email-uri,
sms sau alte modalităţi de atenţionare a echipei de implementare.
Este necesar de menţionat că un sistem ca TestDirector poate fi folosit pentru partea de
management a proiectului şi în combinaţie cu testarea manuală, caz în care informaţiile despre ceea
ce trebuie testat se formalizează drept scenarii de testare, iar rezultatele testului manual trebuiesc
introduse de către tester manual în sistem.
Soluţiile elegante pentru testarea sistemelor sofisticate sunt adesea limitate numai de
imaginaţia tester-ilor.
Testarea automată nu va putea înlocui în întregime testarea manuală şi nici nu trebuie. Tester-ii
pot să observe cum un utilizator poate interacţiona cu produsul, în timp ce un sistem de testare
automată nu poate întotdeauna să prevadă aceste acţiuni sau să găsească cea mai bună cale de a le
testa. Dacă sunt bine folosite, programele de testare automată măresc considerabil productivitatea
QA, economisesc costuri, măresc semnificativ consistenţa şi calitatea produsului şi ajută la
optimizarea şi accelerarea procesului de dezvoltare al unei aplicaţii. Deja în ţările cu tradiţie în
dezvoltarea de software există cerinţa ca toate produsele software din sectorul militar, medical,
guvernamental şi financiar să fie testate cu unul din sistemele recunoscute de testare automată, iar
rapoartele automate asupra felului cum a decurs testarea constituie baza acceptării unei aplicaţii de
către client.
2
Aspecte ce vor fi testate identifică toate caracteristicile produsului şi combinaţii de
caracteristici ce vor fi testate. Identifică specificaţiile de design, asociate cu fiecare caracteristică şi
fiecare combinaţie de caracteristici.
Aspecte ce nu vor fi testate identifică toate caracteristicile şi combinaţiile care nu vor fi
testate, precum şi motivele pentru aceasta.
Abordarea - Specifică abordarea care va asigura testarea adecvată a unui grup de
implementări. Abordarea trebuie descrisă cu suficiente detalii pentru a permite identificarea
activităţilor majore de testare şi estimarea timpului necesar pentru fiecare dintre ele. Identifică
constrângerile semnificative asupra testării, cum ar fi disponibilitatea unui test, a resurselor şi a
termenelor limită, precum şi strategia de automatizare.
Criteriul de trecere - Specifică acel criteriu care va fi folosit pentru a determina dacă
fiecare test a trecut sau a picat.
Criteriul de suspendare - Specifică acele criterii folosite pentru a suspenda o parte sau
toată activitatea de testare a unui item, asociat cu planul de testare. Precizează ce activităţi de
testare trebuie repetate, atunci când se reia procesul de testare.
Activităţile de testare - Identifică un set de activităţi necesare pentru a pregăti și executa
testarea. Identifică toate interdependenţele - între activităţi şi orice cunoştinţe speciale necesare.
Rezultatele testării - Identifică documentele ce vor fi livrate. Următoarele documente ar
trebui incluse:
● planul de testare
● specificaţiile de design ale testului
● specificaţiile cazului de testare
● specificaţiile procedurii de testare
● rapoartele de transmitere a testului
● logourile de testare
● rapoartele incidentelor de testare
● rapoartele sumarelor testelor
● deasemenea, se pot include utilitarele de testare.
Nevoile de training - Specifică nevoile personalului de pregătire, în funcţie de nivelul de
cunoştinţe. Identifică opţiuni de pregătire pentru a obţine nivelul dorit.
3
Nevoi tehnice - Precizează atât proprietăţile necesare, cât şi pe cele dorite ale mediului de
testare. Această specificaţie ar trebui să conţină caracteristicile fizice ale locaţiilor, incluzând
hardware, comunicaţii, software, modul de utilizare, precum şi orice alt software necesar pentru a
susţine un test. Deasemenea, precizează nivelul de securitate ce trebuie asigurat locaţiei,
sistemului software, datelor şi hardware. Identifică utilitare speciale necesare, precum şi orice alte
nevoi implicate în procesul de testare. Responsabilităţi - acestea identifică grupurile responsabile
cu managementul, designul, pregătirea, executarea, verificarea şi rezolvarea specificaţiilor şi
activităţilor legate de procesul de testare. Suplimentar, identifică grupurile responsabile pentru
asigurarea execuţiei testelor şi nevoilor de hardware. Aceste grupuri pot include programatori,
ingineri de testare, reprezentanţii utilizatorilor, suport tehnic, management de produs.
Program - Include datele importante identificate în programul proiectului software,
precum şi toate evenimentele de transmitere către client. Defineşte orice alt termen limită necesar.
Estimează timpul necesar pentru a executa fiecare activitate de testare. Specifică programul pentru
fiecare activitate şi termen limită. Pentru fiecare resursă de testare (de exemplu, locaţie,
instrumente şi personal), trebuie specificată perioada de folosinţă.
Riscuri - Identifică presupunerile cu risc mare ale planului de testare. Specifică planuri de
abordare pentru fiecare risc (de exemplu, livrarea întârziată a unei caracteristici testate poate
necesita program prelungit al personalului).
Aprobări - Specifică numele şi titlurile persoanelor care trebuie să aprobe acest plan de
testare.
Paşii planificării testelor :
- Cercetarea, colectarea şi documentarea strategiei, tacticilor şi activităţilor interne
ale testelor
Calcularea riscurilor, prin enumerarea riscurilor posibile, impact, prioritate.
Negocierea şi documentarea lucrurilor între subproiectul testării şi proiectul general
Finalizarea si documentarea detaliilor de planificare şi logistică, precum definiţiile
termenilor de testare şi de proiect. Notarea oricărui document la care se face referire.
Identificarea unor acţiuni în cazul apariţiilor situaţiilor de risc.
Planificarea testelor: estimarea eforturilor de test, determinarea costurilor,
programul de realizare a atribuţiilor.
Planul este dezvoltat în detaliu.
4
Se definesc atribuţiile fiecarui inginer de testare, strategia de testare, metrici. Se
definesc criteriile de oprire a testării.
Răspândirea planului pentru revizuire privat, de multe ori mai întâi la echipa de
testare, apoi clienţilor sau altor factori de decizie. Adunarea părerilor şi revizuirea planului,
precum şi reluarea primilor paşi, dacă este nevoie. Executarea schimbărilor la programul estimat şi
buget, rezultate în urma procesului de planificare. Răspândirea planului pentru revizuire publică.
Ţinerea unei şedinţe pentru revizuirea cu factorii de decizie. Adunarea ajustărilor finale necesare.
Revizuirea programului estimat şi bugetului bazat pe cunoştinţe noi, obţinute după procesul de
planificare, incluzând folosirea resurselor. Dacă rezultatele presupun modificări peste limitele
alocate, escalarea acestora pentru rezolvare. Reiterarea primilor paşi sau refacerea estimărilor.
Introducerea planului de testare în sistemul bibliotecilor proiectului, precum şi plasarea acestuia
pentru acces la citire, fără modificări.
Controlul procesului de testare
Controlul calităţii implică monitorizarea rezultatelor specifice ale proiectului în vederea
măsurării conformităţii lor cu standardele şi reglementările de calitate şi identificarea căilor de
eliminare a cauzelor de neconformitate. Va identifica şi implementa măsuri de corectare nu doar
pentru procesul de testare, dar şi pentru alte activităţi ale ciclului de viață software. Paşii de bază:
5
comportamentală: măsura până la care testele acoperă comportamentul sistemului
(riscuri, operaţii, activităţii, funcţii)
Raportarea problemelor: defecte rămase în sistem, riscuri identificate, ș.a.
Necesitatea
Planificarea este influenţată de practicile interne ale organizaţiei, scopul testării,
obiective, riscuri, constrângeri, disponibilitatea resurselor. Cu cât planificarea este mai avansată,
cu atât procesul de planificare aduce mai multe informaţii şi detalii. Planificarea este o activitate
continuă şi se realizează de-a lungul vieţii produsului, pentru a recunoaşte riscurile la timp şi a
ajuta planificarea. Planul de testare reprezintă abordarea generala a unui test. În multe feluri,
planul serveşte ca un rezumat al activităţilor de testare ce vor fi executate.
Arată cum testele vor fi organizate şi defineşte toate nevoile testării, ce trebuie îndeplinite
pentru a duce la bun sfârşit un test. Planul este valoros mai ales pentru că nu este un document
dificil de urmărit, astfel că echipa de ingineri şi manageri îl pot inspecta. Partea cea mai mare a
efortului planului de testare este axată pe crearea cazurilor de testare.
- Testarea de performanță – noțiuni de bază
Testarea de perfomanță reprezintă procesul de testare software în care are loc testarea
vitezei de răspundere, stabilității, fiabilității, scalabilității și utilizării resurselor în cadrul unui
anumit volum de lucru. Principalul scop al acestui proces este identificarea și eliminarea
blocajelor de performanță apărute într-o aplicație software.
În linii generale, testarea performanței poate avea diferite scopuri, cum ar fi:
Demonstrarea faptului că sistemul îndeplinește criteriile de performanță;
Compararea a două sisteme pentru a găsi care operează mai bine;
Stabilirea unor părți ale sistemelor care cauzează scăderea nivelului de performanță.
Pe lângă cele 3 criterii generale de testare a performanței mai pot fi adăugate două
tipuri(Figura 1.1):
● Testarea încărcării – lansării – supra-încărcării;
● Testare de stres;
● Testarea stabilității;
● Testarea în impulsuri (spike testing);
● Testare în configurație (configuration testing).
Fig. 1.1 Procesul de testare a performanței
Testarea în impulsuri. După cum sugerează și numele, se realizează prin simularea creșterii
sau descreșterii bruște a sarcinii generate de un interval larg a numărului de utilizatori și
evaluarea comportamentului sistemului. Scopul este de a determina dacă performanța va fi
afectată, atunci sistemul va ieși din funcțiune sau dacă va putea face față schimbărilor supuse.
Testarea în configurație este o altă variantă a testării de performanță. În locul testării
performanței prin perspectiva încărcării, se testează efectele schimbării de configurație din
mediul programului asupra comportamentului și performanței.
Identificarea
Identificare criteriilor de Planificare și Configurarea
mediului de testare acceptare a proiectarea testelor mediului de testare
performanței
2
metricile pentru colectare. Apoi, se consolidează informația în una sau mai multe modele de
utilizare a sistemului pentru a fi implementat, executat și analizat.
4) Configurarea mediului de testare.
Are loc pregătirea mediului de testare, a instrumentelor și resurselor necesare pentru
îndeplinirea fiecărei strategii, întrucât funcțiile și componentele devin valabile pentru testare.
5) Implementarea proiectului de testare.
Presupune dezvoltarea testării de performanță în conformitate cu proiectarea testării.
6) Executarea testului.
Are loc rularea și monitorizarea testării. Se execută testele validate pentru analiză, se
monitorizează testul și mediul testării.
7) Analiza rezultatelor, configurarea și re-testarea.
Această etapă constă din analizarea, consolidarea și distribuirea datelor despre rezultatele
obținute, modificarea setărilor și testarea repetată.
3
4. Studiu de caz
Acest studiu de caz reprezintă un scenariu de dezvoltare a testului de performanță pentru
măsurarea utilizării procesorului folosind programul Maximo Asset Management implementat de
compania IBM.
Compania „A” plănuiește să implementeze programul Maximo Asset Management cu o
personalizare amplă. Pentru a asigura o implementare de succes, compania „A” dezvoltă și
rulează teste de performanță.
Descriere
Compania „A” are ca scop să folosească programul dat pentru gestiunea activelor,
cumpărări, urmărirea comenzilor efectuate. Din cauza proceselor specifice de afaceri, compania
„A” deține o implementare personalizată care utilizează fluxuri automatizate de lucru.
Utilizatorii companiei folosesc următoarele componente:
Active;
Cereri de achiziție;
Comenzi de achiziție;
Urmărirea comenzilor.
Primul pas: Determinarea obiectivelor de măsurare
Echipa de implementare al companiei „A” iau în considerare întrebarea-cheie de afaceri și
acordă prioritate riscurilor, recompenselor și costurilor în implementare. Pe baza cercetărilor,
echipa de implementare stabilește că utilizatorilor nu le place atunci când tranzacțiile din
aplicațiile web durează mai mult pentru a se efectua. Interviurile realizate cu grupuri anumite
determină faptul că utilizatorii devin frustrați atunci când o tranzacție durează mai mult de 2
secunde pentru a răspunde.
Echipa de gestionare a serverelor de la Compania „A” stabilește că, dacă utilizarea
procesorului rămâne sub 80% pentru o încărcare a utilizatorilor țintă pe sistem, atunci procesorul
poate furniza resurse adecvate pentru ca aplicațiile să funcționeze la nivelul dorit. Această
valoare poate gestiona, de asemenea, creșteri ocazionale în procesare, cum ar fi în timpul
procesării pentru sfârșit de lună, fără a influența asupra timpului de răspuns. Pe baza mărimii
companiei, echipa de gestionare a serverului identifică 950 de utilizatori ca sarcină simultană
țintă.
Pasul doi: Dezvoltarea cazurilor de utilizare
Echipa de implementare ia în considerare comportamentul utilizatorilor pe parcursul zilei.
Aceasta identifică că, în general, utilizatorii se conectează după ce sosesc dimineața. Utilizatorii
realizează de obicei un set de activități de lucru și apoi se deconectează. Echipa de implementare
4
estimează că fiecare utilizator finalizează un caz de utilizare de aproximativ 20 de ori într-un
interval de o oră.
Pentru a aproxima comportamentul de conectare și deconectare, echipa de implementare
intenționează să creeze cazuri de utilizare în care utilizatorii de test automat se conectează,
rulează șase iterații ale unui caz de utilizare și apoi se deconectează. Utilizatorii de test automat
se conectează din nou și repetă ciclul. O pauză de 5 până la 10 secunde este încorporată în pașii
din scenariului pentru a reprezenta ratele reale de procesare ale utilizatorilor.
Echipa de implementare identifică cazurile de utilizare care sunt necesare pentru a testa
implementarea. Echipa atribuie, de asemenea, factori de volum pentru fiecare caz de utilizare.
Factorul de volum reprezintă numărul de utilizatori automatizați care rulează fiecare caz de
utilizare.
Tabelul 4.1 Cazuri de utilizare identificare pentru testare în Compania „A”
Identificator Factor
Descriere
caz. de utiliz. volum, %
AS01 Căutarea activelor și examinarea informațiilor despre siguranță 20
PO01 Crearea unei cereri de achiziție, apoi crearea unei comenzi de
5
achiziție pe baza cereri de achiziție.
PO02 Modificarea statutului a comenzii ”În curs de desfășurare” 5
PO03 Primirea comenzii 5
PO04 Închiderea comenzii de achiziție 5
WF01 Crearea unei comenzi de lucru și direcționarea acesteea prin
12
aplicația Workflow
WF02 Vizualizarea unei comenzi de lucru și direcționarea acesteea prin
12
aplicația Workflow pentru aprobare
WF03 Emiterea unui element al unei comenzi de lucru și direcționarea
12
acestuia prin aplicația Workflow
WF04 Adăugarea forței de muncă la o comandă de lucru și direcționarea
12
comenzii prin aplicația Workflow pentru finalizare
WF05 Trecerea unei comenzi de lucru prin aplicația Workflow pentru
12
închidere.
5
Tabelul 4.2 Cazuri de testare de căutare a activelor și examinare a informației despre
siguranță
Operațiune Descriere Rezultatul așteptat
AS01_01_D_Launch Porniți Maximo Asset Management Este afișat ecranul Bun
venit la Maximo
AS01_02_D_Logon Introduceți numele de utilizator Se afișează Start Center
ASSET0001 și parola maxasset.
Faceți clic pe Sign In
Începerea buclei pentru elemente multiple de lucru
AS01_03_D_GoTo Faceți clic pe Go To Se afișează meniul Go To
AS01_04_D_LaunchAssets Selectați Assets > Assets Este afișată aplicația
Assets
AS01_05_D_EnterAsset În câmpul Asset, introduceți CAC și Fundalul pentru câmpul
Prefix apăsați tasta Tab Asset se schimbă în alb.
Cursorul se deplasează la
câmpul următor
AS01_06_D_FindAsset Faceți clic pe pictograma Filter Este afișată o listă care
Table listează toate activele
care au CAC (Customer
acquisition cost) în
numele lor
Crearea buclelor de până la 9 ori pentru a selecta o pagină aleatorie de date
AS01_07_D_NextPage Faceți clic pe pictograma Next Page Este afișată următoarea
pagină cu rezultatele
activelor
Finisarea buclei pentru datele paginii
AS01_08_D_SelectAsset Selectați un număr de activ aleatoriu Sunt afișate detaliile
pentru activul selectat
AS01_09_D_TabSafety Selectați fila Safety Se afișează fila Safety
AS01_10_D_ReturnTo Faceți clic pe Start Center Este afișat Start Center
StartCenter
Finisarea buclei pentru elemente multiple
AS01_11_D_Logoff Faceți clic pe Sign out Deconectarea este
finalizată. Este afișat
ecranul Bun venit la
Maximo.
În graficul rezultat, timpul mediu de răspuns este sub 2 secunde. Utilizarea procesorului pe
serverul bazei de date rămâne sub 80% la încărcarea țintă a 950 de utilizatori simultani. Cu toate
acestea, procesorul serverului de aplicații depășește 80% utilizare cu o încărcare de 850 de
utilizatori simultani. Prin urmare, criteriile testului de performanță nu au fost îndeplinite.
Echipa de implementare trebuie să investigheze pentru a determina dacă problema utilizării
excesive a procesorului poate fi rezolvată prin reglarea setărilor legate de performanță sau
modificări ale fluxurilor de lucru automatizate. Echipa de implementare poate decide, de
asemenea, dacă sunt necesare resurse suplimentare de procesor pentru a îndeplini criteriile de
performanță în implementarea producției.
Concluzie
Testarea performanței trebuie să fie o prioritate majoră înaintea lansării oricărui
program(în dependență de domeniu). Aceasta trebuie să fie realizată încă la începutul etapei de
dezvoltare pentru a detecta defectele mai devreme și pentru a satisface necesitățile utilizatorilor,
economisind timp și bani.
Problemele care ar putea fi întâlnite pe parcursul testării sunt:
Configurarea și gestionarea datelor;
Crearea testelor de performanță care să corespundă cât mai îndeaproape
comportamentului real al mediului înconjurător;
8
Scalarea testelor pentru a corespunde capacității disponibile a mediului de testare și
sarcinilor utilizatorului pentru a obține rezultate semnificative ale performanței;
Modelarea proceselor de fundal care rulează pe mediul real și poate afecta performanța;
Monitorizarea activității de mediu pentru a identifica situațiile în care sunt probleme de
performanță sau „blocaje”;
Furnizarea de informații semnificative și acționabile în rapoarte;
Identificarea tipurilor corecte de testare pentru a rula.
Însă, pentru asigurarea maximă a vitezei de răspuns, scăderea numărului de greșeli,
determinarea problemelor cu baza de date și crearea website-urilor sau aplicațiilor sigure și
rapide, este necesar de a stabili obiective clare de testare, alegând între timp, instrumentele
corecte de testare software, a infrastructurii și tehnologiilor