Sunteți pe pagina 1din 17

[LABORATOR DE INGINERIE SOFTWARE]

Prep.Drd. Aritoni Ovidiu

Testare . Junit. Extreme Programming


1.

Despre JUnit

La realizarea unui proiect software complex codul sursa al aplicatiei este foarte important. Calitatea codului
sursa al unei aplicatii software este deta de :
-

corectitudinea sintaxei codului sursa. Pentru asigurarea acestei corectitudini este responsabil compilatorul
de Java.

corectitudinea comportamentului,adica fiecare metoda realizeaza ceea ce s-a specificat in documentatia


UML-OCL a proiectului. Exprimarea constrangerilor utilizand limbaje formalizate de genul OCL sau
JML este un mare avantaj aici. Pentru asigurarea unui comportament corespunzator se vor utiliza teste
unitare realizate cu ajutorul utilitarului JUnit.

Documentatie :
http://www.cs.wm.edu/~noonan/junit/doc/faq/faq.htm

2. Crearea unui test unitar

Vom realiza testare unitara pentru o aplicatie de dimensiuni reduse cu privire la cartile dintr-o librarie si un cos de
cumparaturi .
Sa consideram asadar urmatoarele doua clase :

Book.java

public class Book {


/**
* The book title.

[LABORATOR DE INGINERIE SOFTWARE]

*/
private String title;
/**
* The book author.
*/
private String author;
/**
* The book price.
*/
private double price;

/**
* Constructor pentru Book.
*
*@param title The book title.
*@param author The book author.
*@param price The book price.
*/
public Book(String title, String author, double price) {
this.title = title;
this.author = author;
this.price = price;
}

Prep.Drd. Aritoni Ovidiu

[LABORATOR DE INGINERIE SOFTWARE]

/**
* Get book title.
*
*@return The book title.
*/
public String getTitle() {
return title;
}

/**
* Get book author.
*
*@return The book author.
*/
public String getAuthor() {
return author;
}
/**
* Get book price.
*
*@return The book price.
*/
public double getPrice() {
return price;

Prep.Drd. Aritoni Ovidiu

[LABORATOR DE INGINERIE SOFTWARE]

/**
* Test if two Book objects are equals.
*
*@param obj The object
*@return true if object are equals.
*/
public boolean equals(Object obj) {
if (obj instanceof Book) {
Book b = (Book) obj;
return
b.getTitle().equals(title);
}
return false;
}
}

ShoppingCart.java
public class ShoppingCart {
/**
* The items list.
*/
private List items;
/**
* The ShoppingCart constructor.

Prep.Drd. Aritoni Ovidiu

[LABORATOR DE INGINERIE SOFTWARE]

Prep.Drd. Aritoni Ovidiu

*/
public ShoppingCart() {
items = new ArrayList();
}
/**
* Get total price of items from shopping cart.
*
*@return The total price.
*/
public double getTotal() {
Iterator i = items.iterator();
double total = 0.00;
while (i.hasNext()) {
Book book = (Book) i.next();
total = total + book.getPrice();
}
return total;
}
/**
* Add an item to shopping cart.
*
*@param book The book to be added.
*/
public void addItem(Book book) {
items.add(book);

[LABORATOR DE INGINERIE SOFTWARE]

Prep.Drd. Aritoni Ovidiu

}
/**
* Remove an item from shopping cart.
*
*@param book The book to be removed.
*@throws Exception If book not found to shopping cart.
*/
public void removeItem(Book book) throws Exception {
if (!items.remove(book)) {
throw new Exception("Book not found.");
}
}
/**
* Get items count from shopping cart.
*
*@return The item count.
*/
public int getItemCount() {
return items.size();
}
/**
* Empty shopping cart.
*/
public void empty() {
items.clear();

[LABORATOR DE INGINERIE SOFTWARE]

Prep.Drd. Aritoni Ovidiu

}
/**
* Check if shopping cart is empty.
*
*@return true if cart is empty; false otherwhise.
*/
public boolean isEmpty() {
return (items.size() == 0);
}
}

a) Realizati un proiect Java cu ajtorul mediului Eclipse cu numele Libray.


b) Creati un package cu numele src.
c) Creati cele doua clase de mai sus : Book si ShoppingCart. Aceste doua clase le veti depune in pachetul src.

d) Implementati codul sursa al acestora asa cum este descris in listingurile de mai sus.
e) Adaugati arhiva junit.jar in biblioteca proiectului existent. Faceti click dreapta pe numele
proiectului,adica pe Library. Selectati Properties. Va apare un meniu ca cel din imagine :

[LABORATOR DE INGINERIE SOFTWARE]

Prep.Drd. Aritoni Ovidiu

