|
Universitatea "Dunarea de Jos" Galati Facultatea de Automatica, Calculatoare, Inginerie Electrica si Electronica.
Fiabilitate
Proiect de semestru
1.1 Tema
Capitolul I
Testarea unei aplicatii simple folosind Junit.
1.2 Testarea orientata pe obiect
Prin natura sa, programarea orientata obiect schimba atat strategiile de testare cat si tacticile de testare. Se lucreaza cu clase constructii incorporate polimorfe si ale caror proprietati se mostenesc.
La nivelul programarii orientate obiect testarea trece dincolo de identificarea
de erori si atinge si laturi calitative ale definirii, referirii de clase si obiecte.
Prezinta importanta intensitatea cu care sunt referite clase deja existente in biblioteci. De asemenea testarea pune in evidenta masura in care sunt realizate nivelurile de incapsulare, mostenire si polimorfism. Strategiile de testare pentru software orientat obiect presupun o testare care incepe prin testarea pe bucati, parti componente dupa care urmeaza testarea in ansamblu. Deci se incepe cu unit test se continua cu testul de integrare si se incheie cu testul de sistem si validare. Incapsulare conduce la definirea de clase si obiecte, instante ale claselor.
In programarea orientata obiect unit testing este echivalent cu testarea claselor - class testing. Fiecare clasa sau obiect impacheteaza date si metode cunoscute si ca operatori, care manipuleaza aceste date. Testarea claselor este o operatie complexa datorita mostenirii claselor si redefinirii metodelor precum si tipurilor de mostenire privat, public sau protejat.
Programarea orientata obiect este caracterizata printr-un nivel foarte ridicat
al reutilizarii.
Testarea software orientata obiect presupune doua planuri:
testarea constructiilor proprii;
testarea constructiilor incluse pentru reutilizare.
Pe langa obiectivul general al stabilirii masurii in care produsul software
realizeaza sarcinile date in specificatii, sunt si obiective speciale legate de:
testarea functiilor membre ale fiecarei clase;
testarea gradului de incapsulare si efectele acestuia;
testarea efectelor induse de nivelul de mostenire si derivare;
testarea efectelor induse de polimorfismul functiilor membre;
1.3 Testarea utilizand JUnit
Testarea unitara s-a impus in ultima perioada in dezvoltarea proiectelor scrise in limbajul Java si numai, 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, care se poate descarca gratuit de pe site-ul http://www.junit.org .
Printre avantajele folosirii utilitarului JUnit se numara:
se imbunatateste viteza de scriere a codului, concomitent cu cresterea
calitatii acestuia, deoarece prin scrierea testelor unitare se micsoreaza timpul de depanare, permitand refactorizarea mai usoara, cu depistarea imediata a eventualelor erori inserate in codul modificat;
clasele de test sunt usor de scris si modificat pe masura ce codul sursa se mareste, putand fi compilate impreuna cu codul sursa al proiectului. Compilatorul testeaza sintaxa codului sursa, in timp ce clasele de test valideaza integritatea codului
clasele de test JUnit pot fi rulate automat (in suita), rezultatele fiind vizibile
imediat. Se pot crea ierarhii de suite de test, care pot fi testate impreuna sau separat, in functie de cerintete proiectului
clasele de test maresc increderea programatorului in codul sursa scris si ii permit sa urmareasca mai usor cerintele de implementare ale proiectului, putand constitui si o parte a documentatiei finale transmise clientului
JUnit este un utilitar gratuit, iar testele JUnit sunt scrise in Java si beneficiaza de portabilitatea acestuia
JUnit a fost proiectat pe baza a doua modele (patterns): modelul Command
si modelul Composite.
O clasa TestCase este un obiect command si orice clasa ce contine metode
de test trebuie sa subclaseze clasa TestCase. O clasa TestCase se compune dintr-
un numar de metode publice. Pentru a verifica rezultatele asteptate si cele
curente se va invoca una dintre metode.
Instantele TestCase se pot compune sub forma unor ierarhii TestSuite ce vor invoca automat toate metodele testXXX() definite in fiecare instanta TestCase. O clasa TestSuite poate fi compusa din alte teste, instante TestCase sau alte instante TestSuite.
Capitolul II
2.1 Descriere aplicatiei
Aplicatia "Iepurasul Infometat" este un joc in care jucatorul deplaseaza un iepuras, cu ajutorul sagetilor, cu scopul de colecta morcovii ce apar aleatoriu pe suprafata de joc. Totodata acesta trebuie sa se fereasca de piatra ce apare aleatoriu. Morcovul, in functie de dimensiunea lui are un numar de puncte. Daca se
acumuleaza un numar specificat de puncte, aplicatia trece la nivelul urmator iar
viteza jocului creste. Cand iepurasul este lovit de 3 ori aplicatia returneaza un mesaj de felicitare iar jocul se termina.
2.2 Structura jocului
Iepurasul nostru este creat in clasa Iepuras.java ce extinde KeyListener, clasa pentru ascultatorul de taste. Clasa KeyListener impreuna cu metoda misca_iepuras() definesc miscarea acestuia.
In clasa Main.java este creata o instant a clasei Joc.java.
Cu ajutorul clasei Piatra.java se creaza obiectul de tip obstacol pe care jucatorul trebuie sa le evite. In aceasta clasa sunt definite metodele misca_piatra()
si verifica(Iepuras). Metoda misca_piatra() este apelata pentru miscarea obiectului
pe orizontala. Metoda verifica(Iepuras) verifica daca iepurasul se intersecteaza cu obiectul de piatra.
Cu ajutorul clasei Fruct.java se creaza obiecte pe care iepurasul trebuie sa le
manance. In aceasta clasa sunt definite metodele misca_fruct() si verifica(Iepuras). Metoda misca_fruct() este apelata pentru miscarea obiectului pe orizontala.
Metoda verifica(Iepuras) verifica daca iepurasul se intersecteaza cu obiectul de tip fruct si il ascunde in acest caz returnand un numar de puncte castigate.
Clasa Nivel.java este folosita pentru definirea nivelelor de joc. Metoda nivel_nou() din aceasta clasa are rolul de a seta nivelul, viteza deplasarii obiectelor
de tip piatra si fruct, si punctele necesare trecerii la un nivel superior.
In clasa Joc.java este creata ferestra principala formata din trei panouri:
panoul de sus, panoul de joc si panoul de jos. In panoul de sus se gasesc informatii despre viata iepurasului, punctele acumulate si nivelul current de joc. In acest
panou ne este notificat un mesaj de felicitare in momentul in care jocul este finalizat. Panoul de joc este alcatuit din instante ale claselor Iepuras, Fruct si Piatra. In constructorul clasei Joc sunt create instante pentru clasele Iepuras si
Nivel. Metoda timp_refresh() apeleaza metoda misca_elemente() la un interval de timp stabilit. In metoda misca_elemente() sunt apelate metodele misca_piatra() si misca_fruct() si sunt efectuate verificarile pentru trecerea la nivelul urmator sau finalizarea jocului cu un mesaj corespunzator.
2.3 Diagrama claselor - simplificata
O diagra ma a claselor prezinta structura fizica a claselor identificate in sistem. Clasele reprezinta 'lucruri' gestionate de sistem; clasele pot fi legate in mai multe moduri: asociate (conectate intre ele), dependente (o clasa depinde/foloseste o alta clasa), specializate (o clasa este specializarea altei clase)
sau impachetate (grupate impreuna in cadrul unei unitati).
Toate aceste relatii se materializeaza in structura interna a claselor in atribute si operatii. Diagrama este considerata statica, in sensul ca este valida in orice moment din ciclul de viata al sisteului.
Piatra.java Fruct.java Nivel.java
.java
Joc Main.java
Iepuras.java
2.4 Diagrama claselor - complexa
Capitolul III
3.1 Testare
3.2 Testarea claselor
Testarea claselor, contribuie la cresterea vitezei de programare si la
micsorarea drastica a numarului de bug-uri. Pentru testarea claselor din proiectul nostru am ales clasa Fruct.java. Daca Iepurasul se misca stramb el poate sa se intersecteze cu piatra si sa moara sau daca are directii stranii sa ocolesca fructele
care ii pot aduce puncte in joc. Numarul maxim de puncte fiind scopul acestui joc.
package clase;
import iepuras.Fruct;
import iepuras.Iepuras;
import java.awt.Point; import junit.framework.*; import javax.swing.*;
public class TestFruct extends TestCase
public void test_misca_fruct()
public void test_verifica_adevarat()
public void test_verifica_fals()
};
3.3 Testarea interactiunilor
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 clase si foloseste
o referinta catre o instanta a clasei.
Clasa, ca si variabila membra sau ca sine statatoare. Prin intremediul acestei conexiuni se pot apela cu usurinta metode ale clasei in cauza, din clasa Joc. 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.
Sunt si functii care prezinta doar o verificare superficiala a variabilelor locale. Cazurile de test prezentate mai sus au fost suficiente pentru testarea metodei alese.
Motivul alegerii functiilor prezentate, pentru testarea interactiunii dintre obiecte, este ca acestea controleaza aspecte cruciale ale jocului si anume recompensarea utilizatorului pentru efortul depus, prin acumularea de puncte, oferire. Fara aceste aspecte jocul nu ar mai avea un scop bine definit.
package interactiuni; import iepuras.Iepuras; import java.awt.Point; import javax.swing.JPanel; import junit.framework.*;
public class IepurasTest extends TestCase
protected void setUp() throws Exception
public void testIepurasLocate()
protected void tearDown() throws Exception
}
3.4 Testarea in suita
import junit.framework.*;
public class RunAll
public static Test suite()
public static void main(String[] args)
}
3.5 Bibliografie
Cursuri de Fiabilitate s.l dr. inf. Sabina MUNTEANU