JUnit
TGI Uni-Hamburg, PJS Anatomie einer Open Source IDE, ws2000
Motivation
- Erweiterung des Beispiels
Motivation
- Erweiterung des Beispiels
Motivation
- “Was Ihr wollt?“
- Software
- schnell erstellen
- effektiv
- effizient
- von einem Team /mehreren Leuten geschaffen
- gut lesbar / verständlich
- einfach
-
Motivation
- Zeit sparen! Wie?
- Durch die Einsparung von Tests?
- Durch konsequentes einsetzen von Tests?
Motivation
- Zeit sparen! Wie?
- Durch die Einsparung von Tests?
- kurzfristig
- zu viel Druck / “keine Zeit“
- ? “vicious cycle“
-
- Durch konsequentes einsetzen von Tests?
- langfristig
- Automatisierung
Motivation
- Lösungsansatz: Kent Beck und Erich Gamma
- konsequent testen
- programming = coding + testing
- “ write a little code write a little test”
- besser noch: erst Tests, dann Code schreiben
- XP Vorgehen / refactoring
- tests ? code ? simplify tests ? simplify code
- ? JUnit
- unterstützt auto- und systematisches testen
Umgebung
- TestRunner - ui, textui, swingui
Pakete
- junit.framework
- Test, ...
- Assert, TestCase, TestResult, TestSuite, ...
Framework
- Class TestCase
- protected void setUp()
- protected void tearDown()
- protected void runTest()
- public void run(TestResult result) // run()
- ...
-
- Class TestSuite
- public void addTest(Test test)
- public void run(TestResult result)
- ...
Beispiel: Class Money
private String fCurrency;
public Money(int amount, String currency) {
public String currency() {
public Money add(Money m) {
return new Money(amount()+m.amount(), currency()); }
Beispiel: Class MoneyTest
public class MoneyTest extends TestCase {
public void testSimpleAdd() {
Money m12CHF= new Money(12, "CHF"); //(1)
Money m14CHF= new Money(14, "CHF"); //(2)
Money expected= new Money(26, "CHF");
Money result= m12CHF.add(m14CHF);
assert(expected.equals(result)); //(3)
Beispiel: Class MoneyTest
public void testEquals() {
Money m12CHF= new Money(12, "CHF");
Money m14CHF= new Money(14, "CHF");
assert(!m12CHF.equals(null));
assertEquals(m12CHF, new Money(12, "CHF"));
assert(!m12CHF.equals(m14CHF));
Beispiel: Class Money
public boolean equals(Object anObject) {
if (! anObject instanceof Money)
Money aMoney= (Money)anObject;
return aMoney.currency().equals(currency())
&& amount() == aMoney.amount();
Intermezzo
- Was sind sinnvolle Tests?
- Ziel: die Klassen sollen durch die Tests fest eingespannt werden - vollständig spezifiziert
- Eckwerte
- Nicht definierte Werte (null)
- Extremfälle
- möglichst Vollständig z.B.equals:
- nicht nur auf Gleichheit gleicher Objekte pruefen
- sondern auch auf Ungleichheit ungleicher Objekte
Beispiel - Class MoneyBag
private Vector fMonies= new Vector();
MoneyBag(Money m1, Money m2) {
for (int i= 0; i < bag.length; i++)
Beispiel - Class MoneyTest
fMB1= new MoneyBag(f12CHF, f7USD);
fMB2= new MoneyBag(f14CHF, f21USD);
assert(!fMB1.equals(null));
assertEquals(fMB1, fMB1);
assert(!fMB1.equals(f12CHF));
assert(!f12CHF.equals(fMB1));
assert(!fMB1.equals(fMB2));
Zusammenfassung
- JUnit
- Begriffe:
- Klassen:
- Methoden
- assert(), assertEquals(), run(), runTest()
- ermöglicht systematisches und automatisches Testen
- wirksam nur in Zusammenhang mit XP Prinzipien
Quellen
- www.junit.org
- JUnit Cookbook
- JUnit Test Infected: Programmers Love Writing Tests
- JUnit A Cook's Tour
- API