Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]:...

40
Putting TDD to the Test Edwin Günthner, IBM Germany Development Lab

Transcript of Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]:...

Page 1: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Putting TDD to the TestEdwin Günthner, IBM Germany Development Lab

Page 2: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Zum Titel

www.dict.cc:

to put sb./sth. to the test

jdn./etw. auf den Prüfstand stellen

Java Forum Stuttgart 2017Edwin Günthner: Putting TDD to the Test

© IBM Germany Development Lab2

Page 3: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Agenda

• Teil 1: Grundsätzliches, Begrifflichkeiten, Definitionen

• Teil 2: Ein (subjektiver) Reisebericht

• Teil 3: Eine (objektivere) Abrundung

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 3

Page 4: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Teil 1

• Motivation

• Definitionen

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 4

Page 5: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Warum sind wir heute hier?

Continuous attention to technical excellence and good design enhances agility.

[ Agile manifesto, 9th principle ]

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 5

Page 6: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Definitionen: Unit Testing

• Unit Testing [ Wikipedia ]:

Vereinfacht gesagt steht dort:

„Alles was man tut um zu testen … ist ein Unit Test“

Nicht hilfreich

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 6

Page 7: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Definitionen: Unit Testing

• Hilfreich:

• https://de.wikipedia.org/wiki/Modultest

• http://artofunittesting.com/definition-of-a-unit-test/

Kennzeichen guter Unit Tests sind zum Beispiel:• Automatisierbarkeit

• Isolation

• Konsistenz

• Schnelligkeit

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 7

Page 8: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Definitionen: TDD

• TDD: Test driven development [ Wikipedia ]:

Test-driven development (TDD) is a software development process that relies on the repetition of a very short development cycle: requirements are turned into very specific test cases, then the software is improved to pass the new tests, only.

Uns geht es hier um TDD und gute, echte Unit Tests

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 8

Page 9: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Teil 2

• Evolution und Kontext

• Houston, we have a problem

• TDD to the rescue

• Erfahrungen und Ergebnisse

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 9

Page 10: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Evolution I

• 2012Kollegen (und Java Forum Stuttgart) … alles spricht über TDD

Aber: dem Team einfach sagen: „Wir machen jetzt alle TDD“ … funktioniert nicht (besonders gut)

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 10

Page 11: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Evolution II

• Wir üben, üben, üben …

• 2015 ergibt sich für mich die Chance, eine komplexe Funktionalität komplett mit TDD zu bearbeiten

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 11

Page 12: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Kontext

• Das ist ein Mainframe:

• … ein großes SMP (symmetric multi-processing) System, auf dem Kunden virtuelle Maschinen betreiben

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 12

Page 13: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Kontext

• Das ist ein Mainframe:

• … ein großes SMP (symmetric multi-processing) System, auf dem Kunden virtuelle Maschinen betreiben

• Die IBM zSystems Komponente DPM ermöglicht Kunden die zeitgemäße Verwaltung dieser VMs

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 13

Page 14: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Kontext (II)

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

• Management Console:

• (physikalisch) verteilte Anwendung

• xx Millionen Zeilen C, C++, Java

• historisch gewachsen, proprietär

Java Forum Stuttgart 2017 14

Management Console

Kunde

Page 15: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Houston, we have a problem

• Ein wesentlicher Teil von DPM: das Starten/Stoppen der VMs

• Erster Code entsteht Frühjahr/Sommer 2015

• Code Review Herbst 2015:

• Code ist bereits relativ komplex – aber wichtige Funktionen fehlen noch

• Viel code duplication – aber keine Unit Tests

• Das eigentliche Problem: Refactoring ist ohne Unit Tests zu teuer

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 15

Page 16: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Die Lösung: the big rewrite

• Anfang Dezember 2015:

Kein Urlaub mehr 2015 … also nutze ich die ruhigen Wochen zum Jahresende und überarbeite alles

Und weil ich es besser machen will, mache ich alles mit TDD

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 16

Page 17: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Wie geht das nochmal mit TDD?

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Schreibe neuen Test

Führe Test aus

Huch?!

