SlideShare a Scribd company logo
1 of 32
Download to read offline
überraschend mehr Möglichkeiten!
© OPITZ CONSULTING 2017
UnitTests? Ja, aber richtig!
O.O.P. Conference / München
Thomas Papendieck,
Senior–Consultant
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
Worüber ich nicht spreche
1.1 Vorteile von Unittetst
1.2 Probleme manueller Tests
1.3 Welche Tests sollten automatisiert
werden?
1
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 3 / 32
Relative Kosten von Fehlern
Wie teuer ist ein Fehler in Abhängigkeit vom Zeitpunkt seiner Entdeckung:
während der Entwicklung 1
Wenn der Entwickler das fertige Feature testet 3
Während der Integration 10
Beim Abnahmetest 100
in der Produktion 1000
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 4 / 32
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
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
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 welchen
Bedingungen er auftritt.
hoher UnitTest Abdeckung → weniger Test höherer Ebenen
UnitTests prüfen die Geschäftslogik, Application/Module–Tests die ”Verdrahtung”
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 7 / 32
Warum schreiben wir keine automatisierten Tests?
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 8 / 32
was ist Test Driven Developement?
1. neuer Test
2. Transformation
3. Refactoring
1. Schreibe einen neuen Test, gerade so viel dass er
fehl schlägt
(nicht kompilieren ist fehlschlagen).
2. Schreibe gerade so viel Produktivcode, dass der
Test erfüllt wird. Zukünftige Anforderungen nicht
beachten! (so simpel wie möglich, alles ist erlaubt,
Transitions-Prämissen beachten).
3. Verbessere den Code (Produktion und Test), ohne
einen Test zu berchen und ohne neue Funktinalität
(Geschäftslogik) hinzuzufügen.
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 9 / 32
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
Anforderungen an UnitTests
2
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 11 / 32
Was ist ein guter UnitTest?
Readable - lesbar
Trustworthy - vertrauenswürdig
Fast - schnell
Maintainable - wartbar
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 12 / 32
Was bedeutet lesbar?
was wird getestet
Name des Tests drückt vorbedingungen und erwartetes ergebnis aus.
kurz
wiederkehrende 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 anlegen
Variablennamen sorgsam wählen
Verifizierungsmethoden mit sprechenden Namen.
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 13 / 32
Beispiel Lesbarkeit
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 14 / 32
Was bedeutet vertrauenswürdig?
Geschäftsanforderungen erfüllt
Wurde tatsächlich implementiert, was der Kunde wollte?
technisch
Wird 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
Was bedeutet schnell?
Tests sollen sehr häufig ausgeführt werden (wo möglich nach jedem
Speichern). Dadurch erhalten wir sofort Feedback, ob die letzte Änderung
einen Fehler verursacht hat.
Aufwendige und potenziell langsame Logik in Abhängigkeiten der Unit
müssen ersetzt werden.
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 16 / 32
Was bedeutet wartbar?
Stabilität gegenüber Änderungen in anderen Units
Abhängigkeiten ersetzen
stabil gegen Änderungen in der Unit selbst
eine einzelne Anforderung (nicht Codestelle) testen.
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 17 / 32
Anforderungen an zu testenden Code
3.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
Testbarkeit von produktivem Code
Qualität des produktivem Code (im sinne von ”Clean Code”) beeinflußt die
Qualität der Tests (im Sinne der RTFM– Anforderungen)
die wichtigsten ”Clean Code” Regeln sind:
Separation of concerns
single resposibility
Erzeugung 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
Testbarkeit von produktivem Code
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 20 / 32
Arten von Test–Doubles
Stub
leere Implementierung einer Schnittstelle, üblicher Weise generiert
Fake
alternative Implementierung einer Schnittstelle oder Erweiterung einer
existierenden 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
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
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
UnitTest in Java
4.1 Werkzeuge
4.2 Code Vorlagen
4.3 Transformationsprämissen
4
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 24 / 32
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
einen JUnit Test schreiben
1 class PlainOldJavaClass {
2
3 @Test / / marks a method so that i t s been called by JUnit
4 public / / test methods must be public
5 void / / test methods must not return anything
6 calculate_worstGame_returnsZero ( ) / / no parameters
7 {
8 / / arrange : create and configure dependencies and variables
9 String playerResultAllZero = ” 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ” ;
10 int expectedResult = 0;
11
12 / / act : create tested unit ( i f possible ) and c a l l tested method .
13 int calculatedResult = new BowlingCalculator ( ) . calculate ( playerResultAllZero ) ;
14
15 / / assert : check the Result by c a l l i n g one of JUnits assert methods .
16 / / the assert method throws an exception when the check f a i l s .
17 assertEquals ( ” a l l ␣zeros␣in ” , / / give usefull short ( ! ) additional description
18 / / skip when in doubt
19 expectedResult ,
20 calculatedResult ) ;
21 }
22 }
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 26 / 32
Mockito verwenden
1 class PlainOldJavaClass {
2 @Test
3 public void testedMethod__preconditions__expectedBehavior ( ) {
4 / / create mock
5 MyInterfaceOrClass mockObject = mock( MyInterfaceOrClass . class ) ;
6 / / create a spy
7 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␣ after ␣4th␣ c a l l ” ) )
13 .when ( spyObject ) . methodWithReturnValue ( ) ;
14
15 / / alternative for non void methods :
16 .when ( spyObject . methodWithReturnValue ( ) )
17 . thenReturn ( mockObject , null , mockObject )
18 . thenThrow (new RuntimeException ( ” simulate␣error␣ after ␣4th␣ c a l l ” ) ) ;
19
20 / / check c a l l of method
21 verify ( spyObject ) . expectedMethodCall ( mockObject , any ( OtherInterfaceOrClass . class ) ) ;
22 }
23 }
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 27 / 32
Test Driven Developement
1. neuer Test
2. Transformation
3. Refactoring
1. Schreibe einen neuen Test, gerade so viel dass er
fehl schlägt
(nicht kompilieren ist fehlschlagen).
2. Schreibe gerade so viel Produktivcode, dass der
Test erfüllt wird. Zukünftige Anforderungen nicht
beachten! (so simpel wie möglich, alles ist erlaubt,
Transitions-Prämissen beachten).
3. Verbessere den Code (Produktion und Test), ohne
einen Test zu berchen und ohne neue Funktinalität
(Geschäftslogik) hinzuzufügen.
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 28 / 32
Transformationsprämissen1
In der Implementierungsphase des TDD–Zyklus ist im Fall, dass mehrere
Transitionen möglich sind, die jenige anzuwenden, die in der folgenden Liste
am 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
Hands on
5
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 30 / 32
KataBowling
http://codingdojo.org/cgi-bin/index.pl?KataBowling
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 31 / 32
überraschend mehr Möglichkeiten!
© OPITZ CONSULTING 2017
Vielen Dank für die Aufmerksamkeit.
Thomas Papendieck
Senior–Consultant
Norsk–Data–Straße 4
61348 Bad Homburg
thomas.papendieck@opitz-consulting.com
+49 6172 66260 1523
© OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 32 / 32

