Documente Academic
Documente Profesional
Documente Cultură
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.
Documentatie :
http://www.cs.wm.edu/~noonan/junit/doc/faq/faq.htm
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
*/
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;
}
/**
* 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;
/**
* 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.
*/
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);
}
/**
* 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();
}
/**
* Check if shopping cart is empty.
*
*@return true if cart is empty; false otherwhise.
*/
public boolean isEmpty() {
return (items.size() == 0);
}
}
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 :
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.*;
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.
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.
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.
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.
3.
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)
assertEquals(Object expected,Object
actual)
assertSame(Object expected,Object
actual)
assertNotSame(Object expected,Object
actual)
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.
Dupa cum spuneam mai sus pentru a ne asigura de faptul ca o aplicatie software este conforma cu cerintele
functionale cerute se utilizeaza testarea
.......
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) ;
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);
}
7. dd
http://www.cs.chalmers.se/Cs/Grundutb/Kurser/prove/exercises5.html