5. Dokumentieren und Testen Advanced Programming Techniques Wintersemester 2009 / 2010 Prof. Dr. Bernhard Humm Hochschule Darmstadt, FB Informatik
1
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Einordnung in den gesamten Kurs 1. Einführung 2. Java Schnellkurs 3. Programmieren gegen Schnittstellen 4. Software-Kategorien 5. Dokumentieren und Testen 6. Komponenten 7. Regeln zum Design von Komponenten 8. Fehlerbehandlung 9. Konfigurationsmanagement 10. Debugging, Tracing, Logging 2
11. Refactoring
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Agenda
Dokumentieren Dokumentieren Testen
Was wird mittels JavaDoc dokumentiert? Die Außensicht, d.h. immer aus Sicht des Nutzers!
Nutzer Deklaration und Konfiguration … I i; i = new C(); …
4
JavaDoc
Definition (Außensicht) public interface I { public void m (); … }
Nutzung … i.m(); …
Anbieter
Implementierung (Innensicht) public class C implements I { public void m() {…} … In-line } Kommentare
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Was wird dokumentiert? Die Spezifikation! Schnittstelle
Schnittstellenname
public interface OrderManager {
Name
Rückgabetyp
Operationen
Operationsname
Eingabeparameter und -typ
Order placeOrder (Customer customer, Article article) throws NotAvailableException;
Signatur }
Semantik
Ausnahme Prosa, Vorbedingungen, Nachbedingungen, etc.
Nicht-funktionale Eigenschaften Protokoll
5
Prosa
Prosa, Sequenzdiagramme etc.
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Beispiel Accounting
6
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Parameterart: in, out, inout
Method Details Accounting
Post condition
Java Notation für Bedingungen
Schlüsselwort exists Schlüsselwort result
Semiformale Notation angelehnt an QSL [Siedersleben: Moderne Softwarearchitektur] 7
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Beispiel Borrowing
8
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Method Details Borrowing Pre condition
Post condition
9
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Agenda
Dokumentieren Testen Testen
Unit Tests: Was wird wann wie getestet? Was? – Unit = kleinste Testeinheit in einem System, z.B. einzelne Methode – Unit Test = isolierter, (meist) automatisierter Test einer Unit mittels eines Testrahmens Wann? Früh testen! – Nach XP werden die Testfälle vor dem eigentlichen System programmiert (und liefern somit eine ausführbare Spezifikation) – Main Methoden zum schnellen Ausprobieren sind von gestern! Wie? Umfassend und destruktiv testen: – Alle Methoden (zumindest in der Außensicht) – Verschiedene typische Werte – Extremwerte (null, -9999, …): wir wollen ja wirklich Fehler finden! – Ausnahmen (verletzte Preconditions etc.)
11
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Testen von Java-Klassen mit JUnit
TestCase Aufräumen
setUp() tearDown() test1() test2() test3() ...
12
Vorbereiten des Unit Tests (jedes einzelnen!)
Einzelne Unit Tests
All Unit Tests müssen voneinander unabhängig sein! Die Reihenfolge der Ausführung ist nicht definiert test2() kann nicht davon ausgehen, dass Daten aus test1() zur Verfügung stehen
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Aufbau eines Unit Tests
public Scanner(Hashtable mapping) { super(); this.mapping = mapping; } public Vector scan(String text) { Vector result = new Vector(); StringTokenizer st = new StringTokenizer(text); while (st.hasMoreTokens()) { Integer i = (Integer) mapping.get(st.nextToken()); if(i == null) { i = new Integer(NO_TOKEN); } result.add(i); } return result; }
public void testScan() { Hashtable mapper = new Hashtable(); mapper.put("Null", new Integer(0)); mapper.put("Eins", new Integer(1)); ... mapper.put("Neun", new Integer(9)); scanner = new Scanner(mapper); Vector tokenIDs = scanner.scan("Eins Fünf Drei Neun"); assertEquals(1, ((Integer) tokenIDs.elementAt(0)).intValue()); ... assertEquals(9, ((Integer) tokenIDs.elementAt(3)).intValue());
Testvorbereitung
Testdurchführung
Testauswertung
} 13
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010
Testsuiten
Testsuite
Testklasse
Testsuite
Testsuite
Testsuite
Testklasse
Testklasse
Testsuite
Testklasse Testklasse 14
Testsuite
Testklasse Testklasse
Prof. Dr. Bernhard Humm, Hochschule Darmstadt, FB Informatik: Advanced Programming Techniques, WS 09/10. 28.10.2010