35
© 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced Testing ObjektForum Karlsruhe

Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Florian Ulrich, andrena objects ag

David Burkhart, andrena objects ag

Spring Boot Advanced Testing

ObjektForum Karlsruhe

Page 2: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Inhalt

• Unit- vs. Integration-Tests

• Rest-Clients

• WebMVC

• Cacheable

• Async

2

Page 3: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Unit- vs. Integration-Tests

Page 4: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Motivation

“Code without tests is bad code. It doesn't matter how well written it is; itdoesn't matter how pretty or object-oriented or well-encapsulated it is. Withtests, we can change the behavior of our code quickly and verifiably. Withoutthem, we really don't know if our code is getting better or worse.”

― Michael Feathers, Working Effectively with Legacy Code[1]

4

Page 5: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Test Pyramide

5

Unit

Tests

Integration

Tests

End To End

Tests

Page 6: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Bevorzuge Unit Tests

• Schnellere Tests

• Schnelleres Feedback

• Schnellere CI

• InfiniTest, Mutation Testing, …

• Billiger

• Robuster

• Verlässlicher

• Weniger Technologie

• einfachere Fehlersuche

6

Page 7: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

HowTo: Erkennen von Integration Tests

• Spring Runner bzw. Extension

7

@ExtendWith(SpringExtension.class)class SwaggerTest {

...}

@SpringBootTestclass SwaggerTest {

...}

@RunWith(SpringRunner.class)public class SwaggerTest {

...}

Page 8: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Best Practices für Injection in Spring Boot

• Spring bevorzugt Constructor Injection im Code. Benutze kein @Autowired auf Feldern im Anwendungs-Code. Felder im Testcode zu autowiren ist okay

• Junit5 Feature: Konstruktoren für Tests

• Junit5 Feature: Methoden mit Parametern

8

