32
überraschend mehr Möglichkeiten! © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! O.O.P. Conference / München Thomas Papendieck, Senior–Consultant

UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

überraschend mehr Möglichkeiten!

© OPITZ CONSULTING 2017

UnitTests? Ja, aber richtig!

O.O.P. Conference / München

Thomas Papendieck,Senior–Consultant

Page 2: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Inhalte

1 Worüber ich nicht spreche

2 Anforderungen an UnitTests

3 Anforderungen an zu testenden Code

4 UnitTest in Java

5 Hands on

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 2 / 32

Page 3: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Worüber ich nicht spreche1.1 Vorteile von Unittetst

1.2 Probleme manueller Tests

1.3 Welche Tests sollten automatisiertwerden?

1

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 3 / 32

Page 4: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Relative Kosten von Fehlern

Wie teuer ist ein Fehler in Abhängigkeit vom Zeitpunkt seiner Entdeckung:

während der Entwicklung 1Wenn der Entwickler das fertige Feature testet 3Während der Integration 10Beim Abnahmetest 100in der Produktion 1000

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 4 / 32

Page 5: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Nachteile manueller Tests.

Software muss in einem Lauffähigen Zustand sein.

Tester benötigt wissen über die Anwendung.Was ist das gewünschte Verhalten?Was ist ein Fehler?

Wie testen man Fehlerzustände?

manuelle Tests sind langsam.

finden nur zu regulären Arbeitszeiten statt.

Testen ist langweilig.

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 5 / 32

Page 6: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Test Level

� Application Test

� rejection check formaly known as acceptance test.� performance/stress test

� Module Test

� Unit Test

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 6 / 32

Page 7: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Unterschied Application/Module–Tests zu UnitTests

Applications und Module Test

� werden spät im Entwicklungsprozess ausgeführt

� Testwerkzeuge sind komplex

� sind aufwendig zu warten

� zeigen, das ein Fehler existiert, aber nicht wo

UnitTest

� laufen früh im Entwicklungsprozess (idealer Weise nach jedem Speichern)

� Werkzeuge haben einfache API

� sind stabil gegen Änderungen (anderer Units)

� zeigen welche Anforderung nicht erfüllt wird, wo der Fehler existiert und unter welchenBedingungen er auftritt.

hoher UnitTest Abdeckung→ weniger Test höherer EbenenUnitTests prüfen die Geschäftslogik, Application/Module–Tests die ”Verdrahtung”

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 7 / 32

Page 8: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Warum schreiben wir keine automatisierten Tests?

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 8 / 32

Page 9: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

was ist Test Driven Developement?

1. neuer Test

2. Transformation

3. Refactoring

1. Schreibe einen neuen Test, gerade so viel dass erfehl schlägt(nicht kompilieren ist fehlschlagen).

2. Schreibe gerade so viel Produktivcode, dass derTest erfüllt wird. Zukünftige Anforderungen nichtbeachten! (so simpel wie möglich, alles ist erlaubt,Transitions-Prämissen beachten).

3. Verbessere den Code (Produktion und Test), ohneeinen Test zu berchen und ohne neue Funktinalität(Geschäftslogik) hinzuzufügen.

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 9 / 32

Page 10: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

persönliche, technische und soziale Voraussetzungen

� UnitTests schreiben ist eine Fertigkeit und muss ständig geübt werden.

� Technische Voraussetzungen müssen sichergestellt sein.

� Team und Vorgesetzte müssen automatisiertes Testen unterstützen.

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 10 / 32

Page 11: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Anforderungen an UnitTests

2

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 11 / 32

Page 12: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Was ist ein guter UnitTest?

� Readable - lesbar

� Trustworthy - vertrauenswürdig

� Fast - schnell

� Maintainable - wartbar

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 12 / 32

Page 13: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Was bedeutet lesbar?

� was wird getestetName des Tests drückt vorbedingungen und erwartetes ergebnis aus.

� kurzwiederkehrende Vorbereitungen in methoden auslagern

� Welche Eigenschaften der Parameter sind wichtig?Explizit Variablen für Parameterwerte anlegen

Variablennamen sorgsam wählen