Selectati panelul Libraries. Folositi apoi Add External JARs. In mod normal mdiul Eclipse se afla
instalat in folderul C:/Program Files/ Eclipse . In folderul plugins se gasesc arhivele cu toate pluginurile
Eclipse disponibile din instalare. Selectati din lista de pluginuri plugins/org.junit_3.8.1/junit.jar. Apsati
butonul de OK.
In situatia in care nu gasiti deja arhiva sau folderul de mai sus descarcati arhiva junit.jar de aici sau de pe
adresa www.junit.org .
f) Creati un package nou numit unittests.
g)

In noul package creat introduceti o noua clasa ShoppingCartTest. Java . Aceasta va avea codul sursa
descris mai jos :

package unittests;
import
import
import
import

junit.framework.TestCase;
junit.framework.Test;
[LABORATOR DE INGINERIE SOFTWARE]
junit.framework.TestSuite;
src.*;

Prep.Drd. Aritoni Ovidiu

public class ShoppingCartTest extends TestCase {


/**
* Obiect de tipul ShoppingCart ce va fi testat.
*/
private ShoppingCart bookCart;
/**
* Obiect de tipul Book ce va fi testat.
*/
private Book book;
/**
* Constructor pentru o instanta ShoppingCartTest cu numele
* specificat.
*
*@param name Nume test.
*/
public ShoppingCartTest(String name) {
super(name);
}
/**
* Initializare obiecte de test. Se apeleaza inaintea fiecarei metode de
* test.
*/
protected void setUp() {
bookCart = new ShoppingCart();
book = new Book("Unit testing", "John Smith", 35.95);
bookCart.addItem(book);
}
/**
* Distruge obiectele testate. Se apeleaza dupa fiecare metoda de test.
*/
protected void tearDown() {
bookCart = null;
}
/**
* Testare inserare carti in cos.
*/
public void testBookAdd() {
Book book = new Book("Extreme machines", "Thomas Manner", 46.95);
bookCart.addItem(book);
double expectedTotalPrice = this.book.getPrice() + book.getPrice();
assertEquals(expectedTotalPrice, bookCart.getTotal(), 0.0);
assertEquals(2, bookCart.getItemCount());
}
/**
* Test golire cos.
*/
public void testEmpty() {
bookCart.empty();
assertTrue(bookCart.isEmpty());
}

[LABORATOR DE INGINERIE SOFTWARE]

Prep.Drd. Aritoni Ovidiu

h) Pentru a rula testul de mai sus : click dreapta pe clasa ShoppingCartTest.java. Selectati

Run As -> JUnit Test. In partea stanga veti putea vizualiza rezultatele testarii unitare a clasei
ShoppingCart.

i)

De asemeni o alta tehnica utila este de a genera automat o clasa de tip Test. Pentru aceasta urmati
urmatorii pasi :
Faceti click dreapta pe pachetul unittests.
Alegeti optiunea JUnit Test Case.

[LABORATOR DE INGINERIE SOFTWARE]

Va apare apoi o fereastra cum este urmatoarea :

Prep.Drd. Aritoni Ovidiu

[LABORATOR DE INGINERIE SOFTWARE]

Prep.Drd. Aritoni Ovidiu

Specificati un nume pentru testul dumneavoastra utilizand conventiile de notare explicate mai jos.
Specificati in campul Class under tests clasa asupra careia doriti sa realizati testul dumneavoastra.
Bifati setup( ) si tearDown( ). Aceste metode sunt utilizate la crearea respectiv la distrugerea
obiectelor care sunt necesare pentru testul dumneavoastra. Fiecare metoda de testare va apela
metoda setup( ) inainte de a efectua testarea descrisa in corpul acelei metode,respectiv tearDown()
dupa rularea testului.Utilizarea acestor doua metode se datoreaza faptului ca pentru fiecare metoda
din test se utilizeaza un context (o zona de memorie contigua) care trebuie initializata inainte de
realizarea unui test,iar apoi adusa la starea initiala, dinaintea rularii testului. Pentru detalii
asupra celor doua metode studiati implemntarea lor in clasa ShoppingCartTest si de asemeni:
http://www.agileprogrammer.com/dotnetguy/articles/SetupTeardown.aspx
http://jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html
Selectati Next. (nu folositi Finish).
Pentru JUnit exista anumite conventii de notare :

Numele unei clase de testare este [numeClasa]Test.java, unde numeClasa este numele clasei care
va fi testata.

[LABORATOR DE INGINERIE SOFTWARE]

Prep.Drd. Aritoni Ovidiu

Numele unei metode de testare este test[numeMetoda], unde numeMetoda este numele metodei
pe care urmeaza sa o testati.

Numele unei suite de teste utilizat in mod implicit pentru Eclipse este AllTests.java.

In continuare va apare un meniu ca cel din figura urmatoare :

