www.wikidata.de-de.nina.az
Testgetriebene Entwicklung auch testgesteuerte Programmierung englisch test first development oder test driven development TDD ist eine Methode die haufig bei der agilen Entwicklung von Computerprogrammen eingesetzt wird Bei der testgetriebenen Entwicklung erstellt der Programmierer Softwaretests konsequent vor den zu testenden Komponenten Typischer testgetriebener Entwicklungsprozess Inhaltsverzeichnis 1 Grunde fur die Einfuhrung einer testgetriebenen Entwicklung 2 Vorgehensweise 2 1 Testgetriebene Entwicklung mit Unit Tests englisch middle out TDD 2 1 1 tests first 2 1 2 TDD nach Kent Beck 2 2 Testgetriebene Entwicklung mit System oder Akzeptanztests englisch outside in TDD 2 3 Gemeinsamkeiten 3 Einsatzgebiete 4 Werkzeuge 5 Kritik 5 1 Aufwand Einwand und Gegeneinwande 5 2 Konsequenz ist notig 5 3 Ausbildung Ubung erforderlich 5 4 Kein Ersatz fur alle anderen Testarten 6 Literatur 7 Weblinks 8 EinzelnachweiseGrunde fur die Einfuhrung einer testgetriebenen Entwicklung BearbeitenNach klassischer Vorgehensweise beispielsweise nach dem Wasserfall oder dem V Modell werden Tests parallel zum und unabhangig vom zu testenden System entwickelt oder sogar nach ihm Dies fuhrt oft dazu dass der Code schwer testbar ist und somit der Aufwand fur die Tests hoch ist und diese nicht die gewunschte oder erforderliche Testabdeckung erzielen Mogliche Grunde dafur sind unter anderem Fehlende oder mangelnde Testbarkeit des Systems monolithisch Nutzung von Fremdkomponenten Verbot der Investition in nicht funktionale Programmteile seitens der Unternehmensfuhrung Arbeit von der man spater im Programm nichts sieht ist vergeudet Erstellung von Tests unter Zeitdruck oder rein um die gewunschte Testabdeckung zu erzielen Nachlassigkeit und mangelnde Disziplin der Programmierer bei der Testerstellung Focus der White Box Test auf das zu testende System und seine Eigenheiten und daraus resultierendes um Fehler herum Testen Die Methode der testgetriebenen Entwicklung versucht diesen Nachteilen der White Box Tests entgegenzuwirken und dabei auch ein auf die Aufgabenstellung der Software besser angepasstes und wartbareres Softwaredesign zu bekommen Bei der Verwendung von testgetriebener Entwicklung konnen im Schnitt 45 Prozent aller Fehler erkannt bzw vermieden werden 1 Im Vergleich dazu werden beim reinen Einsatz von Unittests im Schnitt nur 30 Prozent der Fehler erkannt 2 Vorgehensweise BearbeitenBei der testgetriebenen Entwicklung ist zwischen dem Testen im Kleinen Modultests englisch unit tests und dem Testen im Grossen Integrationstests Systemtests Akzeptanztests zu unterscheiden wobei Kent Becks Methode auf Unit Tests ausgelegt ist Testgetriebene Entwicklung mit Unit Tests englisch middle out TDD Bearbeiten tests first Bearbeiten Unit Tests werden vor dem eigentlichen Computerprogramm geschrieben Es ist nicht festgelegt ob der Programmierer der die Implementierung vornehmen wird auch die Unit Tests erstellt Es ist erlaubt dass mehrere fehlschlagende Unit Tests gleichzeitig existieren Die Umsetzung des von einem Unit Test geforderten Verhaltens im Computerprogramm kann zeitlich verschoben werden Die Methode tests first kann als Vorstufe der testgetriebenen Entwicklung betrachtet werden TDD nach Kent Beck Bearbeiten Unit Tests und mit ihnen getestete Units werden stets parallel entwickelt Die eigentliche Programmierung erfolgt in kleinen wiederholten Mikroiterationen Eine solche Iteration die nur wenige Minuten dauern sollte hat drei Hauptteile die man im englischen Red Green Refactor nennt Red Schreibe einen Test der ein neues zu programmierendes Verhalten Funktionalitat prufen soll Dabei fangt man mit dem einfachsten Beispiel an Ist die Funktion schon alter kann dies auch ein bekannter Fehler oder eine neu zu implementierende Funktionalitat sein Dieser Test wird vom vorhandenen Programmcode erst einmal nicht erfullt muss also fehlschlagen Green Andere den Programmcode mit moglichst wenig Aufwand ab und erganze ihn bis er nach dem anschliessend angestossenen Testdurchlauf alle Tests besteht Raume dann im Code auf Refactoring Entferne Wiederholungen Code Duplizierung abstrahiere wo notig richte ihn nach den verbindlichen Code Konventionen aus etc In dieser Phase darf kein neues Verhalten das ja dann nicht durch Tests schon abgedeckt ware eingefuhrt werden Nach jeder Anderung werden die Tests ausgefuhrt ihr Fehlschlag verbietet es die offenbar fehlerhafte Anderung schon in den genutzten Code zu ubernehmen Ziel des Aufraumens ist es den Code schlicht und verstandlich zu machen Diese drei Schritte werden so lange wiederholt bis die bekannten Fehler bereinigt sind der Code die gewunschte Funktionalitat liefert und dem Entwickler keine sinnvollen weiteren Tests mehr einfallen welche vielleicht noch scheitern konnten Die so behandelte programmtechnische Einheit Unit wird dann als einstweilen fertig angesehen Die gemeinsam mit ihr geschaffenen Tests werden beibehalten damit auch nach kunftigen Anderungen wiederum daraufhin getestet werden kann ob die schon erreichten Aspekte des Verhaltens weiterhin erfullt werden Damit die auch Transformationen genannten Anderungen in Schritt 2 zum Ziel fuhren muss jede Anderung zu einer allgemeineren Losung fuhren sie darf also nicht etwa nur den aktuellen Testfall auf Kosten anderer behandeln Tests die immer mehr ins Einzelne gehen treiben den Code so zu einer immer allgemeineren Losung Die Beachtung der Transformationsprioritaten fuhrt dabei regelmassig zu effizienteren Algorithmen 3 Die konsequente Befolgung dieser Vorgehensweise ist eine evolutionare Entwurfsmethode indem jede der einzelnen Anderungen das System weiterentwickelt Testgetriebene Entwicklung mit System oder Akzeptanztests englisch outside in TDD Bearbeiten Systemtests werden bei testgetriebener Entwicklung immer vor dem System selbst entwickelt oder doch wenigstens spezifiziert Aufgabe der Systementwicklung ist bei testgetriebener Entwicklung nicht mehr wie klassisch schriftlich formulierte Anforderungen zu erfullen sondern spezifizierte Systemtests zu bestehen Akzeptanztestgetriebene Entwicklung ATDD ist zwar mit testgetriebener Entwicklung verwandt unterscheidet sich jedoch in der Vorgehensweise von testgetriebener Entwicklung 4 Akzeptanztestgetriebene Entwicklung ist ein Kommunikationswerkzeug zwischen dem Kunden bzw den Anwendern den Entwicklern und den Testern welches sicherstellen soll dass die Anforderungen gut beschrieben sind Akzeptanztestgetriebene Entwicklung verlangt keine Automatisierung der Testfalle wenngleich diese furs Regressionstesten hilfreich ware Die Tests bei akzeptanztestgetriebener Entwicklung mussen dafur auch fur Nicht Entwickler lesbar sein Die Tests der testgetriebenen Entwicklung konnen in vielen Fallen aus den Tests der akzeptanztestgetriebenen Entwicklung abgeleitet werden Hauptartikel Behavior Driven Development Gemeinsamkeiten Bearbeiten Neben anderen Zielen werden bei allen Arten von testgetriebener Entwicklung eine moglichst vollstandige Testautomatisierung angestrebt Fur testgetriebene Entwicklung mussen alle Tests einfach per Knopfdruck und moglichst schnell ausgefuhrt werden konnen Fur Unit Tests bedeutet das eine Dauer von wenigen Sekunden fur Akzeptanz oder Systemtests von maximal einigen Minuten bzw nur in Ausnahmen langer Die grossen Vorzuge der testgetriebenen Methodik gegenuber der klassischen sind Man hat eine boolesche Metrik fur die Erfullung der Anforderungen die Tests werden bestanden oder nicht Das Refactoring also das Aufraumen im Code fuhrt zu weniger Fehlern weil man dabei in kleinen Schritten vorgeht und stets entlang bestandener Tests entstehen dabei wenige neue Fehler und sie sind besser lokalisierbar Weil einfach und ohne grossen Zeitaufwand getestet werden kann arbeiten die Programmierer die meiste Zeit an einem korrekten System und also mit Zutrauen und konzentriert auf die aktuelle Teilaufgabe hin Keine Durchquerung der Wuste kein Alles hangt mit allem zusammen Der Bestand an automatisierten Tests dokumentiert das System bei akzeptanzgetriebener Entwicklung sogar fur Nicht Entwickler lesbar Man erzeugt namlich mit den Tests zugleich eine ausfuhrbare Spezifikation was das Softwaresystem leisten soll liegt in Form sowohl lesbarer wie auch jederzeit lauffahiger Tests vor Ein testgetriebenes Vorgehen fuhrt in der Tendenz zu Programmcode der starker modularisiert ist sowie leichter zu andern und zu erweitern Das geplante System wird in kleinen Arbeitsschritten entwickelt die unabhangig geschrieben und getestet und erst danach integriert werden Die korrespondierenden Softwareeinheiten Klassen Module werden so kleiner spezifischer ihre Kopplung wird lockerer und ihre Schnittstellen werden schlichter Nutzt man auch Mock Objekte zwingt dies ebenfalls dazu Abhangigkeiten zu vermindern oder einfach zu halten weil sonst der dabei essentielle schnelle und umstandslose Austausch von Modulen fur Test und fur Produktionscode nicht moglich ware Empirische Studien konnten eine geringere Defektrate durch TDD bei unerfahrenen Entwicklern nachweisen Dem steht allerdings auch ein hoherer Zeitaufwand gegenuber Andere empirische Studien konnten keinen Qualitatsgewinn ermitteln Insgesamt ergibt sich so ein uneinheitliches Bild uber den tatsachlichen Qualitatsgewinn allein durch TDD 5 Einsatzgebiete BearbeitenTestgetriebene Entwicklung ist wesentlicher Bestandteil des Extreme Programming XP und anderer agiler Methoden Auch ausserhalb dieser ist testgetriebene Entwicklung anzutreffen haufig in Verbindung mit der Paarprogrammierung Als Ubungsmethode werden oft Katas eingesetzt Werkzeuge BearbeitenDie testgetriebene Entwicklung braucht vordringlich ein Werkzeug zur Build Automatisierung wie etwa CruiseControl oder Jenkins um sicherzustellen dass die Tests auch garantiert laufen eine Integrierte Entwicklungsumgebung zu Testentwicklung und automatisierung damit die Iterationen schnell und unkompliziert durchlaufen werden konnen Bei der Java Entwicklung kommen meist Ant Maven oder Gradle und JUnit zum Einsatz Fur die meisten anderen Programmiersprachen existieren ahnliche Werkzeuge wie z B fur PHP PHPUnit oder fur C Ceedling Unity und CMock 6 Fur komplexe Systeme mussen mehrere Teilkomponenten unabhangig voneinander entwickelt werden und es finden dazu auch noch Fremdkomponenten Verwendung etwa ein Datenbanksystem zwecks persistenter Datenhaltung Die korrekte Zusammenarbeit und Funktion der Komponenten im System muss dann auch getestet werden Um nun die Einzelkomponenten dabei separat testen zu konnen die doch aber zu ihrer korrekten Funktion wesentlich von anderen Komponenten abhangen verwendet man Mock Objekte als deren Stellvertreter Die Mock Objekte ersetzen und simulieren im Test die benotigten anderen Komponenten in einer Weise die der Tester ihnen einprogrammiert Werkzeuge fur Akzeptanztests und Systemtests sind beispielsweise Framework for Integrated Test oder Cucumber Eine beliebte FIT Variante ist Fitnesse ein Wiki Server mit integrierter Testerstellungs und Testausfuhrungsumgebung Kritik BearbeitenAufwand Einwand und Gegeneinwande Bearbeiten Haupteinwand gegen testgetriebene Entwicklung ist der vermeintlich hohe Aufwand Die beschriebene Idee macht sich aber zunutze dass der gedankliche Aufwand der beim Programmieren in die konstruktive Beschreibung also das Programm investiert wird und den Hauptteil der Programmierzeit ausmacht im Verhaltnis zum Tippaufwand etwa eine Aufzahlung einzelner zu erfullender Punkte und Falle beinhaltet Mit nur wenig mehr Aufwand lasst sich also genau zu diesem Zeitpunkt vor der Programmierung der abzudeckende Fall beschreiben das vorherige Schreiben weniger Testzeilen kann sogar zu einer besseren gedanklichen Strukturierung und hoherer Codequalitat fuhren Zweitens fuhrt die testgetriebene Entwicklung zu einer bestimmten Disziplin welche Funktionen in welcher Reihenfolge implementiert werden weil man sich erst einen Testfall uberlegen muss und damit potentiell zu einer hoheren Berucksichtigung des Kundennutzens siehe auch YAGNI Unit Tests oder automatisierte Tests allgemein werden oftmals als das Sicherheitsnetz eines Programms bei notwendigen Anderungen beschrieben ohne eine hohe Testabdeckung ist ein Softwaresystem grundsatzlich anfalliger fur Fehler und Probleme in der Weiterentwicklung und Wartung 7 Schon bei der ersten Erstellung kann der Aufwand mit TDD bei ein wenig Ubung zu der Erfullung einer bestimmten Funktionalitat also unter dem Aufwand einer vermeintlich schnellen Losung ohne automatisierte Tests liegen Dies gilt nach ubereinstimmender Ansicht umso mehr je langlebiger das System ist und damit wiederholt Anderungen unterliegt Der Aufwand automatisierte Tests nachtraglich zu schreiben ist wesentlich hoher weil gedanklich die einzelnen Anforderungen und Programmzeilen noch einmal analysiert werden mussen und eine vergleichbare Testabdeckung wie bei TDD ist alleine aus Aufwands und Kostengrunden dann kaum noch realistisch Konsequenz ist notig Bearbeiten Auch die Methode der testgetriebenen Entwicklung kann falsch eingesetzt werden und dann scheitern Programmierern die noch keine Erfahrung dabei besitzen erscheint sie manchmal schwierig oder gar unmoglich Sie fragen sich wie man etwas testen soll das doch noch gar nicht vorhanden ist Auswirkung kann sein dass sie die Prinzipien dieser Methode vernachlassigen was insbesondere bei agilen Methoden wie dem Extreme Programming Schwierigkeiten beim Entwicklungsprozess oder sogar dessen Zusammenbruch zur Folge haben kann Ohne ausreichende Unit Tests wird keine ausreichende Testabdeckung fur das Refactoring und die gewunschte Qualitat erreicht Dem kann man mit Paarprogrammierung und Schulung entgegenwirken Ausbildung Ubung erforderlich Bearbeiten Ein wesentliches Argument von Gegnern der testgetriebenen Entwicklung ist dass insbesondere Unit Tests den Aufwand bei Anderungen an bestehender Funktionalitat unnotig erhohen weil eine Anderung am Produktions Code unverhaltnismassig viele Unit Tests fehl schlagen lasst Die Ursache dafur liegt jedoch in der Regel darin dass die getestete Unit nicht ausreichend separiert wurde die Tests also nicht atomar sind Um dieses Problem zu vermeiden ist es notwendig dass die Programmierer darin geschult werden wie sie die Anforderungen in atomare Funktionseinheiten zerlegen konnen und dies uben Kein Ersatz fur alle anderen Testarten Bearbeiten Auch diese stark auf Tests setzende Art der Programmierung kann wie alle Testarten nicht jeden Fehler aufdecken Fehler die im Zusammenspiel zwischen verschiedenen Programmen oder Programmteilen entstehen konnen mittels Integrationstests eher gefunden werden als mittels testgetriebener Entwicklung Die Gebrauchstauglichkeit einer Software kann mittels testgetriebener Entwicklung nicht festgestellt werden Dafur sind Usability Tests besser geeignet Die Entsprechung der Software gegenuber den funktionalen und nicht funktionalen Anforderungen kann mittels Unit Test TDD oft nicht festgestellt werden Dafur ist akzeptanztestgetriebene Entwicklung wie beispielsweise Behavior Driven Development oder Systemtests anzuraten Keine der genannten Testarten und Vorgehensweisen kann alle Fehler aufdecken darum sollten in den meisten Fallen mehrere Testarten und fehlervermeidende Vorgehensweisen angewendet werden Literatur BearbeitenKent Beck Test Driven Development by Example Addison Wesley Verlag ISBN 0 321 14653 0 Steve Freeman Nat Pryce Growing Object Oriented Software Guided by Tests ISBN 978 0 321 50362 6 James W Grenning Test Driven Development for Embedded C O Reilly UK Ltd 2011 ISBN 1 934356 62 X Lasse Koskela Test driven TDD and Acceptance TDD for Java developers ISBN 1 932394 85 0 Johannes Link Softwaretests mit JUnit Techniken der testgetriebenen Entwicklung ISBN 3 89864 325 5 Frank Westphal Testgetriebene Entwicklung mit JUnit und FIT dpunkt 2005 ISBN 3 89864 220 8 online PDF Weblinks BearbeitenJUnit Framework zur testgetriebenen Entwicklung in Java englisch Einfuhrender Artikel Bessere Codequalitat und Kosteneinsparungen durch Einheittests Modultests Eine kurze Einfuhrung in die Prinzipien der Test gesteuerten Programmierung Test Driven Development in NET example for TDD in Visual Studio and NET including WatiN test framework for web applications Video Crashkurs Malen nach Zahlen Test Driven Development Einfuhrung fur Software Entwickler deutsch Einzelnachweise Bearbeiten Capers Jones Software Engineering Best Practices Lessons from Successful Projects in the Top Companies Mc Graw Hill 2010 ISBN 978 0 07 162162 5 S 660 englisch 960 S Steve McConnell Code Complete A Practical Handbook of Software Construction 2 Auflage Microsoft Press 2004 ISBN 978 0 7356 1967 8 S 470 englisch 960 S Unit test Lowest Rate 15 Modal Rate 30 Highest Rate 50 The Transformation Priority Premise 8th Light 2 Februar 2016 abgerufen am 24 Januar 2023 Ken Pugh Lean Agile Acceptance Test Driven Development Better Software Through Collaboration Addison Wesley Professional Boston 2011 ISBN 978 0 321 71408 4 englisch Andy Oram Greg Wilson u a Making Software What Really Works And Why We Believe It 1 Auflage O Reilly Media 2010 ISBN 978 0 596 80832 7 Throw The Switch Abgerufen am 24 Januar 2023 amerikanisches Englisch Robert C Martin Clean Code Refactoring Patterns Testen und Techniken fur sauberen Code mitp Verlag ISBN 978 0 13 235088 4 Abgerufen von https de wikipedia org w index php title Testgetriebene Entwicklung amp oldid 235708551