More Related Content

Similar to UnitTests? Ja, aber richtig!

Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDKorrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDJörn Dinkla
 
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Markus Unterauer
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklungjlink
 
Die Macht der Zahlen
Die Macht der ZahlenDie Macht der Zahlen
Die Macht der ZahlenGerrit Beine
 
UI Testautomation in der Praxis: Von Lokalisierung bis Nachhaltigkeit
UI Testautomation in der Praxis: Von Lokalisierung bis NachhaltigkeitUI Testautomation in der Praxis: Von Lokalisierung bis Nachhaltigkeit
UI Testautomation in der Praxis: Von Lokalisierung bis NachhaltigkeitNico Orschel
 
eCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen SystemlandschafteneCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen SystemlandschaftenChristoph Menke
 
PHPUnit - Eine kurze Einführung
PHPUnit - Eine kurze EinführungPHPUnit - Eine kurze Einführung
PHPUnit - Eine kurze Einführungfrankstaude
 
iOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deiOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deHolger Hammel
 
Automatisiertes webauftritt testen
Automatisiertes webauftritt testenAutomatisiertes webauftritt testen
Automatisiertes webauftritt testenmradamlacey
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTddjlink
 
Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)Adam Sandman
 
96% macoun 2013
96% macoun 201396% macoun 2013
96% macoun 2013Maxim Zaks
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascriptjoergreichert
 
