Fortgeschrittenes Programmieren mit Java Test Driven Development Test getriebene Programmierung Benedikt Boeck Hochschule für Angewandte Wissenschaften Hamburg 6. November 2009 B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 1 / 25
Inhaltsverzeichnis 1 Theorie Was ist Testgetriebene Entwicklung? Direktiven der Testgetriebenen Entwicklung Entwicklungszyklus 2 Praxis Beispiel: Brief Porto Einblick: Praktikumsaufgabe Verkettete Liste Gedanken Experiment: Cosinus 3 Schluß Fazit B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 2 / 25
Theorie Testgetriebene Entwicklung Test Driven Development (TDD), Extreme Testing gehört zum Extreme Programming TDD ist nicht Java spezifisch B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 3 / 25
Theorie Was ist Testgetriebene Entwicklung? Was ist Testgetriebene Entwicklung? TDD ist eine qualitätsbewusste Programmiertechnik Entwicklung in kleinen Schritten Unit Tests: Anforderungen an unseren Code Akzeptanztests: Anforderungen des Kunden Dieser Vortrag beschäftigt sich mit den Grundlagen: vor allem den Unit Tests B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 4 / 25
Theorie Was ist Testgetriebene Entwicklung? JUnit 4 JUnit ist ein Framework für Java in diesem Vortrag wird JUnit 4 verwendet http://www.junit.org/ mini Tuturial: http://www.junit.org/node/477 B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 5 / 25
Theorie Was ist Testgetriebene Entwicklung? Gründe für TDD Testen ist wichtig Stichwort: Qualitätskontrolle wird jedoch bei der klassichen Vorgenhsweise oft vernachlässigt Testen ist typisch die letzte Phase in Projekten etwas worauf Programmierer keine Lust hat ärgerlich Fehler lange nach ihrer Entstehung zu finden das erste was wegfällt, wenn es zeitlich eng wird selten systematisch Die Idee bei TDD ist es zuerst den Testcode zu schreiben, dabei häufig auszuführen automatisiert wiederholbar B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 6 / 25
Theorie Direktiven der Testgetriebenen Entwicklung Direktiven der Testgetriebenen Entwicklung Aufgstellt von Frank Westphal [1] 1 Motivieren Sie jede Änderung des Programmverhaltens durch einen automatisierten Test. 2 Bringen Sie Ihren Code immer in die einfache Form. 3 Integrieren Sie Ihren Code so häufig wie nötig. B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 7 / 25
Theorie Direktiven der Testgetriebenen Entwicklung 1. Direktive - Testgetriebene Programmierung Motivieren Sie jede Änderung des Programmverhaltens durch einen automatisierten Test. der Test kommt vor dem Programmcode jede Änderung in der Programmfunktionalität, wird zuerst durch einen Test gefodert B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 8 / 25
Theorie Direktiven der Testgetriebenen Entwicklung 2. Direktive - Refactoring Bringen Sie Ihren Code immer in die einfache Form. Ziel einfachen und sauberen Code zu erhalten d.h. Code Pflege B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 9 / 25
Theorie Direktiven der Testgetriebenen Entwicklung 3. Direktive - Häufige Integration Integrieren Sie Ihren Code so häufig wie nötig. Wenn Software im Team entwickelt wird, regelmäßiges agbgleichen Um Konflikte früh zu erkennen B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 10 / 25
Theorie Entwicklungszyklus Entwicklungszyklus 1 Test schreiben, dieser sollte zunächst fehlschlagen 2 Code schreiben, gerade so viel das der Test fehlschlägt 3 Code schreiben, gerade so viel das alle Tests laufen Refactoring: Code aufräumen/vereinfachen, und mit vorhandenden Test gegenprüfen B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 11 / 25
Theorie Entwicklungszyklus Ausnahmen 1 Unerwarteter Erfolg: Der Test läuft, obwohl er eigentlich fehlschalgen sollte Code erfüllt bereits die Anfoderungen Der Test ist fehlerhaft 2 Unerwarteter Fehlschlag: Der Test schlägt fehl, obwohl er eigentlich laufen sollte 3 Zu großer Schritt Test läßt sich nur mit erheblichen Aufwand erfüllen B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 12 / 25
Theorie Entwicklungszyklus Mut zum Rückschritt Was ist wenn etwas nicht geht? Oder sich festgefahren hat ruhig Code wieder rausschmeißen und neu anfangen zurück zu einem Punkt der einem noch richtig erschien gut möglich da in kleinen Schritten programmiert wird B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 13 / 25
Beispiel: Brief Porto Porto Brief Porto abhängig von Gewicht http://www.deutschepost.de/dpag?xmlfile=link1015318_832 http://www.portokalkulator.de Gewicht Porto Standard <= 20g 0,55 Kompakt <= 50g 0,90 Groß <= 500g 1,45 Maxi <= 1000g 2,20 B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 14 / 25
Beispiel: Brief Porto Anfang import org. junit.test ; public class BriefPortoTest { BriefPorto porto ; @Test public void getporto (){ BriefPorto nicht bekannt Klasse erstellen public class BriefPorto { B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 15 / 25
Beispiel: Brief Porto Next Step gedanken um die Schnittstelle import static org. junit. Assert.*; import org. junit. Before ; import org. junit.test ; public class BriefPortoTest { BriefPorto porto ; @Before public void setup (){ porto = new BriefPorto (); @Test public void calcporto (){ assertequals (" Standard ", 0.55f, porto.calc (10), 0.001) ; public class BriefPorto { public double calc ( int g) { return 0; public class BriefPorto { public double calc ( int g) { return 0.55; B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 16 / 25
Beispiel: Brief Porto Next Step @Test public void calcporto50 (){ assertequals (" Kompakt ", 0.90f, porto.calc (50), 0.001) ; public double calc ( int g) { if (g <= 20) return 0.55; else return 0.90; B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 17 / 25
Beispiel: Brief Porto Next Step @Test public void calcporto500 (){ assertequals (" Gross ", 1.45f, porto.calc (500), 0.001) ; public double calc ( int g) { if (g <= 20) return 0.55; else if (g <= 50) return 0.90; else return 1.45; B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 18 / 25
Beispiel: Brief Porto Next Step @Test public void clacporto1000 (){ assertequals ("Maxi ", 2.20f, porto.calc (1000), 0.001) ; public class BriefPorto { public double calc ( int g) { if (g <= 20) return 0.55; else if (g <= 50) return 0.90; else if (g <= 500) return 1.45; else return 2.20; B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 19 / 25
Beispiel: Brief Porto Next Step @Test ( expected = IllegalArgumentException. class ) public void clacporto1001 (){ porto.calc (1001) ; public double calc ( int g) throws IllegalArgumentException { if (g > 1000) throw new IllegalArgumentException (); if (g <= 20) return 0.55; else if (g <= 50) return 0.90; else if (g <= 500) return 1.45; else return 2.20; B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 20 / 25
Beispiel: Brief Porto Last Step @Test ( expected = IllegalArgumentException. class ) public void clacportonegative (){ porto. calc ( -1); public double calc ( int g) throws IllegalArgumentException { if (g > 1000 g < 0) throw new IllegalArgumentException (); if (g <= 20) return 0.55; else if (g <= 50) return 0.90; else if (g <= 500) return 1.45; else return 2.20; B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 21 / 25
Einblick: Praktikumsaufgabe Verkettete Liste Einblick: Praktikumsaufgabe Verkettete Liste kein konstruiertes Beispiel mit TDD entwickelt um zu sehen wie TDD in etwas größer aussieht B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 22 / 25
Gedanken Experiment: Cosinus Gedanken Experiment: Cosinus Eine Cosinus Funktion nach TDD entwickeln 1 cos(0) B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 23 / 25
Gedanken Experiment: Cosinus Gedanken Experiment: Cosinus Eine Cosinus Funktion nach TDD entwickeln 1 cos(0) return 1; B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 23 / 25
Gedanken Experiment: Cosinus Gedanken Experiment: Cosinus Eine Cosinus Funktion nach TDD entwickeln 1 cos(0) return 1; 2 cos(π/2) B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 23 / 25
Gedanken Experiment: Cosinus Gedanken Experiment: Cosinus Eine Cosinus Funktion nach TDD entwickeln 1 cos(0) return 1; 2 cos(π/2) if (d = 0) return 1; else return 0; B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 23 / 25
Gedanken Experiment: Cosinus Gedanken Experiment: Cosinus Eine Cosinus Funktion nach TDD entwickeln 1 cos(0) return 1; 2 cos(π/2) if (d = 0) return 1; else return 0; 3 cos(2π) B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 23 / 25
Gedanken Experiment: Cosinus Gedanken Experiment: Cosinus Eine Cosinus Funktion nach TDD entwickeln 1 cos(0) return 1; 2 cos(π/2) if (d = 0) return 1; else return 0; 3 cos(2π) if (d = pi /2) return 0; else return 1; B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 23 / 25
Gedanken Experiment: Cosinus Gedanken Experiment: Cosinus Eine Cosinus Funktion nach TDD entwickeln 1 cos(0) return 1; 2 cos(π/2) if (d = 0) return 1; else return 0; 3 cos(2π) if (d = pi /2) return 0; else return 1; Eigentlicher Ansatz: Cosinus Reihe: cos(x) = x2k k=0 ( 1)k (2k)! dann ausreichend Tests erstellen B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 23 / 25
Schluß Fazit Fazit Debugger wird seltener benötigt direktes Feedback bessere Orientierung Aufteilung in Abschnitte Wie weit bin ich? Wo war ich zuletzt? B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 24 / 25
Schluß Letzte Folie Vielen Dank für Eure Aufmerksamkeit Das wars. Benedikt Boeck Quellen: Frank Westphal: Testgetriebene Entwicklung mit JUnit & FIT dpunkt.verlag, 2006 http: //de.wikipedia.org/wiki/testgetriebene_entwicklung B. Boeck (HAW Hamburg) Test Driven Development 06.11.2009 25 / 25