Fiabilitate Document

10
 Testarea software. JUnit Tes tar ea uni tar ă s-a imp us în ult ima perioadă în dez vol tar ea pro iec tel or scr ise în limbajul Java şi numai, pe măsura apariţiei unor utilitare gratuite de testare a claselor, care au contribuit la creşterea vitezei de programare şi la micşorarea drastică a numărului de bug-uri. Cel mai folosit utilitar pentru testarea unitară a claselor Java este JUnit, care se poate descărca gratuit de pe site-ul http://www.junit.org . Printre avantajele folosirii utilitarului JUnit se numără: se îmbunătăţeşte viteza de scriere a codului, concomitent cu creşterea calităţii acestuia, deoarece prin scrierea testelor unitare se micşorează timpul de depanare, permiţând refactorizarea mai uşoară, cu depistarea imediată a eventualelor erori inserate în codul modificat; clasele de test sunt uşor de scris şi modificat pe măsură ce codul sursă se măreşte,  putâ nd fi comp ilate împreună cu codu l surs ă al proie ctulu i. Comp ilato rul test ează sintaxa codului sursă, în timp ce clasele de test validează integritatea codului clasele de test JUnit pot fi rulate automat (în suită), rezultatele fiind vizibile imediat. Se pot crea ierarhii de suite de test, care pot fi testate împreună sau separat, în funcţie de cerinţete proiectului clasele de test măresc încrederea programatorului în codul sursă scris şi îi permit să urmărească mai uşor cerinţele de implementare ale proiectului, putând constitui şi o  parte a documentaţiei finale transmise clientului JUnit este un utilitar gratuit, iar testele JUnit sunt scrise în Java şi beneficiază de  portabilitatea acestuia JUnit a fost proiectat pe baza a două modele (patterns): modelul Command si modelul Composite. O clasa TestCase este un obiect command şi orice clasă ce conţine metode de test trebuie sa subclaseze clasa TestCase. O clasa TestCase se compune dintr-un numar de metode  publice testXXX(). Pentru a verifica rezultatele aşteptate şi cele curente se va invoca una dintre metodele assert(). Metod ele setUp () si tearDown() servesc la initi aliza rea si distru gere a orică rui obie ct ut il izat în cadr ul test el or. Fi ecare test rulează într-un cont ext propri u şi apel ează meto da setUp () înai nte şi meto da tearDown() după fieca re meto dă de test pent ru a evit a efectele secundare dintre teste.

Transcript of Fiabilitate Document

Page 1: Fiabilitate Document

5/13/2018 Fiabilitate Document - slidepdf.com

http://slidepdf.com/reader/full/fiabilitate-document 1/10

Testarea software. JUnit

Testarea unitară s-a impus în ultima perioadă în dezvoltarea proiectelor scrise în

limbajul Java şi numai, pe măsura apariţiei unor utilitare gratuite de testare a claselor, care au

contribuit la creşterea vitezei de programare şi la micşorarea drastică a numărului de bug-uri.

Cel mai folosit utilitar pentru testarea unitară a claselor Java este JUnit, care se poate

descărca gratuit de pe site-ul http://www.junit.org .

Printre avantajele folosirii utilitarului JUnit se numără:

• se îmbunătăţeşte viteza de scriere a codului, concomitent cu creşterea calităţii acestuia,

deoarece prin scrierea testelor unitare se micşorează timpul de depanare, permiţând

refactorizarea mai uşoară, cu depistarea imediată a eventualelor erori inserate în codul

modificat;

• clasele de test sunt uşor de scris şi modificat pe măsură ce codul sursă se măreşte,

 putând fi compilate împreună cu codul sursă al proiectului. Compilatorul testează

sintaxa codului sursă, în timp ce clasele de test validează integritatea codului

• clasele de test JUnit pot fi rulate automat (în suită), rezultatele fiind vizibile imediat.

Se pot crea ierarhii de suite de test, care pot fi testate împreună sau separat, în funcţie