Statische Analyse von Java-Code in der Praxis
Statische Analyse von Java-Code in der PraxisStatische Analyse von Java-Code in der Praxis
Statische Analyse von Java-Code in der PraxisRoland Ewald
 
DWX 2014 - Coded UI in der Praxis: Von Lokalisierung bis Nachhaltigkeit
DWX 2014 -  Coded UI in der Praxis: Von Lokalisierung bis NachhaltigkeitDWX 2014 -  Coded UI in der Praxis: Von Lokalisierung bis Nachhaltigkeit
DWX 2014 - Coded UI in der Praxis: Von Lokalisierung bis NachhaltigkeitNico Orschel
 
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesDas funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesChristian Güdemann
 
Mobile Testautomatisierung mit Robotium
Mobile Testautomatisierung mit RobotiumMobile Testautomatisierung mit Robotium
Mobile Testautomatisierung mit RobotiumDaniel Knott
 
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...Marc Müller
 

Similar to UnitTests? Ja, aber richtig! (20)

Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDKorrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
 
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklung
 
Die Macht der Zahlen
Die Macht der ZahlenDie Macht der Zahlen
Die Macht der Zahlen
 
UI Testautomation in der Praxis: Von Lokalisierung bis Nachhaltigkeit
UI Testautomation in der Praxis: Von Lokalisierung bis NachhaltigkeitUI Testautomation in der Praxis: Von Lokalisierung bis Nachhaltigkeit
UI Testautomation in der Praxis: Von Lokalisierung bis Nachhaltigkeit
 
eCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen SystemlandschafteneCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
 
PHPUnit - Eine kurze Einführung
PHPUnit - Eine kurze EinführungPHPUnit - Eine kurze Einführung
PHPUnit - Eine kurze Einführung
 
iOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deiOS Testautomation bei mobile.de
iOS Testautomation bei mobile.de
 
Automatisiertes webauftritt testen
Automatisiertes webauftritt testenAutomatisiertes webauftritt testen
Automatisiertes webauftritt testen
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Definition of Ready
Definition of ReadyDefinition of Ready
Definition of Ready
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
 
Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)
 
96% macoun 2013
96% macoun 201396% macoun 2013
96% macoun 2013
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascript
 
Statische Analyse von Java-Code in der Praxis
Statische Analyse von Java-Code in der PraxisStatische Analyse von Java-Code in der Praxis
Statische Analyse von Java-Code in der Praxis
 
DWX 2014 - Coded UI in der Praxis: Von Lokalisierung bis Nachhaltigkeit
DWX 2014 -  Coded UI in der Praxis: Von Lokalisierung bis NachhaltigkeitDWX 2014 -  Coded UI in der Praxis: Von Lokalisierung bis Nachhaltigkeit
DWX 2014 - Coded UI in der Praxis: Von Lokalisierung bis Nachhaltigkeit
 
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesDas funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPages
 
Mobile Testautomatisierung mit Robotium
Mobile Testautomatisierung mit RobotiumMobile Testautomatisierung mit Robotium
Mobile Testautomatisierung mit Robotium
 
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
 

More from OPITZ CONSULTING Deutschland

Architecture Room Stuttgart - "Cloud-native ist nur ein Teil des Spiels!"
Architecture Room Stuttgart - "Cloud-native ist nur ein Teil des Spiels!"Architecture Room Stuttgart - "Cloud-native ist nur ein Teil des Spiels!"
Architecture Room Stuttgart - "Cloud-native ist nur ein Teil des Spiels!"OPITZ CONSULTING Deutschland
 
