Test-Driven Design: Ein einfaches Beispiel



Ähnliche Dokumente
Test-Driven Design: Ein einfaches Beispiel

Programmierkurs Java

Software-Engineering Software-Management

Fortgeschrittenes Programmieren mit Java. Test Driven Development

Objektorientierte Programmierung

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Java: Vererbung. Teil 3: super()

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Testen mit JUnit. Motivation

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

Überblick. Lineares Suchen

Arbeiten mit UMLed und Delphi

Programmieren in Java

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Tagesprogramm

Software Engineering Klassendiagramme Assoziationen

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Software Entwicklung II (SS12)

Praktische Übung 'JUnit-Test'

Objektbasierte Entwicklung

Einführung in die Programmierung für Wirtschaftsinformatik

5. Tutorium zu Programmieren

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Das Test-Framework JUnit ETIS SS04

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Übung 9 - Lösungsvorschlag

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Probeklausur Softwareengineering SS 15

Übung Grundlagen der Programmierung. Übung 05: Arrays. Abgabetermin: xx.xx.xxxx. Java-Programm Testplan Testergebnisse

Einfache Rechenstrukturen und Kontrollfluss II

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Lösungsvorschlag für Übungsblatt 4 Software Engineering 1 (WS 2012/13)

Informatik Grundlagen, WS04, Seminar 13

Prüfung Software Engineering I (IB)

Einführung in die Informatik Tools

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

Prinzipien Objektorientierter Programmierung

Das BANK-now Finanzierungsmodul.

Übungsblatt 3: Algorithmen in Java & Grammatiken

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version:

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

U08 Entwurfsmuster (II)

Stellvertretenden Genehmiger verwalten. Tipps & Tricks

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

Wirtschaftsinformatik I

Installation und Inbetriebnahme von Microsoft Visual C Express

JUnit - Test Driven Development. Bernhard Frey, Thorsten Stratmann, Jackson Takam, Michel Müller 1

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Wollen Sie einen mühelosen Direkteinstieg zum Online Shop der ÖAG? Sie sind nur einen Klick davon entfernt!

Facebook I-Frame Tabs mit Papoo Plugin erstellen und verwalten

Grundlagen der Informatik

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Agile Vorgehensmodelle in der Softwareentwicklung: Scrum

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Tevalo Handbuch v 1.1 vom

Erwin Grüner

DAUERHAFTE ÄNDERUNG VON SCHRIFTART, SCHRIFTGRÖßE

Programmiervorkurs WS 2012/2013. Schleifen und Methoden

Mächtigkeit von WHILE-Programmen

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Autoresponder Unlimited 2.0

Folge 18 - Vererbung

Tangentengleichung. Wie lautet die Geradengleichung für die Tangente, y T =? Antwort:

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Objektorientierte Programmierung

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept

EMIS - Langzeitmessung

OECD Programme for International Student Assessment PISA Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Prüfung Computation, Programming

Mathematischer Vorbereitungskurs für Ökonomen

Anleitung über den Umgang mit Schildern

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Die Invaliden-Versicherung ändert sich

Software Engineering I

Eigenwerte und Eigenvektoren von Matrizen

Kurzanleitung MAN E-Learning (WBT)

Testen mit JUnit. Martin Wirsing. Ziele. in Zusammenarbeit mit Michael Barth, Philipp Meier und Gefei Zhang

Objektorientierte Programmierung für Anfänger am Beispiel PHP

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

INTERNET UND MMS MIT DEM QTEK2020 MARCO 28. MÄRZ 04

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Auswertung JAM! Fragebogen: Deine Meinung ist uns wichtig!

Zeichen bei Zahlen entschlüsseln

Studentische Lösung zum Übungsblatt Nr. 7

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Dr. Hanno Schauer Mons-Tabor-Gymnasium Montabaur. UML-Klassendiagramme als Werkzeug im Unterricht

Große Übung Praktische Informatik 1

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Unit Tests mit Junit 4. Dario Borchers

Einführung in die Programmierung

Dokumentation Schedulingverfahren

Prüfung Software Engineering II (IB)

Transkript:

Test-Driven Design: Ein einfaches Beispiel Martin Wirsing in Zusammenarbeit mit Moritz Hammer und Axel Rauschmayer SS 06

2 Ziele Veranschaulichung der Technik des Test-Driven Design am Beispiel eines Programms zur Berechnung der Quersumme Lernen JUnit für Test-Driven Design einzusetzen

3 Test-gesteuerter Entwurf Neue Software-Enwurfstechniken stellen das Testen vor das Implementieren des Programms: Exteme Programming, Test-first Programming, Agile Software Development Schritte des Test-gesteuerten Entwurfs: 1. Erstelle UML-Diagramm 2. Entwerfe einen Test für eine Methode Kurze Iterationen, in denen abwechselnd Code und Test geschrieben wird. 3. Schreibe möglichst einfachen Code, bis der Test nicht mehr fehlschlägt 4. Wiederhole 2. und 3. bis alle Methoden des Klassendiagramms implementiert sind. Dabei wird häufig der Code (und manchmal der Test) restrukturiert ( Refactoring ). Jedes Mal werden alle Tests durchgeführt, um sicher zu stellen, dass die Coderestrukturierung nicht zu Fehlern im alten Code geführt hat.

