55
http://commons.wikimedia.org/wiki/File:Pit_crew_Hudson_Valley.JPG David Völkel, codecentric AG „Design for Testability“ in der Praxis http://commons.wikimedia.org/wiki/File:CarService.JPG

„Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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

David Völkel, codecentric AG

„Design for Testability“ in der Praxis

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

Page 2: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

David Völkel* @davidvoelkel* https://www.xing.com/profile/David_Voelkel

Page 3: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Überblick* Testbarkeit* Test Driven Design vs. Legacy* Isolation * Isolierende Refactorings

Page 5: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Testbarkeit

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

= Aufwand fürs TestenKriterien* operability* decomposability* observability* controllability

Page 6: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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

Designziel* wenig Testaufwand

Ursprung E-Technik

Design for Testability (DfT)

Tests SUT

Page 7: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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

Designziel* wenig Testaufwand

Ursprung E-Technik* Testschnittstellen

Design for Testability (DfT)

Tests SUT

Page 8: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Test Driven Design vs. Legacy

Page 9: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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 10: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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 11: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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 12: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

write failing test

make the test pass

(refactor)

Test Driven Development

(refactor)

Externe QualitätFunktional

Interne Qualität=> Test Driven Design

Page 13: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Qualität durch Redundanz

http://commons.wikimedia.org/wiki/File:PC-Netzteil_%28redundant%29.jpg

CodeTest

2x ●* Problem ●* Sprache●* Personen

●* deklarativ●* beispielhaft

●* algorithmisch

Page 14: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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

Test Driven Design

Code

Test

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

Page 15: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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

Test Driven Design

Code

Test

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

Page 16: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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

* Feedback auf Design„Listen to your tests“!

Test Driven Design

Code

Test

http://commons.wikimedia.org/wiki/File:1948_Hans_Breinlinger_-_Clown_mit_Spiegel.jpg

Page 17: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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 18: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Legacy TDDRenovierungDoppelt schwierig* Im Team noch wenig KnowHow (TDD, Design) * 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 19: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Legacy TDDRenovierung* „Lazy“* Fixierung mit Systemtests* Refactoring * TDD / 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 20: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Isolation

Page 21: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

front doorTest

* KEINE Isolation* integration / round trip tests

depended on components (DOCs)

Testling

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

Page 22: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

„integration tests are a scam“(J.B. Rainsberger)

Page 23: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

back door

Begriffe nach Meszaros 2007

„Mocks“

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

„collaboration tests“* Unittests * mit Test Doubles

Test

Page 24: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

contract tests

Begriffe nach J.B. Rainsbergerhttp://commons.wikimedia.org/wiki/File:Dummy_of_a_police_car.jpg

* erfüllt DOC den Contract?

* abgestimmt mit collaboration tests

Test

Page 25: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Blätter

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

Unittests gegen Blätter* Isolation geschenkt

Test

Page 26: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

IsolationNutzen* Klarer Fokus

- Testbarkeit- Fehlerlokalisierung - Wartbarkeit

* Performanz=> schnelleres

Feedback* Weniger Testfälle a * b => a + b

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

Test

Page 27: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Problem GUI Testing?

Keine Isolation=> schlechte Wartbarkeit=> schlechte Performance=> schlechte Fehlerlokalisierung => fehleranfällig

http://upload.wikimedia.org/wikipedia/commons/9/97/Fire_2011.jpg?uselang=de

Page 28: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Testpyramide

GUI

API / Service Component / Integration

Unit http://commons.wikimedia.org/wiki/File:Piramida_Cheopsa.jpg

* Testcoverage

Page 29: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Isolation vs.

ATDD / Outside-In?

http://commons.wikimedia.org/wiki/File:Actress-fear-and-panic.jpg

Page 30: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

* Outside-In geht auch gegen API* GUI Tests isolieren* Integration testen,

nicht Funktionalitäten der Beteiligten

Isolation vs.

ATDD / Outside-In?

Page 31: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Isolierbarkeit

Problem:Test Doubles nicht setzbar

Test

Test Doubles

Page 32: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Isolierbarkeit

Problem:Test Doubles nicht setzbar

Refactorings

Isolierbar

Test

Test Doubles

Page 33: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Isolierende Refactorings

Page 34: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Beispiel: Logger

Page 35: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Probleme

Observability (OUTPUT)

Controllability (INPUT)

Page 36: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Ursachen

statische Abhängigkeiten* Konstruktoraufrufe* Singletons

Page 37: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Statischer Aufruf => Objekte

Zitat aus Freeman / Pryce 2009

Page 38: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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 39: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

„Setzbarkeit“

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

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

Page 40: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Stub mit Bordmittel

* Input kontrollierbar

Controllability (INPUT)

Page 41: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Stub mit Mockframework

* einfacher bei breiteren Interfaces

Page 42: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Observability (OUTPUT)

Test Spy mit Bordmitteln

Page 43: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

* knapp* „behavior verification“

Test Spy mit Mockframework

Page 44: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

...

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 45: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

...

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 46: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Dependency Injection

Kontext Objekte* kennen nur Nachbarn

Abhängigkeit

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

Page 47: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

FokusSRP => Klasse

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

Page 48: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

2 Aspekte auf einmal

...

Unfokussiert

Page 49: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

...

...

einfacher testbar

fokussierter

Extract Class Refactoring

Page 50: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Design-probleme

Testbarkeit

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

Page 51: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Design-probleme

Testbarkeit

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

* Abhängigkeitszyklen* fachlich nicht

begründetete Abhängigkeiten

* accidental complexity* Status im Testling* u.v.m. …

Page 52: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

DfT Strategie

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

TDDhttp://commons.wikimedia.org/wiki/File:Bluebird_land_speed_record_car_1935_rc1

0413.jpg

http://commons.wikimedia.org/wiki/File:1948_Hans_Breinlinger_-_Clown_mit_Spiegel.jpg

Listen

Page 53: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Quellen- http://www.testbarkeit.de- http://en.wikipedia.org/wiki/Design_for_testing- Peter Zimmerer, 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/- http://de.wikipedia.org/wiki/Gesetz_von_Demeter- Testing Pyramid:

- Mike Cohn, „the forgotten layer of the test automation pyramid„- http://blogs.agilefaqs.com/2011/02/01/inverting-the-testing-pyramid/

- J.B. Rainsberger: „Integrations tests are a scam“

Page 54: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

Fragen und

Diskussion!

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

Page 55: „Design for Testability“ in der Praxis€¦ · David Völkel * @davidvoelkel *

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