� Welche Eigenschaften der Ergebnisse sind wichtig?Explizit Variablen für Ergebnisse anlegenVariablennamen sorgsam wählen

Verifizierungsmethoden mit sprechenden Namen.

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 13 / 32

Page 14: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Beispiel Lesbarkeit

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 14 / 32

Page 15: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Was bedeutet vertrauenswürdig?

� Geschäftsanforderungen erfülltWurde tatsächlich implementiert, was der Kunde wollte?

� technischWird der Produktivcode tatsächlich ausgeführt?

Schlägt der Test aus dem richtigen Grund fehl?

� Ersetzten von Abhängigkeiten (Mocking)� ”test first”� (weitestgehend) keine Logik in Tests

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 15 / 32

Page 16: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Was bedeutet schnell?

� Tests sollen sehr häufig ausgeführt werden (wo möglich nach jedemSpeichern). Dadurch erhalten wir sofort Feedback, ob die letzte Änderungeinen Fehler verursacht hat.

� Aufwendige und potenziell langsame Logik in Abhängigkeiten der Unitmüssen ersetzt werden.

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 16 / 32

Page 17: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Was bedeutet wartbar?

� Stabilität gegenüber Änderungen in anderen UnitsAbhängigkeiten ersetzen

� stabil gegen Änderungen in der Unit selbsteine einzelne Anforderung (nicht Codestelle) testen.

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 17 / 32

Page 18: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Anforderungen an zu testenden Code3.1 Was verbessert die Testbarkeit?

3.2 Isolieren einer Unit

3.3 Isolation Ermöglichen

3

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 18 / 32

Page 19: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Testbarkeit von produktivem Code

Qualität des produktivem Code (im sinne von ”Clean Code”) beeinflußt dieQualität der Tests (im Sinne der RTFM– Anforderungen)

die wichtigsten ”Clean Code” Regeln sind:

� Separation of concerns

� single resposibilityErzeugung von Objekten der Abhängigkeiten ist keine Aufgabe der Geschäftslogik!

� Tell! Don’t ask.

� Law of Demeter (Don’t talk to strangers)vermeide ”message chaining” (nicht mit ”fluent API” verwechseln)

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 19 / 32

Page 20: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Testbarkeit von produktivem Code

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 20 / 32

Page 21: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Arten von Test–Doubles

� Stub

� leere Implementierung einer Schnittstelle, üblicher Weise generiert

� Fake

� alternative Implementierung einer Schnittstelle oder Erweiterung einerexistierenden Implementierung.

� extrem vereinfachtes Verhalten (keine Logik)

� Mock

� ”aufgemotztes” Fake� konfigurierbares Verhalten� Verifizierung vom Methodenaufrufen und der übergebenen Parameter

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 21 / 32

Page 22: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Was Ermöglicht die Ersetzung von Abhängigkeiten?

� trenne Instanziierung der Abhängigkeiten von der Geschäftslogik

� vermeide den Aufruf des new Operators

� Bereitstellen von ”seams” (Nahtstellen)

� dependency injection� Getter mit geringer Sichtbarkeit

� keine static (public) Methoden

� keine final (public) Methoden

� vermeide Singelton Pattern (nicht Singelton als Konzept)

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 22 / 32

Page 23: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

schreibe ”Clean Code”1

� programmiere gegen Schnittstellen

� SoC/SRP (Feature envy)

� Law of Demeter

� DRY

� same level of abstraction

1”Clean Code” by Robert C Martin, ISBN-13: 978-0132350884

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 23 / 32

Page 24: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

UnitTest in Java4.1 Werkzeuge

4.2 Code Vorlagen

4.3 Transformationsprämissen

4

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 24 / 32

Page 25: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Starterkit für Java Entwickler

� IDE including testplugin (eclipse + infinitest / Netbeans + ? /...)

� build – tool (maven / gradle / ant / ...)

� SCM (git / subversion / ...)

� xUnit testing framework (JUnit / NUnit /...)

� mocking framwork (Mockito / ...)

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 25 / 32

Page 26: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

einen JUnit Test schreiben

