Fiabilitate Document
-
Upload
costel-stoica -
Category
Documents
-
view
30 -
download
0
Transcript of 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.
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
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
5/13/2018 Fiabilitate Document - slidepdf.com
http://slidepdf.com/reader/full/fiabilitate-document 4/10
3.3 Diagrama de
activitate
4
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
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
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
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
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
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