tipps & tricks für das testen von microservices · agenda •traditionelle testpyramide...

65
Tipps & Tricks für das Testen von Microservices Jörg Pfründer Hypoport AG

Upload: others

Post on 02-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Tipps & Tricks für das Testen von Microservices

Jörg Pfründer

Hypoport AG

Page 2: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

EUROPACE

Page 3: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

EUROPACE

15% der Immobilienkredite Deutschlands

Page 4: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

EUROPACE

15% der Immobilienkredite Deutschlands

ca. 3 Mrd Euro / Monat

Page 5: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Technologien

Java / Groovy

MongoDB (Oracle) Spring

Tomcat / Spring Boot

Page 6: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Agenda

• Traditionelle Testpyramide • Besondere Herausforderungen bei

Microservices • Postel's Law für Tests • Drück‘ Dich aus! • Production Code ist Test Code • Täusche und betrüge • Doppelt hält besser

Page 7: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Monolith

Page 8: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich
Page 9: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Anzahl der Tests

Page 10: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Lose Kopplung

Page 11: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich
Page 12: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

#1 Postel‘s Law für Tests

Page 13: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

String equals

Problem #1

{„vorname“ : „Max“, „nachname“ : „Mustermann“ }

Page 14: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

String equals JSONassert (XMLAssert)

Problem #1

{

„vorname“ : „Max“,

„nachname“ : „Mustermann“

}

Page 15: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

String equals JSONassert (XMLAssert) ??

Problem #1

{

„vorname“ : „Max“,

„nachname“ : „Mustermann“,

„name“ : „Max Mustermann“

}

Page 16: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

String equals JSONassert (XMLAssert)

Problem #1

{

„id“ : 9586729475,

„vorname“ : „Max“,

„nachname“ : „Mustermann“,

„name“ : „Max Mustermann“

}

Page 17: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

• Nur wenige Elemente der UI werden getestet

• Das meiste bleibt ungetestet

Inspiration: UI Automation

Page 18: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

• JSONpath (Xpath)

• Groovy RESTClient (SOAPClient)

Trick #1

{

„id“ : 9586729475,

„vorname“ : „Max“,

„nachname“ : „Mustermann“,

„name“ : „Max Mustermann“

}

Page 19: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Be conservative in what you do,

be liberal in what you accept

from others.

Jonathan Postel

RFC793

Trick #1: Postel‘s Law

Lizenziert unter Attribution über Wikimedia Commons http://commons.wikimedia.org/wiki/File:Jon_Postel.jpg#mediaviewer/File:Jon_Postel.jpg

Page 20: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

#2 Drück‘ Dich aus!

Page 21: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Problem #2

http://geek-and-poke.com/geekandpoke/2013/7/28/tdd (Lizensiert unter Creative Commons 3.0 – mittleres Bild entfernt)

Page 22: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Problem #2

http://geek-and-poke.com/geekandpoke/2013/7/28/tdd (Lizensiert unter Creative Commons 3.0 – mittleres Bild entfernt)

Page 23: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Inspiration: Webdriver Page Object

Page 24: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #2: Response Object

• Antwort des Services in einem Response-Object kapseln

• Response-Object bietet fachliche Methoden an, macht intern die Umsetzung auf JSON bzw. XML

Page 25: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #2: Response Object

Page 26: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #2: Response Object

Verständlichkeit

Wiederverwendung

Page 27: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

#3 Production Code ist

Test Code

Page 28: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Problem #3

Lose Kopplung

Page 29: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #3

Contract Tests

{

„id“ : 9586729475,

„vorname“ : „Max“,

„nachname“ : „Mustermann“,

„name“ : „Max Mustermann“

}

Page 30: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #3: Production Code ist Test Code

Benutze die Implementierung des Clients als Test:

Consumer Driven Tests bzw.

Consumer Driven Test Suite (CDTS)

Page 31: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #3: Production Code ist Test Code

Consumer μ-Service

Service- Provider

Consumer Driven Test Suite

Page 32: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #3: Production Code ist Test Code

Consumer Driven Tests

Technologieunabhängig?

Page 33: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #3: Production Code ist Test Code

beinahe technologieunabhängig:

Page 34: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

#4 Täusche und betrüge!

Page 35: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Problem #4: Downstream Dependencies

? μ-Service under Test

Downstream Dependency

Page 36: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #4: Täusche und Betrüge

Mock μ-Service under Test

Page 37: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

#4: Mountebank - der Marktschreier

• www.mbtest.org • node.js basiert • Erhältlich als standalone-

Installationspaket oder via npm

Page 38: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

μ-Service under Test Mountebank

#4: Mountebank - der Marktschreier

Page 39: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

POST /imposters

{

"port": 4545,

"protocol": "http",

"stubs": [

{

"responses": [

{

"is": {

"statusCode": 200,

"headers": {

"Content-Type": "text/html; charset=utf-8"

},

"body": "<html><body><h1>Test</h1></body></html>"

}

}

],

"predicates": [

{

"startsWith": {

"path": "/dokumente/download"

}

}

]

}

]

}