de cerinţete proiectului

• clasele de test măresc încrederea programatorului în codul sursă scris şi îi permit să

urmărească mai uşor cerinţele de implementare ale proiectului, putând constitui şi o

 parte a documentaţiei finale transmise clientului

• JUnit este un utilitar gratuit, iar testele JUnit sunt scrise în Java şi beneficiază de

 portabilitatea acestuia

JUnit a fost proiectat pe baza a două modele (patterns): modelul Command si modelul

Composite.

O clasa TestCase este un obiect command şi orice clasă ce conţine metode de test

trebuie sa subclaseze clasa TestCase. O clasa TestCase se compune dintr-un numar de metode

 publice testXXX(). Pentru a verifica rezultatele aşteptate şi cele curente se va invoca una

dintre metodele assert().

Metodele setUp() si tearDown() servesc la initializarea si distrugerea oricărui obiect

utilizat în cadrul testelor. Fiecare test rulează într-un context propriu şi apelează

metoda setUp() înainte şi metoda tearDown() după fiecare metodă de test pentru a evita

efectele secundare dintre teste.

Page 2: Fiabilitate Document

5/13/2018 Fiabilitate Document - slidepdf.com

http://slidepdf.com/reader/full/fiabilitate-document 2/10

Instanţele TestCase se pot compune sub forma unor ierarhii TestSuite ce vor invoca

automat toate metodele testXXX() definite în fiecare instanţă TestCase. O

clasă TestSuite poate fi compusă din alte teste, instanţe TestCase sau alte instanţe TestSuite.

Descrierea aplicatiei

Aceasta aplicatie reprezinta un joc multi-player, iar scopul este acela de a atrage in

capcana restul oponentilor. Trebuie sa eviti impactul cu peretele sau cu urma lasata de

oponenti. In fereastra principala se pot selecta jucatorii si modifica eventual, numele lor,

culoarea si controlul. Jocul se termina atunci cand unul din jucatori realizeaza cinci puncte.

2

Page 3: Fiabilitate Document

5/13/2018 Fiabilitate Document - slidepdf.com

http://slidepdf.com/reader/full/fiabilitate-document 3/10

Diagrame

3.1 Diagrama de clase

3.2 Diagrama cazurilor de utilizare

3

Page 4: Fiabilitate Document

5/13/2018 Fiabilitate Document - slidepdf.com

http://slidepdf.com/reader/full/fiabilitate-document 4/10

3.3 Diagrama de

activitate

4

Page 5: Fiabilitate Document

5/13/2018 Fiabilitate Document - slidepdf.com

http://slidepdf.com/reader/full/fiabilitate-document 5/10

1. Testarea aplicatiei

4.1 Testarea de clasa: Skin.java

-Diagrama clasei Skin

Skin

Atribute:

- NAME : String

+ DATA_INT : int

+ DATA_IMAGE : int

+ DATA_COLOR : int

+ DATA_FONT : int- source : URL

- loaded : boolean

+ effectWidth : int

+ effectHeight : int

+ background : Image

+ title : Image

+ activeTitle : Image

+ field : Image

+ settings : Image

+ yes : Image

+ no : Image

+ start : Image

+ explosion : Image

+ appearUp : Image

+ appearDown : Image

+ controls : Image[]

+ snake : Image[]

+ backColor :Color 

+ statusTextColor :Color + buttonBorderColor :Color 

+ activeButtonBorderColor : Color 

+ buttonBackColor :Color 

+ buttonTextColor : Color 

+ activePanelBorderColor :Color 

+ statusFont : Font

+buttonFont : Font

- game : Game

Operatii:

+ Skin(game : Game, source : URL) : void

+ getSkinLock() : Object

+ load() : void

+ isLoaded() : boolean

+ setImage( name : String, image Image) : void

5

Page 6: Fiabilitate Document

5/13/2018 Fiabilitate Document - slidepdf.com