1 class PlainOldJavaClass {23 @Test / / marks a method so that i t s been ca l led by JUn i t4 public / / tes t methods must be publ ic5 void / / tes t methods must not return anything6 calculate_worstGame_returnsZero ( ) / / no parameters7 {8 / / arrange : create and configure dependencies and var iab les9 String playerResul tA l lZero = ” 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ” ;

10 int expectedResult = 0 ;1112 / / act : create tested unit ( i f possible ) and c a l l tested method .13 int ca lcu latedResul t = new BowlingCalculator ( ) . ca l cu la te ( p layerResul tA l lZero ) ;1415 / / assert : check the Result by ca l l i n g one of JUn i ts assert methods .16 / / the assert method throws an exception when the check f a i l s .17 assertEquals ( ” a l l ␣zeros␣ in ” , / / g ive use fu l l short ( ! ) addi t iona l descr ipt ion18 / / skip when in doubt19 expectedResult ,20 ca lcu latedResul t ) ;21 }22 }

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 26 / 32

Page 27: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Mockito verwenden

1 class PlainOldJavaClass {2 @Test3 public void testedMethod__preconditions__expectedBehavior ( ) {4 / / create mock5 MyInterfaceOrClass mockObject = mock( MyInterfaceOrClass . class ) ;6 / / create a spy7 MyClass spyObject = spy (new MyClass ( ) ) ;8 / / configure behavior :9 doThrow (new RuntimeException ( ” simulate␣error ” ) )

10 .when ( mockObject ) . anyMethod ( ) ;11 doReturn (mockObject , null , mockObject )12 . thenThrow (new RuntimeException ( ” simulate␣error␣af ter ␣4th␣ c a l l ” ) )13 .when ( spyObject ) . methodWithReturnValue ( ) ;1415 / / a l te rna t i ve for non void methods :16 .when ( spyObject . methodWithReturnValue ( ) )17 . thenReturn (mockObject , null , mockObject )18 . thenThrow (new RuntimeException ( ” simulate␣error␣af ter ␣4th␣ c a l l ” ) ) ;1920 / / check c a l l of method21 ve r i f y ( spyObject ) . expectedMethodCall ( mockObject , any ( OtherInterfaceOrClass . class ) ) ;22 }23 }

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 27 / 32

Page 28: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Test Driven Developement

1. neuer Test

2. Transformation

3. Refactoring

1. Schreibe einen neuen Test, gerade so viel dass erfehl schlägt(nicht kompilieren ist fehlschlagen).

2. Schreibe gerade so viel Produktivcode, dass derTest erfüllt wird. Zukünftige Anforderungen nichtbeachten! (so simpel wie möglich, alles ist erlaubt,Transitions-Prämissen beachten).

3. Verbessere den Code (Produktion und Test), ohneeinen Test zu berchen und ohne neue Funktinalität(Geschäftslogik) hinzuzufügen.

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 28 / 32

Page 29: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Transformationsprämissen1

In der Implementierungsphase des TDD–Zyklus ist im Fall, dass mehrereTransitionen möglich sind, die jenige anzuwenden, die in der folgenden Listeam weitesten oben steht:

1. constant a value

2. scalar a local binding, or variable

3. invocation calling a function/method

4. conditional if/switch/case/cond

5. while loop applies to for loops as well

6. assignment replacing the value of a variable

1”Transformation Priority Premise Applied” by Micah Martin, https://8thlight.com/blog/micah-martin/2012/11/17/transformation-priority-premise-applied.html

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 29 / 32

Page 30: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

Hands on

5

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 30 / 32

Page 31: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

KataBowling

http://codingdojo.org/cgi-bin/index.pl?KataBowling

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 31 / 32

Page 32: UnitTests?Ja,aberrichtig!...RelativeKostenvonFehlern WieteueristeinFehlerinAbhängigkeitvomZeitpunktseinerEntdeckung: währendderEntwicklung 1 WennderEntwicklerdasfertigeFeaturetestet

überraschend mehr Möglichkeiten!

© OPITZ CONSULTING 2017

Vielen Dank für die Aufmerksamkeit.

Thomas Papendieck

Senior–Consultant

Norsk–Data–Straße 461348 Bad Homburg

[email protected]+49 6172 66260 1523

© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 32 / 32