@RestControllerpublic class StarshipBookingController {

private final StarshipBookingService bookingService;

@Autowiredpublic StarshipBookingController(StarshipBookingService bookingService) {

this.bookingService = bookingService;}

Page 9: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Wann sind Integration Tests sinnvoll?

Benutze Spring Tests für technische Aspekte, wie z. B.:

• Http Calls

• Web Controller, Security

• JSON Mapping

• Database layer

➢ Konsequenz: Controller, Daos, … beinhalten keine Business Logik

9

Page 10: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Rest-Clients

Page 11: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Kommunikation mit REST-Services über RestTemplate

• Erinnerung: Trennung von Business Logik und Rest Kommunikation

• Reiner Unit-Test vs. Spring-Integration-Test

• Technische Aspekte

• Was wird übermittelt (Daten -> Mapping)

• i.d.R. JSON, Mapping per default mit Jackson

• Wie wird es übermittelt (HTTP)

➢ Beides kann und sollte getestet werden

11

Page 12: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Mapping testen - Demo

12

Page 13: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Mapping testen mit @JsonTest

• Lege mindestens ein Beispiel aller Arten von Requests und Responses ab

• Teste gemappte POJOs dagegen (read -> write -> assertEqual)

• Alle Felder müssen gemappt sein

• In der Anwendung ignorierte Felder können Object sein

• Falls nicht möglich, mit Map testen oder nur read

• Refactoring wird möglich!

• Verwende JsonPath-Definitionen sparsam

• Brechen bei Änderungen der Datenstrukturen

• Aktualisiere abgelegte Beispiele automatisiert

• z.B. gegen fremdes Testsystem (evt. instabil!)

• Benachrichtigung über Änderungen könnte ausreichen

13

Page 14: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

HTTP Kommunikation testen - Demo

14

Page 15: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

HTTP Kommunikation testen mit MockRestServiceServer

• Teste HTTP-Kommunikation

• HTTP Status, Header, Parameter, Authentifizierung, …

• Verwende ObjectMapper für Request-Body

• Schreibe Builder für Daten-Objekte frühzeitig

• Alternativ: eingecheckte JSON Beispiele, falls z.B. einfach gültige Antwort benötigt

• Asserte nur relevante Teile der Anwort

15

Page 16: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Goodies

• Wiremock oder einfacher HTTP Mock für Fremdsystem für manuelle Tests

• Antworten liegen schon vor

• Samples evt. um fachliche Varianten ergänzen

• Änderungen am Fremdsystem werden erkannt

• Man kann Beispiele schnell und einfach anschauen, da eingecheckt

• Diff über verschiedene Versionen der eigenen Anwendung

• Einfach auf JSON Dateien einschränkbar

• git diff 1.0..1.1 -- test/resources/*.json

16

Page 17: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

WebMVC

Page 18: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Eigene Schnittstellen mit WebMVC anbieten

• Erinnerung: Trennung von Business Logik und Schnittstellen-Logik

• Reiner Unit-Test vs. Spring-Integration-Test

• Technische Aspekte

• Was wird übermittelt (Daten -> Mapping)

• Auch hier lohnt es sich Beispiele abzulegen und dagegen zu testen

• Wie wird es übermittelt (HTTP)

18

Page 19: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

WebMVC Controller testen - Demo

19

Page 20: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

WebMVC Controller testen mit MockMvc

• Achtung bei MockBean: Kein strikter Mock

• Falls Parameter o.ä. nicht passen -> null

• Bei seltsamen Fehlern als erstes prüfen

• Tipp (Eclipse): Import Favorites auf MockMvc Factories

• Duplikation im Test entfernen

• Für Rückgabe-Objekte lohnt es sich, Builder anzulegen

• Details anschauen: .andDo(MockMvcResultHandlers.print())

• org.springframework.mock.web

• Hilfsklassen, nützlich z.B. um Filter oder Scoped Beans zu testen

• MockHttpServletRequest, MockHttpServletResponse, MockHttpSession, …

20

Page 21: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

WebMVC Security testen mit MockMvc – Demo

21

Page 22: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

WebMVC Security testen mit MockMvc

• Security kann und sollte getestet werden

• Properties im Test passend wählen

• Weitere Themen, wie csrf, jwt:

• SecurityMockMvcRequestPostProcessors

22

Page 23: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Swagger-Definition testen - Demo

23

Page 24: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Swagger-Definition testen mit MockMvc

• Swagger-Info kann im MockMvc-Test erzeugt werden!

• Test gegen eingecheckte Definition erkennt Änderungen

• Macht Änderungen von Schnittstellen explizit

• Bei false positives einfach die Datei aktualisieren

• Bessere Meldung im Fehlerfall mit SwaggerDiff

• Ermöglicht diff über verschiedene Releases aus dem Repo heraus

• git diff 1.0..1.1 – test/resources/swagger-definition.json

24

Page 25: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Cacheable

Page 26: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Performance-Boost mit Caching

• Technische Aspekte

• Funktioniert das Caching?

• Wie lange wird gecached?

• Wie viele Requests werden gecached?

• Welche Parameter werden berücksichtigt?

➢ Funktionsfähigkeit testen

➢ Anderes nur testen, falls es sinnvoll ist

26

Page 27: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Caching Demo

27

Page 28: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Performance-Boost mit Caching

• Caching Tests lohnen sich unter anderem wegen equals (und hashCode) bei Objekten als Parameter

• Benutze (fehlende) Mock-Interaktionen, um Caching zu testen

• Aufräumen des Caches nicht vergessen (sonst Seiteneffekte!)

• Für Funktionsfähigkeitstest Time To Live niedrig setzen (FIRST)

28

@Autowiredprivate CacheManager cacheManager;

@AfterEachvoid clearCache() {

cacheManager.getCache("bookable-starships").clear();}

Page 29: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Async

Page 30: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Async Testing

• Wird der Call wirklich async ausgeführt?

30

Page 31: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Async Testing - Demo

31

Page 32: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Fazit

• Spring bietet Features für Tests mit Context

• Profile, Properties, MockBeans, etc.

• Module wie WebMVC, Security, … bieten eigenen Support

• Spring Dokumentation zu Testing lohnt sich!

• Testen technischer Aspekte wird sehr einfach und lohnt sich

• Fehler bei der Konfiguration und im Setup werden vor der Laufzeit aufgedeckt

• Synergien möglich

• Mock-Server als Fremdsystemersatz (-> JSON von Tests)

• Schnittstellen-Doku im Repository (-> Swagger im Projekt eingecheckt)

32

Page 33: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Links

• Spring Framework Reference: Testing

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html

https://docs.spring.io/spring-security/site/docs/current/reference/html/test.html

• Testing Spring Boot Applications - Phil Webb

https://www.youtube.com/watch?v=QjaoAWLlGGs

• Star Wars API: https://swapi.co/

33

Copyright and stuff?Star Wars and all associated names are copyright Lucasfilm ltd.This project is open source and carries a BSD licence.All data has been freely collected from open sources such as Wookiepedia.

Page 34: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering

Quellen

[1] Feathers, Michael. Working Effectively with Legacy Code: WORK EFFECT LEG CODE _p1. Prentice Hall Professional, 2004.

34

Page 35: Spring Boot Advanced Testing © 2019 andrena objects ag Experts in agile software engineering Florian Ulrich, andrena objects ag David Burkhart, andrena objects ag Spring Boot Advanced

© 2019 andrena objects ag

Experts in agile software engineering35