OC|Webcast: Oracle Lizenzierung - Die größten Fallen in der Praxis
OC|Webcast: Oracle Lizenzierung - Die größten Fallen in der PraxisOC|Webcast: Oracle Lizenzierung - Die größten Fallen in der Praxis
OC|Webcast: Oracle Lizenzierung - Die größten Fallen in der PraxisOPITZ CONSULTING Deutschland
 
OC|Webcast: Oracle Lizenzierung - Virtualisierung und Cloud
OC|Webcast: Oracle Lizenzierung - Virtualisierung und CloudOC|Webcast: Oracle Lizenzierung - Virtualisierung und Cloud
OC|Webcast: Oracle Lizenzierung - Virtualisierung und CloudOPITZ CONSULTING Deutschland
 
OC|Weekly Talk: Inspect’n’Adapt – Make Change come true!
OC|Weekly Talk: Inspect’n’Adapt – Make Change come true!OC|Weekly Talk: Inspect’n’Adapt – Make Change come true!
OC|Weekly Talk: Inspect’n’Adapt – Make Change come true!OPITZ CONSULTING Deutschland
 
OC|Webcast: Schnell und clever in die AWS Cloud – Migrationsszenarien und Han...
OC|Webcast: Schnell und clever in die AWS Cloud – Migrationsszenarien und Han...OC|Webcast: Schnell und clever in die AWS Cloud – Migrationsszenarien und Han...
OC|Webcast: Schnell und clever in die AWS Cloud – Migrationsszenarien und Han...OPITZ CONSULTING Deutschland
 
OC|Weekly Talk: "Das müsste man mal digitalisieren" - Mit Low-Code schnell zu...
OC|Weekly Talk: "Das müsste man mal digitalisieren" - Mit Low-Code schnell zu...OC|Weekly Talk: "Das müsste man mal digitalisieren" - Mit Low-Code schnell zu...
OC|Weekly Talk: "Das müsste man mal digitalisieren" - Mit Low-Code schnell zu...OPITZ CONSULTING Deutschland
 
OC|Weekly Talk: Service Management – Was hat sich durch Corona geändert?
OC|Weekly Talk: Service Management – Was hat sich durch Corona geändert?OC|Weekly Talk: Service Management – Was hat sich durch Corona geändert?
OC|Weekly Talk: Service Management – Was hat sich durch Corona geändert?OPITZ CONSULTING Deutschland
 
OC|Weekly Talk - Digitales Coaching & Smart Sparring
OC|Weekly Talk - Digitales Coaching & Smart Sparring OC|Weekly Talk - Digitales Coaching & Smart Sparring
OC|Weekly Talk - Digitales Coaching & Smart Sparring OPITZ CONSULTING Deutschland
 
Effiziente Betriebsoptimierung durch Cloud Nutzung
Effiziente Betriebsoptimierung durch Cloud NutzungEffiziente Betriebsoptimierung durch Cloud Nutzung
Effiziente Betriebsoptimierung durch Cloud NutzungOPITZ CONSULTING Deutschland
 

More from OPITZ CONSULTING Deutschland (20)

OC|Webcast: Grundlagen der Oracle Lizenzierung
OC|Webcast: Grundlagen der Oracle LizenzierungOC|Webcast: Grundlagen der Oracle Lizenzierung
OC|Webcast: Grundlagen der Oracle Lizenzierung
 
OC|Webcast "Java heute" vom 28.09.2021
OC|Webcast "Java heute" vom 28.09.2021OC|Webcast "Java heute" vom 28.09.2021
OC|Webcast "Java heute" vom 28.09.2021
 
OC|Webcast "Java heute" vom 24.08.2021
OC|Webcast "Java heute" vom 24.08.2021OC|Webcast "Java heute" vom 24.08.2021
OC|Webcast "Java heute" vom 24.08.2021
 
OC|Webcast "Daten wirklich nutzen"
OC|Webcast "Daten wirklich nutzen"OC|Webcast "Daten wirklich nutzen"
OC|Webcast "Daten wirklich nutzen"
 
