Wie wird mein Code testbar?

45
 http://commons.wikimedia.org/wiki/File:Pit_crew_Hudson_Valley.JPG Referent: David Völkel Wie wird mein Code testbar? http://commons.wikimedia.org/wiki/File:CarService.JPG

description

Slides zur Session "Wie wird mein Code testbar?" auf den Berlin Expert Days 29.03.2012 Abstract: Soll ein Legacy System nachträglich um automatisierte Tests erweitert werden, so steht man gleich vor zwei Problemen auf einmal: einerseit verfügt das Team noch über wenig Test-Knowhow, andererseits ist Code schwer testbar, der nicht testgetrieben entwickelt wurde. So schwindet im Team schnell die Akzeptanz, automatisierte Tests zu schreiben: zu aufwändig! Der Vortrag stellt den Ansatz “Design for Testability” vor und illustiert anhand konkreter Java-Beispiele Potentiale zur Verbesserung der Testbarkeit, so dass Tests einfacher umgesetzt aber auch gewartet werden können.

Transcript of Wie wird mein Code testbar?

Page 1: Wie wird mein Code testbar?

   http://commons.wikimedia.org/wiki/File:Pit_crew_Hudson_Valley.JPG

Referent: David Völkel

Wie wird mein Code testbar?

http://commons.wikimedia.org/wiki/File:CarService.JPG

Page 2: Wie wird mein Code testbar?

   

                 David Völkel

Page 3: Wie wird mein Code testbar?

   http://commons.wikimedia.org/wiki/File:Pit_crew_Hudson_Valley.JPG

http://commons.wikimedia.org/wiki/File:CarService.JPG

hard to test codeanti­pattern

Gute Testbarkeit

Page 4: Wie wird mein Code testbar?

   

Überblick* Testbarkeit* TDD vs. Legacy* Isolation* Ciao „accidental complexity“!

Page 5: Wie wird mein Code testbar?

   

Testbarkeit

http://commons.wikimedia.org/wiki/File:CarService.JPG

Kriterien* operability* decomposability* observability* controllability

Page 6: Wie wird mein Code testbar?

   

http://commons.wikimedia.org/wiki/File:CarService.JPG

Designziel* wenig Testaufwand

Ursprung E­Technik* Testschnittstellen

 

Design for Testability (DfT) 

Page 7: Wie wird mein Code testbar?

   

Test Driven Development vs. 

Legacy

Page 8: Wie wird mein Code testbar?

   

write failing test

make the test pass

(refactor)

Test Driven Development

http://commons.wikimedia.org/wiki/File:Bluebird_land_speed_record_car_1935_rc10413.jpg

Page 9: Wie wird mein Code testbar?

   

write failing test

make the test pass

(refactor)

Test Driven Development

(refactor)

http://commons.wikimedia.org/wiki/File:Bluebird_land_speed_record_car_1935_rc10413.jpg

Page 10: Wie wird mein Code testbar?

   

write failing test

make the test pass

(refactor)

Test Driven Development

(refactor)

Externe QualitätFunktional

http://commons.wikimedia.org/wiki/File:Bluebird_land_speed_record_car_1935_rc10413.jpg

Page 11: Wie wird mein Code testbar?

   

write failing test

make the test pass

(refactor)

Test Driven Development

(refactor)

Externe QualitätFunktional

Interne Qualität=> Test Driven Design

Page 12: Wie wird mein Code testbar?

   

* Drive Designkontinuierlichminimalistisch (YAGNI)testbar <=> gutes Design

Test Driven Design

Code

Test

http://commons.wikimedia.org/wiki/File:Bluebird_land_speed_record_car_1935_rc10413.jpg

Page 13: Wie wird mein Code testbar?

   

* Drive Designkontinuierlichminimalistisch (YAGNI)testbar <=> gutes Design

* Feedback auf Design„Listen to your tests“!(Zitat Johansen, 2010)

Test Driven Design

Code

Test

http://commons.wikimedia.org/wiki/File:Bluebird_land_speed_record_car_1935_rc10413.jpg