4 UML Diagramm für Quersumme Quersumme int berechnequersumme (int zahl) Dieses UML-Diagramm spiegelt eine Entwurfsentscheidung wider; eine andere Möglichkeit wäre ein Attribut zahl und int berechnequersumme() Berechnet Quersumme von zahl,.

5 Das Gerüst der Testklasse Quersumme import junit.framework.testcase; public class QuersummeTest extends TestCase { public QuersummeTest() { super(); < Testmethoden> public static void main(string args[]) { junit.textui.testrunner.run(quersummetest.class); Kurze Iterationen, in denen abwechselnd Code und Test geschrieben wird.

6 Ein erster Test für Zahlen kleiner als 10 public void testquersummekleiner10() { Quersumme o1 = new Quersumme(); Quersumme o2 = new Quersumme(); assertequals(0, o1.berechnequersumme(0)); assertequals(9, o2.berechnequersumme(9)); Tests für die Grenzwerte 0 und 9.

7 Ein möglichst einfaches Programm für den 1. Test public class Quersumme { public Quersumme(){ public int berechnequersumme(int zahl) { return zahl; Gibt zahl als Wert zurück; dies ist ok für 0 <= zahl < 10!. Erwartungsgemäß erfüllt das einfache Programm diesen Test!

8 Ein zweiter Test für Zahlen größer gleich 10 public void testquersummegroessergleich10() { Quersumme o1 = new Quersumme(); Quersumme o2 = new Quersumme(); assertequals(1, o1.berechnequersumme(10)); assertequals(11, o2.berechnequersumme(29)); Grenzwert für die Fallunterscheidung GroesserGleich10 Ein beliebiger Wert größer als 10

9 Der zweite Test für Zahlen größer gleich 10 schlägt fehl Natürlich meldet JUnit Fehler. Das Programm muss geeignet restrukturiert werden.

10 Refactoring: Ein möglichst einfaches Programm für beide Tests public class Quersumme { public Quersumme(){ public int berechnequersumme(int zahl) { if (zahl<10) return zahl; else return berechnequersumme(zahl/10)+zahl%10; Berechnet die Quersumme rekursiv. Was ist mit negativen Zahlen??

11 Ein Test für negative Zahlen public void testquersummekleiner0() { Quersumme o1 = new Quersumme(); Quersumme o2 = new Quersumme(); assertequals(-9, o1.berechnequersumme(-9)); assertequals(-11, o2.berechnequersumme(-29)); Grenzwert für die Fallunterscheidung GroesserGleich10 Ein beliebiger Wert größer als 10

12 Der Test für negative Zahlen schlägt fehl! Natürlich meldet JUnit Fehler. Das Programm muss geeignet restrukturiert werden.

13 Refactoring: Ein erstes Programm für alle Tests public class Quersumme { public Quersumme(){ public int berechnequersumme(int zahl) { if (zahl<10 & zahl>0) return zahl; else return berechnequersumme(zahl/10)+zahl%10; Programmierfehler bei zahl = 0.

14 public class Quersumme { public Quersumme(){ Verbesserung: Ein Programm für alle Tests public int berechnequersumme(int zahl) { if (zahl<10 & zahl>=0) return zahl; else return berechnequersumme(zahl/10)+zahl%10; Jetzt laufen alle Tests!

15 Refactoring 1: Algebraische Umformung public int berechnequersumme(int zahl) { if (zahl<10 & zahl>=0) return zahl; else return berechnequersumme(zahl/10)+zahl%10; Da für 0<=zahl<10 gilt: zahl = if (zahl==0)zahl else berqs(zahl/10)+zahl%10 ist äquivalent zu public int berechnequersumme(int zahl) { if (zahl==0) return zahl; else return berechnequersumme(zahl/10)+zahl%10; Auch hier laufen alle Tests!

16 R f(t x) Refactoring 2: Ein Schema zur Transformation linearer Rekursion in while-programme { if (B(x)) return A(x); else return f(e(x)) C(x); Ist äquivalent zu R f(t x) { R r = A(x); while (!(B(x))) { r = r C(x); x = E(x); return r; Falls kommutativ und assoziativ ist Beispiel Quersumme: entspricht + A(x) entspricht 0 B(x) entspricht x==0 C(x) entspricht x%10 E(x) entspricht x/10

17 Refactoring 2: Ein iteratives Programm für alle Tests public class Quersumme { public Quersumme(){ public int berechnequersumme(int zahl) { int qs = 0; while (zahl!=0) { qs = qs + zahl % 10; zahl = zahl /10; return qs; Berechnet die Quersumme iterativ. Erfüllt alle Tests!

18 Zusammenfassung Beim Test-gesteuerten Entwurf werden zuerst die Tests entworfen und dann die Programme geschrieben. Programme werden immer wieder restrukturiert (Refactoring). Durch automatisches Testen ist dies gut machbar. Formale Umformungstechniken (algebraische Umformungen, Transformationstechniken) können sehr gut zum Refactoring eingesetzt werden. Eine wichtige Umformung ist die Transformation linear rekursiver Programme in While-Programme.