Architecture Room Stuttgart - "Cloud-native ist nur ein Teil des Spiels!"
Architecture Room Stuttgart - "Cloud-native ist nur ein Teil des Spiels!"Architecture Room Stuttgart - "Cloud-native ist nur ein Teil des Spiels!"
Architecture Room Stuttgart - "Cloud-native ist nur ein Teil des Spiels!"
 
OC|Webcast "Willkommen in der Cloud!"
OC|Webcast "Willkommen in der Cloud!"OC|Webcast "Willkommen in der Cloud!"
OC|Webcast "Willkommen in der Cloud!"
 
OC|Webcast "Die neue Welt der Virtualisierung"
OC|Webcast "Die neue Welt der Virtualisierung"OC|Webcast "Die neue Welt der Virtualisierung"
OC|Webcast "Die neue Welt der Virtualisierung"
 
10 Thesen zur professionellen Softwareentwicklung
10 Thesen zur professionellen Softwareentwicklung10 Thesen zur professionellen Softwareentwicklung
10 Thesen zur professionellen Softwareentwicklung
 
OC|Webcast: Oracle Lizenzierung - Lizenznews 2021
OC|Webcast: Oracle Lizenzierung - Lizenznews 2021OC|Webcast: Oracle Lizenzierung - Lizenznews 2021
OC|Webcast: Oracle Lizenzierung - Lizenznews 2021
 
OC|Webcast: Oracle Lizenzierung - Die größten Fallen in der Praxis
OC|Webcast: Oracle Lizenzierung - Die größten Fallen in der PraxisOC|Webcast: Oracle Lizenzierung - Die größten Fallen in der Praxis
OC|Webcast: Oracle Lizenzierung - Die größten Fallen in der Praxis
 
OC|Webcast: Oracle Lizenzierung - Virtualisierung und Cloud
OC|Webcast: Oracle Lizenzierung - Virtualisierung und CloudOC|Webcast: Oracle Lizenzierung - Virtualisierung und Cloud
OC|Webcast: Oracle Lizenzierung - Virtualisierung und Cloud
 
OC|Webcast: Grundlagen der Oracle-Lizenzierung
OC|Webcast: Grundlagen der Oracle-LizenzierungOC|Webcast: Grundlagen der Oracle-Lizenzierung
OC|Webcast: Grundlagen der Oracle-Lizenzierung
 
OC|Weekly Talk: Inspect’n’Adapt – Make Change come true!
OC|Weekly Talk: Inspect’n’Adapt – Make Change come true!OC|Weekly Talk: Inspect’n’Adapt – Make Change come true!
OC|Weekly Talk: Inspect’n’Adapt – Make Change come true!
 
OC|Webcast: Schnell und clever in die AWS Cloud – Migrationsszenarien und Han...
OC|Webcast: Schnell und clever in die AWS Cloud – Migrationsszenarien und Han...OC|Webcast: Schnell und clever in die AWS Cloud – Migrationsszenarien und Han...
OC|Webcast: Schnell und clever in die AWS Cloud – Migrationsszenarien und Han...
 
OC|Weekly Talk The Power of DevOps…
OC|Weekly Talk  The Power of DevOps…OC|Weekly Talk  The Power of DevOps…
OC|Weekly Talk The Power of DevOps…
 
OC|Weekly Talk: "Das müsste man mal digitalisieren" - Mit Low-Code schnell zu...
OC|Weekly Talk: "Das müsste man mal digitalisieren" - Mit Low-Code schnell zu...OC|Weekly Talk: "Das müsste man mal digitalisieren" - Mit Low-Code schnell zu...
OC|Weekly Talk: "Das müsste man mal digitalisieren" - Mit Low-Code schnell zu...
 
OC|Weekly Talk: Service Management – Was hat sich durch Corona geändert?
OC|Weekly Talk: Service Management – Was hat sich durch Corona geändert?OC|Weekly Talk: Service Management – Was hat sich durch Corona geändert?
OC|Weekly Talk: Service Management – Was hat sich durch Corona geändert?
 