Schreibe Produkt Code

Führe alle Test

aus

Verbessere Code

(Refactoring)

pass

pass

fail

fail

Java Forum Stuttgart 2017 17

Page 18: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Die erste und wichtigste Erfahrung

• Die kurzen Test Code <--> Produkt Code Zyklen sind paradiesisch:

• Ich arbeite ausschließlich in meiner IDE( versus: Code schreiben, Patch zusammenstellen, VM starten,

Patch applizieren, Anwendung starten, … )

• Ich kann eine Idee/Vorstellung sofort ausprobieren und umsetzen

• Mit anderen Worten:

• Kein Wechseln des Kontexts

• Keine Wartezeiten

• Im Gegenteil: schnelle rot grün Iterationen … stunden-, tagelang

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 18

Page 19: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Die zweite Erfahrung

• Nach 4 Wochen: ein erster funktionaler Test am echten System„Huch, es tut nicht!“

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 19

Page 20: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Die zweite Erfahrung

• Nach 4 Wochen: ein erster funktionaler Test am echten System„Huch, es tut nicht!“

• Analyse ergibt:

• Fehler beim Erstellen des Patches

• Neuer Patch: Test läuft erfolgreich durch

• Aber: da ist ein Fehler im Design der neuen Funktionalität

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 20

Page 21: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Die zweite Erfahrung

• Nach 4 Wochen: ein erster funktionaler Test am echten System„Huch, es tut nicht!“

• Analyse ergibt:

• Fehler beim Erstellen des Patches

• Neuer Patch: Test läuft erfolgreich durch

• Aber: da ist ein Fehler im Design der neuen Funktionalität

• Dank TDD und existierender Unit Tests: Fehler ist in wenigen Stunden behoben

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 21

Page 22: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

All good things must come to an end …

• Nochmal etliche Wochen später: coding complete

• Zeit für echte System Tests:

• Alle Tests laufen erfolgreich durch

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 22

Page 23: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

All good things must come to an end …

• Nochmal etliche Wochen später: coding complete.

• Zeit für echte System Tests:

• Alle Tests laufen erfolgreich durch

• Genauer gesagt:

• Keine Übertragungsfehler(alles was vorher funktioniert hat, funktioniert immer noch)

• Alle bekannten Probleme im alten Code sind ebenfalls beseitigt

• Große Mengen an nützlicher Zusatzfunktionalität wurden eingebaut

und alles funktioniert auf Anhieb

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 23

Page 24: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

In der Retrospektive

• Der neue Code wird seit 18 Monaten genutzt:keine Bugs gefunden

• Der neue Code wurde mehrmals erweitert (z. B. für andere Operationen wie Partition Update) – ohne dass dabei Regressionen eingebaut wurden

( Wichtig: existierende Unit Tests helfen nur bedingt beimImplementieren neuer Funktionen )

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 24

Page 25: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Teil 3

• Alles gut?

• Ein Geheimtipp

• Effizienz

• Best Practices

• Empfehlungen und Anti-Pattern

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 25

Page 26: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Alles gut? Natürlich nicht.

• Aufwandsabschätzung (überraschenderweise: viel zu niedrig)

• Keine konsequente Umsetzung der eigenen Qualitätsansprüche(zum Beispiel: „Keine Zeit für Reviews“)

• Funktionale Tests sind immer noch ein MUSS

TDD ist kein silver bullet mit dem Anspruch, alle Probleme zu lösen!

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 26

Page 27: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Talking about silver bullets

• Unit Tests funktionieren für …

? ? ?

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 27

Page 28: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Talking about silver bullets

• Unit Tests funktionieren für testbare Units!

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 28

Page 29: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Was macht eine „Unit“ testbar?

• Zum Beispiel:

• Isolation

• Entkopplung

• „Fokussierung“ (Single Responsibility Principle)

die Prinzipien von Clean Code!

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 29

Page 30: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Die ärgerliche Konsequenz

• Es genügt nicht, Bücher über Unit Testing / TDD zu lesen, z. B.:

• „JUnit-Profiwissen“ [ Michael Tamm ]

