• Keine Ergebnisse gefunden

Systematisches Testen

N/A
N/A
Protected

Academic year: 2022

Aktie "Systematisches Testen"

Copied!
15
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Systematisches Testen

(2)

Unit Testing

Objektorientierte Entwicklung

Entwicklung von vielen unabh¨angigen Einheiten (Klassen, Methoden), aus denen das Gesamtprogramm zusammengesetzt wird.

Ziel: Wenn sie nur alle Einheiten korrekt verhalten, dann verh¨alt sich das Programm wie gew¨unscht.

Unit Testing

systematisches Testen der einzelnen Einheiten

zwingt Entwickler zu planen und ¨uber das gew¨unschte Verhalten der Programmeinheiten nachzudenken

unterst¨utzt Design by Contract: teste stichprobenartig, dass alle Klassen ihre Vertr¨age einhalten

(3)

Unit Testing mit JUnit

Was wird getestet

public/protected-Methoden

private-Methoden k¨onnen mit assertgetestet werden.

Wie wird getestet

Tests sind vom Programm separate Klassen (man kann Tests als Teil der Dokumentation auffassen).

Darin wird eine beliebige Anzahl von Testfunktionen implementiert.

Testfunktionen mit Java-Annotationen gekennzeichnet.

Die Tests werden dann durch ein bestimmtes Programm ausgef¨uhrt und die Ergebnisse werden ausgewertet (¨ublicherweise durch Tools wie Eclipse oder NetBeans).

(4)

Java-Annotationen

Mit Annotationen kann man Java-Programme mit n¨utzlichen Zusatzinformationen versehen werden.

In Java sind sieben Arten von Annotationen eingebaut, z.B.

@Deprecated,@Override,@SuppressWarnings Man kann eigene Annotationen definieren.

In JUnit 4 sind zum Beispiel@Test,@Before,@After,

@BeforeClass,@AfterClassund@Ignore definiert.

(5)

Annotationen – Beispiel

Kennzeichnung von Klassen/Methoden, die nicht mehr benutzt werden sollen und nur aus Kompatibilit¨atsgr¨unden noch vorhanden sind.

@Deprecated public class A {

...

}

Compiler erzeugt Warnung, wenn die KlasseAbenutzt wird.

(6)

Annotationen – Beispiel

Kennzeichne Funktionen, die eine bereits existierende Funktion in einer Oberklasse ¨uberschreiben mit @Override.

public class A {

public void f(List l) { ...

} }

public class B extends A {

@Override

public void f(List l) { ...

} }

(7)

Annotationen – Beispiel

@Overridehilft h¨aufige Fehler zu finden:

public class A { public class B extends A { public void f(List l) { @Override

... public void f(LinkedList l) {

} ...

private void g() { }

... @Override

} public void g() {

} ...

} }

Compilerfehler: ¨Uberladen statt ¨Uberschreiben.

(8)

JUnit 4

Tests sind in separat vom eigentlichen Programm in eigenen Klassen implementiert (z.B. eine Testklasse f¨ur jede zu testende Klasse)

Testklasse kann eine beliebige Anzahl von Tests implementieren.

Einzelne Tests werden durch Methoden in der Testklasse implementiert:

durch Annotation @Testals Test gekennzeichnet

beliebiger Methodenname

publicund ohne Argumente

Die Tests in einer Testklasse werden automatisiert ausgef¨uhrt und ein Gesamtergebnis angezeigt.

(9)

Testfunktionen

Allgemeine Funktion von Testfunktionen

1 Konstruktion der zu testenden Situation

Objekte der zu testenden Klassen erzeugen

Objekte in den gew¨unschten Zustand versetzen

2 Uberpr¨¨ ufung des erwarteten Ergebnis

FunktionenassertTrue(test),assertEquals(x, y), . . . inorg.junit.Assert.

Ist das erwartete Ergebnis eine Exception, kann man das in der Annotation angeben:

@Test(expected = ExceptionName.class)

(10)

JUnit 4 – Beispiel

import org.junit.*;

import static org.junit.Assert.assertEquals;

