Schlagkräftige HTTP End-to-End Tests mit Karate
Problem: Aufwändiges E2E-Testing von HTTP-Endpunkten
E2E-Testing von HTTP-Endpunkten kann aufwendig werden, insbesondere wenn man mit elaborierten JSON- oder XML-Requests hantieren muss. Klar gibt es einige Frameworks wie Postman, Rest-Assured oder Spring MockMvc, aber die bringen zusätzliche Probleme wie Nachvollziehbarkeit von Änderungen, Aufsetzen der Umgebung, Verwalten der Testdaten, Ausführung der Tests und dem zugehörigen Reporting mit sich.
Lösung: Karate Framework mit direkter Unterstützung von JSON und XML
Karate ist ein Framework, um E2E-Tests geschmeidig umzusetzen mit direkter Unterstützung von JSON und XML für Requests und Validierung der Antworten sowie Interoperabilität mit Java und JavaScript. Testfälle werden semi-natürlich-sprachlich in Gherkin definiert – bei guten POs fallen diese direkt aus den Stories als Akzeptanzkriterien heraus! Testergebnisse werden in Reports zusammengefasst, welche den HTTP-Dialog und die Assertions enthalten. Mit ein wenig Zusatzaufwand kann man Tests wiederverwenden und Antworten vorhergehender Tests verwenden. Zusätzlich bringt Karate einen Mock-Server mit und kann sogar Lasttests durchführen.
Beispiel für End-to-End Tests mit Karate
Im folgenden Beispiel wird eine XML-Antwort überprüft, bei der die Reihenfolge keine Rolle spielt (vergleicht dazu mal die tatsächliche Antwort von mocky.io mit der Erwartung im Test).
Feature: jambit API
Scenario: Mission und Motto gemeinsam überprüfen
Given url "http://www.mocky.io/v2/5bd9ab282f00005c0006d262"
And header Accept = "application/xml"
When method get
Then status 200
And match response contains
"""
<jambit>
<mission>100% Begeisterung</mission>
<motto>Where innovation works</motto>
</jambit>
"""
Hier eine Testsuite, bei der zunächst die URL für die weiteren Testfälle gesetzt wird. Der parametrisierte Test überprüft stichprobenartig drei Erwartungen.
Feature: Users API
Background:
* url "https://jsonplaceholder.typicode.com/"
Scenario Outline: Given user ID, validate company name
Given path "users", <id>
When method get
Then status 200
And match response.company.name == "<companyName>"
Examples:
| id | companyName |
| 1 | Romaguera-Crona |
| 3 | Romaguera-Jacobson |
| 7 | Johns Group |
Weiterführende Aspekte
---
Autor
Alexandros Panagiotidis / Senior Software Architect / Standort Stuttgart
Zum Toilet Paper #103: Schlagkräftige HTTP End-to-End Tests mit Karate (pdf)