http://slidepdf.com/reader/full/fiabilitate-document 6/10

Specificatia OCL

Skin::getSkinLock()

Pre: true

Post: result=self;

Skin::load()

Pre: true

Post: setImage(name:String, image:Image)

Skin::isLoaded()

Pre:true

Post: result=loaded;

Skin::setImage(name: String,image : Image)

Pre: name exista ca data membru

image!=null

Post: game.repaint()

6

Page 7: Fiabilitate Document

5/13/2018 Fiabilitate Document - slidepdf.com

http://slidepdf.com/reader/full/fiabilitate-document 7/10

Descrierea cazurilor de test

-pentru metoda getSkinLock( )

Input Output

State Event State Exception thrown

OUT::Skin OUT::getSkinLock() None None

-pentru metoda load( )

Input Output

State Event State Exception thrown

OUT::Skin OUT::load() OUT.loaded=true; None

-pentru metoda isLoaded( )

Input Output

State Event State Exception thrown

OUT::Skin

[loaded=false

]

OUT::isLoaded( ) None None

OUT::Skin

[loaded=true]

OUT::isLoaded() None None

-pentru metoda setImage()

Input Output

State Event State Exception

thrown

 None OUT::setImage(name:String,image:Image) OUT.name=image None

 None OUT::setImage(name:String, null) None Exception

 None OUT::setImage(null,image:Image) None Exception

 None OUT::setImage(null,null) None Exception

Metoda getSkinLock() returneaza instanta curenta a clasei Skin, convertita la tipul

Object. Este folosita la sincronizarea executiei unor blocuri de instructiuni.

Metoda load() incarca imagini de pe disk in date membru ale clasei.Metoda are o

importanta foarte mare pentru ca jocul foloseste foarte multe acele date membru Image pentru

interfata si joc. Apeleaza metoda setImage(String,Image) din aceeasi clasa.

Metoda isLoaded() returneaza true daca imaginile au fost incarcate, fals in sens

contrar.

Metoda getURL() returneaza calea catre folderul ce contine imaginile pentru joc.

7

Page 8: Fiabilitate Document

5/13/2018 Fiabilitate Document - slidepdf.com

http://slidepdf.com/reader/full/fiabilitate-document 8/10

4.2 Testarea de mostenire: Player.java si HumanPlayer.java

Din diagrama de clase prezenta la inceputul acestui proiect se poate observa relatia demostenire dintre clasele Player.java si HumanPlayer.java. Pentru testarea lor mai intai, s-au

ales 2 metode din clasa parinte (Player). Testarea clasei are loc in clasa TestPlayer.java.

Clasa Player este abstracta=> nu poate fi instantiata.

Metoda  getImage(int x) returneaza imaginea ce corespunde indexului x din vectorul

snake, membru al clasei Player. „Sarpele” este afisat in interfata folosind acest vector pentru

starea si pozitia in care se afla.

Pentru acest test am verificat daca metoda imi returneaza o instanta Image si daca

apelarile cu parametri diferiti imi returneaza imagini diferite.

Metoda  getAppearU() returneaza o instanta Animator. Este folosita dupa ce este dat

„start game” pentru a pozitiona unii „sarpii” directionati in sus initial.

Metodele de mai sus nu sunt redefinite in clasa HumaPlayer si nici nu li se mai adauga

functionalitati suplimentare.

Din clasa HumanPlayer.java alegem urmatoarele functii:

Metoda keyCodeToDirection(int code) ce primeste ca parametrul codul unei taste si in

functie de controlerul specificat la crearea jucatorului, functia va returna urmatoarea miscareaa „sarpelui” in functie de acesti 2 factori. Aceasta metoda nu a fost definita in Player.

Metoda start() returneaza starea curenta a jucatorului(oprit sau nu) si este redefinita in

clasa HumanPlayer pentru a inlatura ascultatorul de tastatura (removeKeyListener(this)). Este