Acest meniu va permite sa selectati metodele pentru care intentionati sa creati teste. Este
preferabil sa creati teste pentru toate metodele de care dispune clasa dumneavoastra. Bifati
metodele pentru care veti crea teste.
In acest meniu apar si metodele clasei Object. Daca testarea vizeaza o clasa derivata, atunci in
acest meniu va apare si clasa parinte a clasei pe care urmeaza sa o testati.
Generarea codului sursa al clasei de teste.

[LABORATOR DE INGINERIE SOFTWARE]

3.

Prep.Drd. Aritoni Ovidiu

Asertiuni. Java Modeling Language

Pentru asertiuni studiati documentatia JavaDoc a clasei Assert, utilizand linkul de mai jos :
http://junit.sourceforge.net/javadoc/junit/framework/Assert.html
In tabelul de mai jos gasiti explicatii asupra metodelor assertXXX utilizate de catre JUnit.
assertEquals(primitive expected,
primitive actual)

Verific dac cele dou obiecte primitive sunt egale

assertEquals(Object expected,Object
actual)

Verific dac cele dou obiecte sunt egale (folosind metoda


equals() din Object)

assertSame(Object expected,Object
actual)

Verific dac cele dou obiecte au aceeai adres de memorie

assertNotSame(Object expected,Object
actual)

Verific dac cele dou obiecte nu sunt unul i acelai (nu au


aceeai adres de memorie)
Verific dac un obiect este null
Verific dac un obiect nu este null
Verific dac o condiie este adevrat
Verific dac o condiie nu este adevrat

assertNull(Object object)
assertNotNull(Object object)
assertTrue(boolean condition)
assertFalse(boolean condition)

Pentru fiecare metoda a clasei de testat se recomanda sa se realizeze o metoda de testare. Asadar pentru
clasa ShoppingCart avem metodele : ShoppingCart (contructorul clasei), bookAdd, bookRemove, empty,
bookNotFound. Pentru fiecare din aceste metode se va realiza o metoda de test numita testXXX, unde XXX
este numele metodei. Numele astfel obtinute vor respecta conventiile clasice de numire din Java,unde fiecare
cuvant din numele unei metode trebuie sa inceapa cu litera mare.
Fiecare astfel de metoda va testa daca invariantii si postconditiile exprimate in documentatia OCL
corespunzatoare clasei respective sunt respectate.

4. Reguli de buna practica in implementarea testelor unitare

[LABORATOR DE INGINERIE SOFTWARE]

Prep.Drd. Aritoni Ovidiu

Dupa cum spuneam mai sus pentru a ne asigura de faptul ca o aplicatie software este conforma cu cerintele
functionale cerute se utilizeaza testarea
.......

5. Crearea unei suite de testare


Exista mai multe modalitati de creare a unei suite de teste.
Prima varianta, este cea manuala. Aceasta va fi prezentata in continuare :
a) Se creeaza o clasa cu numele AllTests.
b) In aceasta calsa se construieste o metoda statica care va returna un obiect TestSuite.
In implementarea acestei metode exista mai multe variante :
Varianta 1:
-

se creeaza un obiect TestSuite apeland constructorul de forma TestSuite(String);


TestSuite suitaTeste=new TestSuite(Suita de teste);

se adauga testele unei clase TestXXX,utilizand metoda addTestSuite(Class). Aceasta metoda va utliza
reflexivitatea pentru a studia metodele clasei furnizate ca si parametru.
suitaTeste.addTestSuite(ShoppingCart.class) ;

se adauga testele unei alte clase de teste, si asa mai departe.

metoda va returna obiectul astfel creat;

[LABORATOR DE INGINERIE SOFTWARE]

Prep.Drd. Aritoni Ovidiu

Varianta 2 :
package unittests;
import junit.framework.Test;
import junit.framework.TestSuite;
public class AllTests {
/**
* Asambleaza si returneaza o suita de teste Se pot adauga teste noi.
*
*@return O suita de teste.
*/
public static Test suite() {
TestSuite suite = new TestSuite();
// clasa ShoppingCartTest.
suite.addTest(ShoppingCartTest.suite());
// O alta clasa de test.
//suite.addTest(CreditCardTest.suite());
return suite;
}

/**
* Lanseaza in executie suita de teste.
*
*@param args Description of the Parameter
*/
public static void main(String args[]) {
junit.swingui.TestRunner.run(AllTests.class);
}

6. Raportul de testare JUnit


JUnit PDF Report
http://junitpdfreport.sourceforge.net/managedcontent/
http://junitpdfreport.sourceforge.net/managedcontent/GettingStarted

7. dd

[LABORATOR DE INGINERIE SOFTWARE]

http://www.cs.chalmers.se/Cs/Grundutb/Kurser/prove/exercises5.html

Prep.Drd. Aritoni Ovidiu

S-ar putea să vă placă și