Page 14: Wie wird mein Code testbar?

   

Legacy Code= keine Testsschlecht testbares Design

* eigener Code* 3rd Party Code (Frameworks)

http://commons.wikimedia.org/wiki/File:Kopalnia_Wieczorek_rozbite_okna_12.08.jpg?uselang=de

Page 15: Wie wird mein Code testbar?

   

Legacy TDDRenovierungDoppelt schwierig* Noch wenig KnowHow im Team* Schwer testbarer Code

http://commons.wikimedia.org/wiki/File:Kopalnia_Wieczorek_rozbite_okna_12.08.jpg?uselang=dehttp://commons.wikimedia.org/wiki/File:Bluebird_land_speed_record_car_1935_rc10413.jpg

Page 16: Wie wird mein Code testbar?

   

Legacy TDDRenovierung* „Lazy“* Fixierung mit Systemtests* Refactoring * Unittests für neue Features

Nach Feathers 2004

http://commons.wikimedia.org/wiki/File:Kopalnia_Wieczorek_rozbite_okna_12.08.jpg?uselang=dehttp://commons.wikimedia.org/wiki/File:Bluebird_land_speed_record_car_1935_rc10413.jpg

Page 17: Wie wird mein Code testbar?

   

Isolation

Page 18: Wie wird mein Code testbar?

   

IsolationTest

Ziele* Klarer Fokus

­ Testaufwand sinkt­ Fehlerlokalisierung 

einfacher* Performanz

http://commons.wikimedia.org/wiki/File:Cocks_in_separate_cages,_Thailand.jpg

Page 19: Wie wird mein Code testbar?

   

front doorTest

* KEINE Isolation* round trip tests* state verification depended on components 

(DOCs)

Testling

Begriffe nach Meszaros 2007http://commons.wikimedia.org/wiki/File:Stork_Hotel_door.jpg

Page 20: Wie wird mein Code testbar?

   

back door

Begriffe nach Meszaros 2007

Test

„Mocks“

http://commons.wikimedia.org/wiki/File:Dummy_of_a_police_car.jpg

Unittests gegen­ Blätter­ „Units“ mit DOCs

Page 21: Wie wird mein Code testbar?

   

Isolierbarkeit

Problem:Test Doubles nicht setzbar

Refactorings

Isolierbar

Test

Test Doubles

Page 22: Wie wird mein Code testbar?

   

Beispiel: Logger

Page 23: Wie wird mein Code testbar?

   

Probleme

Observability (OUTPUT)

Controllability (INPUT) 

Page 24: Wie wird mein Code testbar?

   

Ursachen

statische Abhängigkeiten* Konstruktoraufrufe* Singletons

Page 25: Wie wird mein Code testbar?

   

Statischer Aufruf => Objekte

Page 26: Wie wird mein Code testbar?

   

Statischer Aufruf => Objekte

Interface* Abhängigkeiten 

explizitergeringer (ISP)

* Semantik durch Rollen 

Klasse          <=>* weniger Aufwand* „don't mock concrete 

classes“ 

  Zitat aus Freeman / Pryce 2009

Page 27: Wie wird mein Code testbar?

   

„Setzbarkeit“

Dependency Injection* DOCs setzbar* Konstruktor vs. Setter* kein static

http://commons.wikimedia.org/wiki/File:Syringe_Glove_01.jpg

Page 28: Wie wird mein Code testbar?

   

Stub mit Bordmittel

* Input kontrollierbar* etwas sperrig

Controllability (INPUT) 

Page 29: Wie wird mein Code testbar?

   

Stub mit Mockframework

einfacher bei breiteren Interfaces

Page 30: Wie wird mein Code testbar?

   

Observability (OUTPUT) 

Test Spy mit Bordmitteln 

Page 31: Wie wird mein Code testbar?

   

* knapp* „behavior verification“

Test Spy mit Mockframework 

Page 32: Wie wird mein Code testbar?

   

...

Test

GUI

Service

„trainwreck code“Begriff von Freeman / Price 2009

http://upload.wikimedia.org/wikipedia/commons/b/b5/Durango_Silverton_Train.jpg?uselang=de

