Um den Herausforderungen in Bezug auf API-Testing in unserem Kundenprojekt besser zu begegnen, haben wir einen Proof-of-Concept erarbeitet. Das gemeinsam erarbeitete Resultat versetzt Fachbereichsmitarbeiter und andere Stakeholder in die Lage, Anforderungen und Änderungswünsche in Form von Testfällen einzubringen. Das Setup besteht aus dem bereits in allen Unternehmensbereichen verwendete Jira, dem Jira-Plug-in Xray für Testmanagement, Karate als Testing-Framework, Jenkins als Automation Engine und Gherkin als domänenspezifische Sprache für die menschenlesbare Testfall-Spezifikation.
Projektmanagement mit Jira
Jira Software ist ein etabliertes Tool für bereichsübergreifendes kollaboratives Arbeiten mit Schwerpunkt auf Produktentwicklung und Projektmanagement. Es verfügt über zahlreiche Funktionen zur Planung, Prozessabbildung und Berichterstattung. Der größte Vorteil liegt dabei darin, verschiedene Teams zu vernetzen – Entwickler, Tester, IT-Betrieb und Product Owner. Auf diese Weise bildet sich ein geschlossener und einheitlicher Zyklus – von der Aufnahme der User-Storys über deren Entwicklung und Testing hinaus bis hin zur Auslieferung auf das produktive System. Der Prozess fließt automatisch, im Sinne von DevOps, von einer Rolle zur nächsten.
Die Flexibilität des Systems im Hinblick auf benutzerspezifische Prozesse und Informationen lässt sich auf individuelle Anforderungen und Prozesse adaptieren. Eine Fragestellung für die Teams unseres Kunden lag hier in der Ausarbeitung des Konzepts und der Vorbeugung möglicher Defizite in der Zukunft. Die einzelnen Teams arbeiteten bereits übergreifend erfolgreich mit Jira. Die wenigen Tester waren allein durch das Übersetzen der Anforderungen in Testfälle überlastet, was zu unvollständigen Tests führte. Außerdem war durch diese Situation kaum Kapazität für das Aufsetzen automatisierter API-Tests verfügbar. Diese Herausforderungen sind über ein enges Vernetzen der Teams mit zielgerichteter Kommunikation und dadurch weniger Transferleistung zu lösen.
Der Testprozess kann in Jira abgebildet werden, indem Teams interne Prozessabläufe (Workflows) definieren, spezielle Felder und Bildschirmmasken festlegen sowie ihre Scrum und Kanban Boards konfigurieren. Zudem lassen sich Informationen wie beispielsweise der Anteil fehlgeschlagener Tests in Testing-Dashboards visualisieren, wie der Screenshot in Abbildung 1 zeigt. Natürlich setzt die Ausarbeitung eines effektiven und lückenlosen Konzepts für den Testprozess viel Zeit und Expertise voraus. Um den Einarbeitungsaufwand zu reduzieren, ist es sinnvoll, bestehende Lösungen mit Jira-Erweiterungen auszubauen.
Abb. 1: Beispiel eines Testing-Dashboards in Jira
Testmanagement mit Xray
Xray erlaubt es, in Jira-Projekten Test, Test-Sets, Test-Plan, Test Pre-Condition und Test Execution als Vorgänge abzubilden. So ist es jedem Stakeholder möglich, in der gewohnten Jira-Umgebung Testfälle zu formulieren und diese mit User-Storys zu verlinken. Innerhalb des Vorgangs Test kann gewünschtes Verhalten als manueller Testfall formuliert werden oder als generischer Testfall in der Gherkin-Syntax. Unabhängig vom gewählten Format lassen sich die Tests mit einzelnen User-Storys in Jira verbinden. Der Screenshot in Abbildung 2 zeigt eine beispielhafte User-Story, welche mit zwei Tests (ID Juno-55 und Juno-66) verknüpft ist. Beide Tests wurden, erkennbar am Zustand PASS, erfolgreich ausgeführt. So ist die aktuelle Test-Abdeckung einer Story jederzeit ersichtlich.
Abb. 2: Beispiel einer User-Story für die Anforderungsabbildung in Jira
In manuellen Tests werden die Schritte, sowie die Voraussetzungen (Test Pre-Condition) für die Durchführung, direkt im Vorgang festgelegt und dokumentiert. Nach jedem ausgeführten Schritt wählt der Tester das Ergebnis aus: für bestandene Schritte den grünen Status, für durchgefallene den roten. Optional kann der Tester aus dem Test heraus einen Defekt (z. B. vom Vorgangstyp Bug) aufnehmen.
Testfall-Spezifikation mit Gherkin
Generische beziehungsweise automatisierte Tests in unserem Kontext sind in der Gherkin-Syntax formuliert, welche kaum Programmierkenntnisse erfordert. Der Fachbereich beschreibt mit dieser Domänen-spezifischen Sprache Wünsche und Ideen für das Verhalten der entwickelten Programmierschnittstelle in Jira. Diese werden gesammelt und iterativ mit dem Entwicklungsteam konkretisiert, um die Umsetzbarkeit und Mehrwert sicherzustellen. Anschließend übernimmt die Entwicklungsabteilung diese in einen Sprint.
Karate als Testing-Framework
Nach der Implementierung wird Karate genutzt, um Gherkin-Testfälle auszuführen und auszuwerten. Dieser Vorgang kann manuell erfolgen, lässt sich jedoch auch, wie bei uns, in Jenkins mittels eines eigenen Plugins automatisieren. In diesem Setup wird die Jenkins-Pipeline aus Jira heraus gestartet, bezieht notwendige Informationen, führt alle assoziierten Testfälle aus und legt die generierten Testergebnisse in einem Jira-Vorgang Test Execution ab. Die Testergebnisse stehen so direkt zur Dokumentation bereit und werden gegenüber der Qualitätssicherung als Nachweis für die Abnahme genutzt.
Zuletzt ermöglicht Xray die Generierung detaillierter Testberichte, zum Beispiel ein Bericht über die Rückverfolgbarkeit oder der in Abbildung 3 dargestellte Bericht über die Gesamtanforderungsabdeckung. Diese Berichte können mit der Such- und Filterfunktion näher spezifiziert werden und damit die für einen konkreten Fall relevante Information darstellen, zum Beispiel User-Storys, die durch Testfälle nicht abgedeckt sind.
Die abgespeicherten Filter werden für die Erstellung eines Dashboards verwendet. Letzteres dient als Übersichtsseite des aktuellen Status der Tests für den Product Owner und Tester. Mithilfe von Berichten und Grafiken wird das Dashboard zur „Single Source of Truth” für den Test-Fortschritt und auftretende Hindernisse.
Abb. 3: Beispiel eines Xray-Berichts über die Gesamtanforderungsabdeckung
Jenkins als Automation Engine
Zusammenfassend gesagt bietet Jira eine Vielzahl an Möglichkeiten, Testing-Prozesse zu unterstützen. Die Ausführung von automatisierten Gherkin-Testfällen ist direkt in Jira jedoch nicht möglich, weshalb uns zusätzlich Jenkins als Automation Engine und Karate als Testing-Framework dienen.
Die Gherkin-Syntax (siehe Abbildung 4) ähnelt einem deutschen oder englischen Fließtext, enthält aber genug implementierungsrelevante Details, um eine gemeinsame Kommunikationsgrundlage für technische und betriebswirtschaftliche Stakeholder zu bieten. Ziel der Gherkin-Tests ist die kontinuierliche Erweiterung und Verbesserung einer firmeninternen Programmierschnittstelle. Diese soll Mitarbeitern diverser Fachbereiche die Bearbeitung von Routineaufgaben erleichtern, indem die Programmierschnittstelle häufig benötigte Daten aggregiert und validiert.
Abb. 4: Beispiel eines Gherkin-Testfalls mit HTTP-Verben
Die Nutzung von Gherkin bietet dem Kundenprojekt vier wesentliche Vorteile:
- Die Testfälle dienen als gemeinsame Kommunikationsgrundlage zwischen technischen und betriebswirtschaftlichen Stakeholdern.
- Aspekte des Behavior-Driven Development (BDD) werden angewendet: Als primärer Benutzer der Programmierschnittstelle beschreibt der Fachbereich in Szenarien oder Akzeptanztests deren gewünschtes Verhalten. Die Programmierschnittstelle wird damit kundenorientierter entwickelt.
- Jeder gemeinsam formulierte Testfall enthält eine Beschreibung der Anforderungen und Abnahmekriterien, was Entwicklung und Testung erleichtern.
- Der Fachbereich und andere betriebswirtschaftliche Stakeholder tragen durch Testfälle von Anfang an zur Dokumentation und Entwicklung einer automatisierten Teststrategie bei und identifizieren sich mit „ihrer” Programmierschnittstelle.
Abbildung 5 illustriert unser Setup, dessen groben Ablauf und ausgewählte Details der technischen Umsetzung und Kommunikation zwischen dem Xray-Jira-Plug-in und der Jenkins-Pipeline. Dies ermöglicht sehr einfaches und schnelles Testen aus der gewohnten Jira-Umgebung heraus mit direkt anschließend dort dokumentierten Ergebnissen.
Abb. 5: Übersicht Setup und Ablauf mit Jira, Jenkins und Karate
Die benötigten Jenkins-Plug-ins sind dabei Cucumber, Cucumber Reports, Jira und Xray [Moll]. Das Herzstück des Setups ist die Jenkins-Pipeline, welche in unserer Implementierung auf einem sogenannten Free-Style-Profil basiert und aus drei Build-Schritten und einer Post-Build-Aktion besteht:
- (1) Xray Cucumber Features Export Task
- (2) Xray: Cucumber Features Import Task
- (3) Execute Shell
- (4) Xray Results Import Task
Innerhalb von (1) wird der Dateipfad festgelegt, unter dem die von Jira exportierten Dateien abgelegt werden. An dieser Stelle kann ein Übergabe-Parameter aus einem Webhook verwendet werden. In (2) ist ein Jira Project Key zu spezifizieren, um Zugriff auf dieses zu erlauben. Die Shell innerhalb von (3) bindet Karate über ein firmeninternes Repository ein, alternativ kann das offizielle GitHub-Repository [GitH] verwendet werden. An dieser Stelle wird festgelegt, an welchem Dateipfad und in welchem Format die Resultate einer Testdurchführung abzulegen sind.
In (4) wird die Testergebnisdatei in die Jira-Instanz gesendet, vorausgesetzt, das Format der Reports (z. B.: Cucumber JSON oder Xray JSON) und der Report-Zielpfad sind richtig konfiguriert. Um einen Systemwechsel von Jira zu Jenkins völlig zu vermeiden, lässt sich die Testdurchführung über einen Webhook aus Jira heraus starten. Dieser Webhook enthält Details des Jira-Vorgangs und übergibt diese als Parameter an die Jenkins-Pipeline. Der Webhook wird durch eine Folgefunktion im Jira-Prozessablauf bei einem vordefinierten Statusübergang ausgelöst.
Fazit
Jira ist ein effizientes Tool, um die Zusammenarbeit der Stakeholder und Teams zu unterstützen, bestehende unternehmensweite Abläufe abzubilden und eine automatisierte Teststrategie auszubauen. Dafür bietet sich das Xray-Plug-in an. In unserem Kundenprojekt wurde das Anbinden interner Programmierschnittstellen so erfolgreich etabliert. Die Schaffung und kontinuierliche Weiterentwicklung dieser frei zugänglichen und kundenorientiert entwickelten Schnittstellen kann durch eine enge interne Kollaboration zwischen technischen und nicht-technischen Stakeholdern sichergestellt werden. Die Nutzung von Gherkin als gemeinsame Sprache und das vorgestellte Setup unterstützen dieses Ziel. Karate und Jenkins fördern den Aufbau einer automatisierten Testdurchführung.
Die Integration aller Tools in den Testprozess ermöglicht es, den manuellen Aufwand stark zu minimieren. Als weiterer Vorteil erhöht sich durch diese Lösung die Transparenz dank der festgelegten Verantwortlichkeiten, Prozessnachverfolgung und Berichterstattung in einer allumfassenden Umgebung – Jira.
Weitere Informationen
[GitH]
https://github.com/intuit/karate
[Moll]
https://pmo-it.de/devops-mit-cucumber-jira-xray-frankfurt/