Page 40: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

μ-Service under Test Mountebank

#4: Mountebank - der Marktschreier

Page 41: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

#4: Täuscher auf Draht – Wiremock

• www.wiremock.org • Java-basiert • als Bibliothek einbinden • Konfiguration als

nativer Java-Methodenaufruf • kein Config-Port nötig

Page 42: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

#4: Täuscher auf Draht – Wiremock

Page 43: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Wer startet Wiremock?

Der Test Die Applikation

Page 44: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Wer startet Wiremock?

Der Test

• Mocks und Testfälle gehören logisch zusammen

• Separation von Testcode und Productioncode

Die Applikation

Page 45: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Wer startet Wiremock?

Der Test

• Mocks und Testfälle gehören logisch zusammen

• Separation von Testcode und Productioncode

• Kompliziertes Setup

Die Applikation

Page 46: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Wer startet Wiremock?

Der Test

• Mocks und Testfälle gehören logisch zusammen

• Separation von Testcode und Productioncode

• Kompliziertes Setup

Die Applikation

• Weniger Wartezeiten beim Hochfahren

• Weniger Konfigurations-aufwand

• Einfacheres Arbeiten lokal

Page 47: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #4: Mocking Services

www.wiremock.org

www.mbtest.org (Node.js)

github.com/dreamhead/moco

github.com/azagniotov/stubby4j

github.com/vcr/vcr (RUBY)

Page 48: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

#5 Doppelt hält besser!

Page 49: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

v3

v4

v2

v7

Problem #5: Versionierung & CD

Page 50: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Problem #5: Versionierung & CD

?

μ-Service A μ-Service B μ-Service C μ-Service D

Page 51: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #5: Doppelt hält besser!

Page 52: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Nur zwei Versionen

1. Die Produktive 2. Die Neue

-> Kein Versionsmanagement

Page 53: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Unbreak Changes

1. Altes Schema

{

„id“ : 9586729475,

„vorname“ : „Max“,

„nachname“ : „Mustermann“,

„name“ : „Max Mustermann“

}

Page 54: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Unbreak Changes

1. Altes Schema 2. Eine Zwischenversion:

altes UND neues Schema

{

„id“ : 9586729475,

„vorname“ : „Max“,

„nachname“ : „Mustermann“,

„name“ : „Max Mustermann“,

„displayName“ : „Max Mustermann“

}

Page 55: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Unbreak Changes

1. Altes Schema 2. Eine Zwischenversion:

altes UND neues Schema 3. Altes Schema ausbauen

{

„id“ : 9586729475,

„vorname“ : „Max“,

„nachname“ : „Mustermann“,

„name“ : „Max Mustermann“,

„displayName“ : „Max Mustermann“

}

Page 56: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #5: Doppelt hält besser

Wenn doch mal versehentlich zwei Services genau gleichzeitig ausrollen,

die nicht miteinander arbeiten können?

Page 57: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #5: Doppelt hält besser

• Small Changesets

Page 58: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #5: Doppelt hält besser

• Small Changesets • Echtes Continuous Deployment

Page 59: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #5: Doppelt hält besser

• Small Changesets • Echtes Continuous Deployment • Miteinander Reden!

Page 60: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #5: Doppelt hält besser - Variante 1

Page 61: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Trick #5: Doppelt hält besser - Variante 2

Page 62: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Die gekippte Pyramide

Page 63: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Tipps & Tricks

1. Postel‘s Law: Teste nicht zu detailliert

2. Drück‘ Dich aus: Abstrahiere mit Response-Objects

3. Production Code ist Test Code: Einfache Consumer Driven Tests

4. Täusche und Betrüge: Benutze Mocks für Downstream Dependencies

5. Doppelt hält besser: CDTS in der Deployment Pipeline

Page 64: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Zum Weiterlesen

• Mike Cohn: http://www.mountaingoatsoftware.com/blog/the-forgotten-layer-of-the-test-automation-pyramid

• Ian Robinson: Consumer-Driven Contracts: A Service Evolution Pattern http://martinfowler.com/articles/ consumerDrivenContracts.html

• Brandon Byars: Enterprise Integration Using REST http://martinfowler.com/articles/enterpriseREST.html

• Jay Fields: Working Effectively with Unit Tests https://leanpub.com/wewut

Page 65: Tipps & Tricks für das Testen von Microservices · Agenda •Traditionelle Testpyramide •Besondere Herausforderungen bei Microservices •Postel's Law für Tests •Drück‘ Dich

Tipps & Tricks

1. Postel‘s Law: Teste nicht zu detailliert

2. Drück‘ Dich aus: Abstrahiere mit Response-Objects

3. Production Code ist Test Code: Einfache Consumer Driven Tests

4. Täusche und Betrüge: Benutze Mocks für Downstream Dependencies

5. Doppelt hält besser: CDTS in der Deployment Pipeline