Top Banner
© 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
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

Jun 14, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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