Fiabilitate - de semestru




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

@Override

protected void setUp() throws Exception

public void testIepurasLocate()

@Override

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