spring boot advanced testing © 2019 andrena objects ag experts in agile software engineering...
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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/1.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/2.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/3.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/4.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/5.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/6.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/7.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/8.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/9.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/10.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/11.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/12.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/13.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/14.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/15.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/16.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/17.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/18.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/19.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/20.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/21.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/22.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/23.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/24.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/25.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/26.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/27.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/28.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/29.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/30.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/31.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/32.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/33.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/34.jpg)
© 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](https://reader033.vdocument.in/reader033/viewer/2022060220/5f06f4c97e708231d41a9365/html5/thumbnails/35.jpg)
© 2019 andrena objects ag
Experts in agile software engineering35