public class BoardTest {

@Test

public void testFood1() {

BoardServerToClient b = new BoardServerToClient(100, 100);

int x = 94, y = 23, a = 34;

b.setFood(x, y, a);

assertEquals(b.getFood(x,y), a);

}

@Test(expected = java.lang.IndexOutOfBoundsException.class) public void testFood2() {

BoardServerToClient b = new BoardServerToClient(100, 100);

int x = 100, y = 23, a = 34;

b.setFood(x, y, a);

} }

(11)

JUnit 4 – Ausf¨ uhren der Tests

Eclipse, NetBeans, . . . bieten bequeme M¨oglichkeiten, Tests ablaufen zu lassen und Ergebnisse anzuzeigen.

Tests direkt ausf¨uhren:

junit.jar von www.junit.orgbeziehen und zum Classpath hinzuf¨ugen.

Programm und Testklassen kompilieren.

Ausf¨uhrung der Tests mit

java org.junit.runner.JUnitCore BoardTest

JUnit version 4.3.1 ..E

Time: 0.028

There was 1 failure:

1) testFood2(BoardTest)

java.lang.AssertionError: (Stack backtrace) FAILURES!!!

Tests run: 2, Failures: 1

(12)

Weitere Annotationen

Eine Testklasse enth¨alt oft viele ¨ahnliche Testf¨alle.

Programmtext, der vor und nach jedem Test ausgef¨uhrt werden soll, kann in Methoden mit den Annotationen@Before und

@Aftergeschrieben werden.

Alle mit @Before markierten Methoden werden vorjedem Test aufgerufen (in unbestimmter Reihenfolge).

Alle mit @Aftermarkierten Methoden werden nach jedem Test aufgerufen (in unbestimmter Reihenfolge).

(13)

Beispiel – @Before

public class BoardTest {

private BoardServerToClient b;

@Before public void initBoard() {

b = new BoardServerToClient(100, 100);

}

@Test public void testFood1() { int x = 94, y = 23, a = 34;

b.setFood(x, y, a);

assertEquals(b.getFood(x, y), a);

}

@Test(expected = java.lang.IndexOutOfBoundsException.class) public void testFood2() {

b.setFood(100, 23, 34);

} }

(14)

Einmaliges Einrichten der Testumgebung

In manchen F¨allen (z.B. teure@Before-Funktionen) ist es g¨unstig, eine Testsituation einmal einzurichten und dann f¨ur alle Testf¨alle zu benutzen.

Statische Methoden mit Annotationen@BeforeClassund

@AfterClass.

Alle mit @BeforeClass markierten Methoden werdeneinmal vor den Tests ausgef¨uhrt.

Alle mit @AfterClassmarkierten Methoden werdeneinmal nach den Tests ausgef¨uhrt.

(15)

Entwurf von Tests

Was sollte man mit Unit-Tests pr¨ufen?

Methoden sowohl mit erwarteten als auch unerwarteten Eingaben testen

Rand- und Ausnahmef¨alle pr¨ufen

Werden Fehler richtig behandelt?

Schreibe Tests, um zu verhindern, dass einmal aufgetretene Fehler nochmal auftreten (z.B. durch unvorsichtiges Revert).

Tests sollten einen (gedachten) Vertrag m¨oglichst gut stichprobenartig ¨uberpr¨ufen.

Referenzen

ÄHNLICHE DOKUMENTE

Da der Umfang der Testaufgaben im Bereich Elektrik und Elektronik aber stetig wächst, ist diese punktuelle Sicht kaum noch geeignet heutige Anforderungen an die Steuergeräte-

The higher value added in apparel production, respectively their predominant share in the country’s overall textile exports (83.6% in 2009) determines respective differences

The government announcement of its intention to enforce payment rescheduling immediately led both Moody’s and Standard services to heavily downgrade the Islamic sukuk along with

Although a situation of absolute and direct political dependence between the Soviet Republic of Georgia and the Soviet Union existed, there are some indications that Georgia –

Note that the lexical distinction German makes doesn’t, in fact, provide an argu- ment against the analysis of Beaver and Condoravdi (2003), according to which the clausal case

To achieve this goal it answers the following questions: what changes have occurred as a result of Bulgaria’s membership in the openness of the Bulgarian economy; what

Bitte beschriften Sie jedes Blatt mit Ihrem Namen. Es k¨ onnen maximal 30 Punkte

The data is annual and we focus on the following series: gross national saving, gross domestic saving, gross investment, current account balance, gross private capital flows, foreign