Transitive Abhängigkeiten

Problem: Implizite Abhängigkeiten

Page 33: Wie wird mein Code testbar?

   

...

Test

* Abhängigkeit explizit* nur zu „Nachbarn“

Begriff „trainwreck code“ von Freeman / Price 2009http://commons.wikimedia.org/wiki/File:1918trainwreck.jpg

Transitive Abhängigkeiten

GUI

Service

Page 34: Wie wird mein Code testbar?

   

Dependency Injection

Kontext Objekte* kennen nur Nachbarn

Abhängigkeit

http://commons.wikimedia.org/wiki/File:Syringe_Glove_01.jpg

Page 35: Wie wird mein Code testbar?

   

Ciao „accidental complexity“!

Page 36: Wie wird mein Code testbar?

   

Ciao „accidental complexity“!

Problem:* komplexe Setups* schlechter Fokus

http://commons.wikimedia.org/wiki/File:US_Navy_040619­N­8704K­001_Boatswain_Mate_3rd_Class_Joanna_Saldana_cuts_the_rope_off_a_span_wire_aboard_the_aircraft_carrier_USS_John_F._Kennedy_%28CV_67%29_during_an_underway_replenishment_.jpg?uselang=de

Page 37: Wie wird mein Code testbar?

   

Logische Fehler* Schichten, z.B.

Prod­Code => Test­Code* Zyklen … und viele andere mehr!

http://de.wikipedia.org/w/index.php?title=Datei:Lattenkiste_a.jpg&filetimestamp=20060723120820

Page 38: Wie wird mein Code testbar?

   

Alles hängt von allem ab

Big Ball of Mud Separations of 

Concerns

System kleinschneiden 

decomposability

Page 39: Wie wird mein Code testbar?

   

FokusSRP => Klasse

http://commons.wikimedia.org/wiki/File:Crossroads.jpg

Page 40: Wie wird mein Code testbar?

   

2 Aspekte auf einmal

...

Unfokussiert

Page 41: Wie wird mein Code testbar?

   

...

...

einfacher testbar

fokussierter

Extract Class Refactoring

Page 42: Wie wird mein Code testbar?

   

DfTStrategie

Isolation

http://commons.wikimedia.org/wiki/File:US_Navy_040619­N­8704K­001_Boatswain_Mate_3rd_Class_Joanna_Saldana_cuts_the_rope_off_a_span_wire_aboard_t

he_aircraft_carrier_USS_John_F._Kennedy_%28CV_67%29_during_an_underway_replenishment_.jpg?uselang=de

http://commons.wikimedia.org/wiki/File:Cocks_in_separate_cages,_Thailand.jpg

Ciao „accidental complexity“!

TDD

Page 43: Wie wird mein Code testbar?

   

Quellen­ http://www.testbarkeit.de

­ http://en.wikipedia.org/wiki/Design_for_testing­ Peter Zimmer, 2012: Testability – A Lever to Build Sustaining Systems, OOP Conference 2012­ http://secs.ceas.uc.edu/~cpurdy/sefall11/testing_payneetal_1997.pdf

­ Steve Freeman, Nat Pryce, 2009: „Growing Object­Oriented Software guided by Tests“

­ Micheal Feathers, 2004: „Working effectively with legacy systems“

­ Robert C. Martin, 2009: „Clean Code“

­ Gerard Meszaros, 2007: „xUnit Test Patterns“ bzw.  http://xunitpatterns.com/

­ Christian Johansen, 2010: „Test­Driven JavaScript Development “­ http://de.wikipedia.org/wiki/Gesetz_von_Demeter­ Eric Evans, 2003: „Domain Driven Design“

Page 44: Wie wird mein Code testbar?

   

Fragen und 

Diskussion

http://commons.wikimedia.org/wiki/File:CarService.JPG

Page 45: Wie wird mein Code testbar?

   

Lizensiert unter Creative Commons 3.0 Attribution + Sharealike siehehttp://creativecommons.org/licenses/by­sa/3.0/deed.de