• „xUnit Test patterns“ [ Gerad Meszaros ]

• „Working Effectively with Unit Tests“ [ Jay Fields ]

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 30

Page 31: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Die ärgerliche Konsequenz

• Es genügt nicht, Bücher über Unit Testing / TDD zu lesen, z. B.:

• „JUnit-Profiwissen“ [ Michael Tamm ]

• „xUnit Test patterns“ [ Gerad Meszaros ]

• „Working Effectively with Unit Tests“ [ Jay Fields ]

• Darüber hinaus muss man sich mit Code Qualität intensivauseinandersetzen, z. B:

• „Refactoring“ [ Kent Beck / Martin Fowler ]

• „Clean Code“, „Agile principles“ [ Robert Martin, … ]

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 31

Page 32: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

So viel Aufwand? Und das rentiert sich?

• Ein Kollege hat mich gefragt: „Wenn man all diese Tests schreiben muss,

wird man dann nicht langsamer?“

• Meine Antwort: „Nein. Man wird schneller.“

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 32

Page 33: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

So viel Aufwand? Und das rentiert sich?

• Ein Kollege hat mich gefragt: „Wenn man all diese Tests schreiben muss,

wird man dann nicht langsamer?

• Meine Antwort: „Nein. Man wird schneller.“

• Wieso bin ich schneller wenn ich n Zeilen Produkt Code

+ m Zeilen Test Code

schreiben muss … anstatt nur n Zeilen?

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 33

Page 34: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Eine Frage der Effizienz

• Wieso bin ich schneller wenn ich n + m Codeschreiben muss … anstatt nur n Zeilen?

• Ganz einfach: weil ich in wenigen Sekunden 10, 50, 100 Tests ausführen kann!

Unit Tests geben sofortiges Feedback über ausgeführten Code

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 34

Page 35: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Nützliche Tipps (Produkt Code)

• Unveränderliche Objekte machen das Leben viel einfacher!

• Sparsamer Einsatz von new und static dependency injection, siehe Google Tech Talks: Unit testing

• Üben, üben, üben:

• am Besten im Team

• Gemeinsame Code Reviews mit beispielhaften Schwerpunkten: • Clean Code Prinzipien

• Testbarkeit

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 35

Page 36: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Nützliche Tipps (Test Code)

• Der ideale Test kommt ohne Mocking Framework aus

• Für Test Code gelten die gleichen Ansprüche an Qualität wie für Produkt Code

• Gemeinsame Standards und Vorgehensweisen im Team

• Clean Code (mit gewissen Einschränkungen)

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 36

Page 37: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Anti-Pattern für Tests

• „Wir brauchen PowerMock(ito)“: Bedeutet (fast) immer:

„Wir schreiben schlecht testbaren Code“

• Tests bestehen (fast) nur aus Mocking Specs: wir wollen das WAS testen, nicht das WIE stattdessen: Fokussierung auf den public contract

• Tests fühlen sich zu groß/komplex/unhandlich an: vermutlich ist der Produkt Code zu kompliziert Zeit für echtes Refactoring!

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 37

Page 38: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Evolution III

• … 2017

Die Lernkurve geht immer weiter, mit Fragen wie zum Beispiel:

Sollte man Unit Tests auch mal löschen?

Wie kann ich die Nützlichkeit eines Tests sinnvoll bewerten?(Stichwort: Return on Investment!)

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 38

Page 39: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

Fragen?

• Antworten!

Ansonsten einfach später an:

edwin.guenthner ät de.ibm.com

• Vielen Dank für Ihre Aufmerksamkeit!

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 39

Page 40: Putting TDD To The Test - Java Forum Stuttgart · •TDD: Test driven development [ Wikipedia ]: Test-driven development (TDD) is a software development process that relies on the

© Copyright IBM Corporation 2017. All rights reserved.

The information contained in this presentation is provided for informational purposes only.

While efforts were made to verify the completeness and accuracy of the information contained in this publication, it is provided AS IS without warranty of any kind, express or implied.

Edwin Günthner: Putting TDD to the Test © IBM Germany Development Lab

Java Forum Stuttgart 2017 40