OC|Weekly Talk - Digitales Coaching & Smart Sparring
OC|Weekly Talk - Digitales Coaching & Smart Sparring OC|Weekly Talk - Digitales Coaching & Smart Sparring
OC|Weekly Talk - Digitales Coaching & Smart Sparring
 
OC|Weekly Talk - Beratung remote
OC|Weekly Talk - Beratung remoteOC|Weekly Talk - Beratung remote
OC|Weekly Talk - Beratung remote
 
Effiziente Betriebsoptimierung durch Cloud Nutzung
Effiziente Betriebsoptimierung durch Cloud NutzungEffiziente Betriebsoptimierung durch Cloud Nutzung
Effiziente Betriebsoptimierung durch Cloud Nutzung
 

UnitTests? Ja, aber richtig!

  • 1. überraschend mehr Möglichkeiten! © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! O.O.P. Conference / München Thomas Papendieck, Senior–Consultant
  • 2. 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
  • 3. Worüber ich nicht spreche 1.1 Vorteile von Unittetst 1.2 Probleme manueller Tests 1.3 Welche Tests sollten automatisiert werden? 1 © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 3 / 32
  • 4. Relative Kosten von Fehlern Wie teuer ist ein Fehler in Abhängigkeit vom Zeitpunkt seiner Entdeckung: während der Entwicklung 1 Wenn der Entwickler das fertige Feature testet 3 Während der Integration 10 Beim Abnahmetest 100 in der Produktion 1000 © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 4 / 32
  • 5. 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
  • 6. 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
  • 7. 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 welchen Bedingungen er auftritt. hoher UnitTest Abdeckung → weniger Test höherer Ebenen UnitTests prüfen die Geschäftslogik, Application/Module–Tests die ”Verdrahtung” © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 7 / 32
  • 8. Warum schreiben wir keine automatisierten Tests? © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 8 / 32
  • 9. was ist Test Driven Developement? 1. neuer Test 2. Transformation 3. Refactoring 1. Schreibe einen neuen Test, gerade so viel dass er fehl schlägt (nicht kompilieren ist fehlschlagen). 2. Schreibe gerade so viel Produktivcode, dass der Test erfüllt wird. Zukünftige Anforderungen nicht beachten! (so simpel wie möglich, alles ist erlaubt, Transitions-Prämissen beachten). 3. Verbessere den Code (Produktion und Test), ohne einen Test zu berchen und ohne neue Funktinalität (Geschäftslogik) hinzuzufügen. © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 9 / 32
  • 10. 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
  • 11. Anforderungen an UnitTests 2 © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 11 / 32
  • 12. Was ist ein guter UnitTest? Readable - lesbar Trustworthy - vertrauenswürdig Fast - schnell Maintainable - wartbar © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 12 / 32
  • 13. Was bedeutet lesbar? was wird getestet Name des Tests drückt vorbedingungen und erwartetes ergebnis aus. kurz wiederkehrende 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 anlegen Variablennamen sorgsam wählen Verifizierungsmethoden mit sprechenden Namen. © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 13 / 32
  • 14. Beispiel Lesbarkeit © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 14 / 32
  • 15. Was bedeutet vertrauenswürdig? Geschäftsanforderungen erfüllt Wurde tatsächlich implementiert, was der Kunde wollte? technisch Wird 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
  • 16. Was bedeutet schnell? Tests sollen sehr häufig ausgeführt werden (wo möglich nach jedem Speichern). Dadurch erhalten wir sofort Feedback, ob die letzte Änderung einen Fehler verursacht hat. Aufwendige und potenziell langsame Logik in Abhängigkeiten der Unit müssen ersetzt werden. © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 16 / 32
  • 17. Was bedeutet wartbar? Stabilität gegenüber Änderungen in anderen Units Abhängigkeiten ersetzen stabil gegen Änderungen in der Unit selbst eine einzelne Anforderung (nicht Codestelle) testen. © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 17 / 32
  • 18. Anforderungen an zu testenden Code 3.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
  • 19. Testbarkeit von produktivem Code Qualität des produktivem Code (im sinne von ”Clean Code”) beeinflußt die Qualität der Tests (im Sinne der RTFM– Anforderungen) die wichtigsten ”Clean Code” Regeln sind: Separation of concerns single resposibility Erzeugung 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
  • 20. Testbarkeit von produktivem Code © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 20 / 32
  • 21. Arten von Test–Doubles Stub leere Implementierung einer Schnittstelle, üblicher Weise generiert Fake alternative Implementierung einer Schnittstelle oder Erweiterung einer existierenden 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
  • 22. 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
  • 23. 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
  • 24. UnitTest in Java 4.1 Werkzeuge 4.2 Code Vorlagen 4.3 Transformationsprämissen 4 © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 24 / 32
  • 25. 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
  • 26. einen JUnit Test schreiben 1 class PlainOldJavaClass { 2 3 @Test / / marks a method so that i t s been called by JUnit 4 public / / test methods must be public 5 void / / test methods must not return anything 6 calculate_worstGame_returnsZero ( ) / / no parameters 7 { 8 / / arrange : create and configure dependencies and variables 9 String playerResultAllZero = ” 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ” ; 10 int expectedResult = 0; 11 12 / / act : create tested unit ( i f possible ) and c a l l tested method . 13 int calculatedResult = new BowlingCalculator ( ) . calculate ( playerResultAllZero ) ; 14 15 / / assert : check the Result by c a l l i n g one of JUnits assert methods . 16 / / the assert method throws an exception when the check f a i l s . 17 assertEquals ( ” a l l ␣zeros␣in ” , / / give usefull short ( ! ) additional description 18 / / skip when in doubt 19 expectedResult , 20 calculatedResult ) ; 21 } 22 } © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 26 / 32
  • 27. Mockito verwenden 1 class PlainOldJavaClass { 2 @Test 3 public void testedMethod__preconditions__expectedBehavior ( ) { 4 / / create mock 5 MyInterfaceOrClass mockObject = mock( MyInterfaceOrClass . class ) ; 6 / / create a spy 7 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␣ after ␣4th␣ c a l l ” ) ) 13 .when ( spyObject ) . methodWithReturnValue ( ) ; 14 15 / / alternative for non void methods : 16 .when ( spyObject . methodWithReturnValue ( ) ) 17 . thenReturn ( mockObject , null , mockObject ) 18 . thenThrow (new RuntimeException ( ” simulate␣error␣ after ␣4th␣ c a l l ” ) ) ; 19 20 / / check c a l l of method 21 verify ( spyObject ) . expectedMethodCall ( mockObject , any ( OtherInterfaceOrClass . class ) ) ; 22 } 23 } © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 27 / 32
  • 28. Test Driven Developement 1. neuer Test 2. Transformation 3. Refactoring 1. Schreibe einen neuen Test, gerade so viel dass er fehl schlägt (nicht kompilieren ist fehlschlagen). 2. Schreibe gerade so viel Produktivcode, dass der Test erfüllt wird. Zukünftige Anforderungen nicht beachten! (so simpel wie möglich, alles ist erlaubt, Transitions-Prämissen beachten). 3. Verbessere den Code (Produktion und Test), ohne einen Test zu berchen und ohne neue Funktinalität (Geschäftslogik) hinzuzufügen. © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 28 / 32
  • 29. Transformationsprämissen1 In der Implementierungsphase des TDD–Zyklus ist im Fall, dass mehrere Transitionen möglich sind, die jenige anzuwenden, die in der folgenden Liste am 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
  • 30. Hands on 5 © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 30 / 32
  • 32. überraschend mehr Möglichkeiten! © OPITZ CONSULTING 2017 Vielen Dank für die Aufmerksamkeit. Thomas Papendieck Senior–Consultant Norsk–Data–Straße 4 61348 Bad Homburg thomas.papendieck@opitz-consulting.com +49 6172 66260 1523 © OPITZ CONSULTING 2017 UnitTests? Ja, aber richtig! 32 / 32