Test Driven Development Definition & Motivation Demo [~10min] Stubs & Mocks [~15min] Übliche Fehler [~5min] [~15min] © Edorex Informatik AG 10.05.2012 Folie 1 TDD [Kent Beck] Schreibe keine Zeile Code ohne einen fehlschlagenden (roten) automatisierten Test Eliminiere Duplizität © Edorex Informatik AG 10.05.2012 Folie 2 TDD Prozess 1. Schreibe den Test Code 2. Kompiliere den Test Code Æ Fehler Make it work! 3. Implementiere das Minimum an Code um zu Kompilieren 4. Lass den Test laufen Æ Rot 5. Implementiere das Minimum an Code damit Test erfolgreich ist 6. Lass den Test laufen Æ Grün Make it right! 7. Refactor Code (Duplizität eliminieren / Verständlichkeit erhöhen) 8. GOTO 1. © Edorex Informatik AG 10.05.2012 Folie 3 © Edorex Informatik AG 10.05.2012 Folie 4 so einfach wie möglich - aber nicht einfacher… Der Code 1. erfüllt alle Tests 2. hat keine Duplizität 3. ist geeignet für das Zielpublikum 4. kommuniziert alles Nötige 5. hat die kleinstmögliche Anzahl Entitäten (Klassen, Methoden, etc.) © Edorex Informatik AG 10.05.2012 Folie 5 Fehlerentstehung Quelle: Test-driven Development aus dem Open Source Regal © Edorex Informatik AG 10.05.2012 Folie 6 1:10:100 Quelle: http://www.riceconsulting.com/public_pdf/STBC-WM.pdf © Edorex Informatik AG 10.05.2012 Folie 7 Wieso TDD? Höhere Qualität Æ kleinere Kosten o Weniger Bugs o Besseres Design o Sauberer Code Professionalität Æ höhere Qualität o Qualitätsfokus im gesamten Entwicklungszyklus o Beweis das Code funktioniert o Rückmeldung wenn Code nicht mehr funktioniert Seiteneffekte o Wartbarkeit wird erhöht / Änderungen «ohne» Risiko o Tests helfen Code zu dokumentieren © Edorex Informatik AG 10.05.2012 Folie 8 Fall Studie Team IBM drivers Microsoft Windows MS MSN MS Visual Studio Team Grösse 9 6 5-8 7 Source KLOC 41 6 26 155 Test KLOC 29 4 23 60 Kein TDD w x y z TDD 0.61w 0.38x 0.24y 0.09z Zusatzaufwand 15-20% 25-35% 15% 20-25% Defect / LOC Quelle: http://maximilien.org/publications/papers/2007/Nagappan+07.pdf © Edorex Informatik AG 10.05.2012 Folie 9 Unit Test Frameworks (xUnit) Sprache xUnit C# NUnit, MSTest Java JUnit JavaScript JSUnit PL/SQL utPLSQL, PLUTO Transact-SQL TSQLUnit, utTSQL http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks © Edorex Informatik AG 10.05.2012 Folie 10 Stack Demo IsEmpty Test Liste erstellen 1. Test wählen Red/Green Refactor Mehr Tests? 2. Test wählen Red/Green Refactor … © Edorex Informatik AG 10.05.2012 Folie 11 Einfach (die Beispiele) & Komplex (die Realität) © Edorex Informatik AG 10.05.2012 Folie 12 © Edorex Informatik AG 10.05.2012 Folie 13 Test Objekte SUT = System Under Test = Objekt welches getestet wird Test Doubles (Stereotypen) dummy = passed but not used Zustand verifizieren fake = «shortcut» implementation stubs = only pretends to work, returns pre-defined answer spy = captures sent messages for later verification mocks = tests expectations, requires behavior verification Verhalten verifizieren © Edorex Informatik AG 10.05.2012 Folie 14 Beispiel (Fowler) Eine Order muss aus dem Warehouse befüllt werden Falls das Warehouse genügend Inventory hat wird die Order befüllt und das Inventory um die entsprechende Quantität reduziert ansonsten kann die Order nicht befüllt werden © Edorex Informatik AG 10.05.2012 Folie 15 Stubs Warehouse Order IWarehouse Warehouse Stub © Edorex Informatik AG 10.05.2012 Folie 16 Mocks © Edorex Informatik AG 10.05.2012 Folie 17 Übliche Test Fehler a) b) c) d) e) f) g) h) i) j) k) l) m) (Ben Day) RED / GREEN / Refactor Æ Ich entwickle wirklich so Schlechte Namensgebung Unklarer Absicht Unit Code ist nicht Sauber Unit vs. Integration Test Kein Abdeckung für Exceptions GUI Tests sind zu schwierig Bug Fixes ohne Unit Test Nur auf Test Abdeckung fixiert Mock Mania Legacy Systeme sind nicht testbar Dependency Injection wird nicht verwendet Test Suite zu langsame © Edorex Informatik AG 10.05.2012 Folie 18 Referenzen Basic WCF Unit Testing Brian Laird Clean Code Robert C. Martin Extreme Programming Explored William Wake IoC Containers and the DI pattern Martin Fowler Mocks Aren't Stubs Martin Fowler Test Driven Development Kent Beck Test-Driven Development in Microsoft .NET James W. Newkirk & Alexei A. Vorontsov Top 10 Mistakes in Unit Testing Ben Day Realizing Quality Improvement through TDD Nagappan, Maximilien, Bhat © Edorex Informatik AG 10.05.2012 Folie 19 Präsentation & Source Code Foliensatz und Source Code download… http://www.edorex.ch/tdd Herzlichen Dank für Ihr Interesse © Edorex Informatik AG 10.05.2012 Folie 20