Professional Documents
Culture Documents
Java Tecaj 14 Prezentacija
Java Tecaj 14 Prezentacija
Java tečaj
13. dio
Test Driven Development
(TDD)
© 2008.
TDD predavanje
● Koraci:
– Zahtjevi
– Izgradnja
– Implementacija
– Testiranje
– Postavljanje
http://en.wikipedia.org/wiki/Software_testing
Testovi
● Što znači testirati?
– Provjeriti da neki dio koda radi kako ste zamislili (ili
netko drugi)
● Zašto testirati?
– Provjeriti da manja promjena nije uzrokovala
nestabilnost u proizvodu
– Promjena implementacije metode
– Dokumentacija
– 2/3 posla u izgradnji nekog softvera otpada na
održavanje (popravljanje bugova)
● Kako testirati?
Unit testovi
● Testiranje najmanje cjeline (razred)
● Unutar razreda se posebno testiraju metode
(najčešće se jednim testom pokriva jedna
metoda)
● Pretpostavka: sve ostale metode rade
savršeno
● Napomena: unit testing nije specifičan za
Javu ili za objektno orijentiranje jezike
Unit testovi
● Kako testirati?
– princip System.out.println(“T7b – tu sam!”);
● dobro za rješavanje (debugiranje) jednog konkretnog
problema
● što ako je čitav kod isprepleten ovakvim ispisima?
● test je prošao dobro - onda kada developer vidi
zadovoljavajući slijed ispisa
● ekstremno teško za provjeravati ako testova ima više
● vremenski vrlo zahtjevno
Unit testovi
● Kako testirati?
– automatski
● opisati test na način koji razumije računalo
● omogućiti da računalo provjeri je li test prošao ili ne
● tek ako je test pao, ispisati odgovarajuću poruku i
detalje
http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks
JUnit
● Unit testing framework
● Open source
● Homepage: http://www.junit.org/
● Već se nalazi u eclipse-u
● Najnovija verzija: 4.3
● Pokretanje:
package hr.fer.zemris.collections;
import org.junit.Test;
@Test
public void sizeOfEmptyList() {
// ...
}
}
Anatomija jednog testa
● Napisati razred koji sadrži test
– test je javna metoda koja ne vraća ništa, i (osim u
slučaju parametarskih testova) ne prima ništa
– metoda je označena anotacijom @Test
@Test
public void sizeOfEmptyList() {
LinkedList<String> list = new LinkedList<String>();
assertEquals( "Velicina prazne liste nije nula.",
0,
list.size());
list = null;
}
Anatomija jednog testa
● Napisati razred koji sadrži test
– Uvjete koje test mora zadovoljiti provjerava se
nizom assert metoda – metode razreda
org.junit.Assert, koje smo statički importali
LinkedList<String> list =
new LinkedList<String>(); Priprema testa
assertEquals(
"Velicina prazne liste nije nula.",
Test
0,
list.size());
}
Anatomija jednog testa
● U isti razred može se smjestiti više testova
● Ako svi zahtjevaju istu pripremu, kod možemo izdvojiti
u zasebne metode, označene s @Before i @After
Anatomija jednog testa
private LinkedList<String> list;
@Before
public void setUp() {
list = new LinkedList<String>();
}
@After
public void tearDown() {
list = null;
}
@Test
public void sizeOfEmptyList() {
assertEquals("Velicina prazne liste nije nula.", 0, list.size());
}
@Test
public void sizeOfNonEmptyList() {
list.add("Podatak");
assertEquals("Velicina liste nije jedan.", 1, list.size());
}
Anatomija jednog testa
● @Test anotacija podržava expected parametar
@Test(expected=NullPointerException.class)
@Test(expected=IndexOutOfBoundsException.class)
public void removeFromEmptyList() {
list.remove(0);
}
JUnit – dodatne anotacije
● @BeforeClass – metoda se pokreće jednom
prije svih testova
@BeforeClass
public static void imeMetode() { ... }
@Ignore
@Test
public void imeMetode() { ... }
}
Anatomija jednog testa
@RunWith(value=Parameterized.class)
public class FibboTest {
private int n;
private int expected;
@Parameters
public static Collection<?> data() {
Object[][] d = new Object[][] {{0,0},{1,1},{2,1},{3,2}};
return Arrays.asList(d);
}
@Test
public void fibbTest() {
Assert.assertEquals("Pogresan izracun.", expected, fibb(n));
}
}
Anatomija jednog testa
@RunWith(value=Parameterized.class)
public class FibboTest {
// ...
// ...
}
JUnit – dodatne anotacije
● @RunWith – pokretanje testa s drugim
TestRunner-ima
@RunWith(Suite.class)
@Suite.SuiteClasses({
FactorialTest.class,
ListTest.class
})
public class AllTests {
}
Test Driven
Development
(TDD)
TDD
● Što je TDD?
– Tehnika kako povećati produktivnost pri stvaranju
proizvoda
– Test First Design (TFS) + refactoring
● Koji je cilj TDD-a?