folosita in timpul jocului pentru a avertiza jocul ca nu mai este decat un singur jucator „in

viata”.

Clasele de test sunt TestPlayer.java si TestHumanPlayer.java .

4.3 Testarea de interactiuni

Testarea interactiunii dintre obiecte necesita o intelegere mai profunda a modului in

care comunica obiectele in cadrul unei aplicatii. In proiectul nostru, utilizand diagrama de

clase se doreste testarea interactiunii dintre clasa Field.java si Player.java. Clasa Field

foloseste o referinta catre o instanta a clasei Player, ca si variabila membra. Prin intremediul

acestei conexiuni se pot apela cu usurinta metode ale clasei Player, din clasa Field. Tocmai

acest lucru se doreste a se testa in cele ce urmeaza. Practic trebuie sa urmarim ca apelul

functiei dintr-o alta clasa decat cea curenta se executa cu succes si nu apare un comportament

anormal.

8

Page 9: Fiabilitate Document

5/13/2018 Fiabilitate Document - slidepdf.com

http://slidepdf.com/reader/full/fiabilitate-document 9/10

Pentru aceasta s-a create clasa TestInteraction.java deoarece vom folosi Field ca sa

apelam functii din clasa Player, practic o sa facem verificari ca si cum Player este o primitive

obisnuita, o sa ii citim starea dupa executia unei functii.

In continuare se prezinta cele 3 functii alese pentru testare de interactiune precum si

cazurile de test alese.Functia  setLocation(int x,int y) este folosita pentru pozitionarea efectiva a „capului

sarpelui” intr-un nou punct din campul de joc. In test, verificam daca functia functioneaza

cum ar trebui prin verificarea daca metoda a setat acel punct in clasa Player si prin comparatia

acestui punct cu unul setat diferit.

field.players[0].setLocation(2, 5);

Point A=field.players[0].getLocation();Point B=new Point(2,5);

 

assertEquals(A,B); 

Point C=new Point(3,5); 

assertNotSame(A,C);

Functia isStoped() returneaza starea unui jucator(„mort” sau inca joaca). Testarea se

face prin pornirea si oprirea succesiva a unui „sarpe” si verificarea starii intre aceste

modificari de stare.

field.players[1].stop();  assertTrue(field.players[1].isStoped());

 

field.players[1].start();  assertFalse(field.players[1].isStoped());

 field.players[1].stop();

  assertTrue(field.players[1].isStoped());

Functia getDirection() pentru a stii directia pe care o are un „Sarpe” la un moment dat.Testarea se face prin setarea unii directii si citirea ulterioara a acestei stari, si compararea unor 

situatii diferite.

field.players[2].setDirection(field. RIGHT );  int dir=field.players[2].getDirection();

 

assertEquals(dir,field. RIGHT ); 

field.players[2].setDirection(field.UP );dir=field.players[2].getDirection();

  assertNotSame(dir,field. RIGHT );

9

Page 10: Fiabilitate Document

5/13/2018 Fiabilitate Document - slidepdf.com

http://slidepdf.com/reader/full/fiabilitate-document 10/10

Motivul alegerii celor 3 functii de prezentat, pentru testarea interactiunii dintre

obiecte, este ca acestea controleaza aspecte cruciale ale jocului si anume care este urmatoarea

miscare a unui „sarpe”, care este directia de mers si starea unui jucator. Fara aceste aspecte,

 jocul nu ar fi functional.

2. Concluzii

Testarea aplicatiilor reprezinta o etapa importana in dezvoltarea oricarei aplicatii. Nu

trebuie ignorata daca dorim sa avem un produs flexibil, usor mentenabil, bine specificat si mai

ales cu o functionalitate sigura. JUnit vine in ajutorul testari-lor si nu numai. Ofera

instrumente precise pentru acoperirea cu cazuri de test a aplicatiei si ofera un suport stabil

dezvoltatorilor asigurand cresterea QoS.

 

10