Testautomatisierung mit dem Robot Framework und Playwright Teil 2: Ein komplexer Testfall

🕒 Lesedauer: 8 Minuten

In der heutigen, schnelllebigen Welt, in der Unternehmen Software in immer kürzeren Zyklen bereitstellen müssen, wird ein Thema zunehmend entscheidend: Testautomatisierung. Schließlich soll die Software nicht nur zuverlässig und fehlerfrei funktionieren, sondern die Tests sollen auch möglichst wenig Zeit und Geld kosten.

Dennoch schrecken viele Teams vor diesem Thema zurück – oft aus Angst vor der Komplexität, insbesondere, wenn technische Vorkenntnisse fehlen. Genau hier kommt das Robot Framework ins Spiel. Dieses benutzerfreundliche, auf Open Source basierende Automatisierungs-Framework haben wir Ihnen bereits im ersten Teil unserer Blogserie „Testautomatisierung mit Robot Framework und Playwright Teil 1: Ein Überblick“ vorgestellt. Falls Sie diesen noch nicht gelesen haben, empfehlen wir, dort zu beginnen, um die Grundlagen des Tools kennenzulernen.

Im zweiten Teil dieser Serie tauchen wir tiefer ein: Wir zeigen Ihnen, wie Sie komplexere Testfälle meistern können und welche erweiterten Möglichkeiten das Robot Framework bietet, um Ihre Testautomatisierung auf das nächste Level zu heben.

 

1. Begrifflichkeiten

1.1 Headers

Bekommt man Zeilen dieser Art (*** Irgendein Text ***) zu Gesicht, handelt es sich dann um die sogenannten Header. Diese können mannigfaltig sein. So gibt es z.B. folgende:

  • *** Settings ***: Unter anderem Import von Bibliotheken und weiteren Metadaten
  • *** Variables ***: Setzen von globalen Variablen, die über alle Ebenen hin verfügbar sein sollen
  • *** Test Cases ***: Auflistung aller Testfälle in ihrer entsprechenden Reihenfolge bzw. Abfolge. Lässt sich als eine Art Inhaltsverzeichnis vorstellen
  • *** Keywords ***: Die eigentliche Durchführung der Testfälle unter der Nutzung von Keywords.

 

1.2 Variablen

Statt seine Werte ständig hard-codieren zu müssen, gibt es die Möglichkeit von Variablen. Dabei übergibt man einen Wert, der stets wiederverwendet werden soll, in eine Art Wertebehälter namentlich einer Variablen. Um eine Vorstellung davon zu bekommen hier ein kleines Beispiel:
${firstname}=Max
In dem Fall ist Max der Wert, der wiederverwendet werden soll. ${firstname} ist die Variable, in der der Wert Max verstaut werden soll. Beachten Sie dabei, dass die Variablenbezeichnung frei benannt werden kann, also statt ${firstname} kann es auch ${my-free-chosen-name} heißen. Es ist jedoch ratsam die Variablen so zu benennen, wofür sie auch bestimmt sind, um deren Nutzen auch schnell identifizieren zu können.

1.3 Keywords

Die menschenverständliche Sprache des Robot Frameworks wird durch vordefinierte sowie von dem Anwender anpassbare Keywords geprägt. Dabei ist zu beachten, dass die zu nutzenden Keywords davon abhängen, welche Bibliothek gerade importiert ist. Im Allgemeinen wird das Robot Framework für die Robotic Process Automation (RPA) genutzt, während es sich bei der Testautomatisierung um eine Unterkategorie vom RPA handelt.
Um kurz beispielhaft darzustellen welche Funktion einzelne Schlüsselwörter erfüllen, benutzen wir die Bibliothek von Playwright:

  • Click: Klicke auf ein Element
  • Fill Text: Schreibe einen Text in ein Feld
  • Select Options By: Wähle ein Element beispielsweise von einem Dropdown aus
  • Check Checkbox: Einchecken einer Checkbox

 

2. Ein komplexer Testfall mit dem Robot Framework

Wer den vorherigen Blog gelesen haben sollte, wird sich noch an den kleinen Code-Snippet erinnern, wie einfach es ist, schnelle erste Testfälle schreiben zu können. Da aber in der Realität in Produktion häufig komplexere Testfälle anzutreffen sind, soll in diesem Abschnitt ebenso einer präsentiert werden unabhängig der “Best-Practices“, da aktuell die diversen Möglichkeiten des Robot Framework vom Interesse sind.

Bei dem hier gezeigten Beispiel handelt es sich um einen E2E (End-To-End) Testfall für das Anlegen einer Flugzeug-Versicherung:

Image
Code für einen komplexeren Testfall mit dem Robot Framework

Zeile 1: Header für die Einstellungen
Zeile 2: Das Laden der zu nutzenden Bibliothek (in dem Fall die von Playwright)
Zeile 5: Header für die globalen Variablen
Zeile 6: Parametrisierung des Browsers, indem Chromium in ${BROWSER} gepackt wird
Zeile 7: Parametrisierung bzgl. “headed” oder “headless”, indem in dem Fall “false“ in ${HEADLESS} gepackt wird
Zeile 10: Header für die Testfälle
Zeile 11: Beschreibung, worum es in den darauffolgenden Testfällen geht
Zeile 12 - 18: Die Auflistung aller Testfälle in der entsprechenden Reihenfolge
Zeile 21: Festsetzung des Abschnitts für die Schlüsselwörter bzw. in dem Fall Beginn der Testfälle
Zeile 22: Beschreibung des ersten Testfalls
Zeile 23: Initialisierung der Browser-Instanz: Nutzung der Variable von Zeile 6 (in dem Fall Chromium) und der Variable von Zeile 7 (in dem Fall Headed)
Zeile 24: Initialisierung der Kontext-Instanz: Setzen des Locale auf die Region Deutschland
Zeile 25: Initialisierung der Startseite (in dem Fall http://dummysite.example.com/)
Zeile 27: Beschreibung des zweiten Testfalls
Zeile 28: Klicken auf das Element "Aviation"; schaue dabei von der Ebene div.main-navigation ausgehend nach dem Wert "Aviation" in den tieferliegenden Ebenen
Zeile 29: Auswählen der Option Dummyplane aus der Dropbox; suche dabei nach id=make und nach dem entsprechenden Text
Zeile 30: Fülle in das Textfeld den Wert 110000; suche dabei nach id=engineperformance zum Finden dieses Textfelds
Zeile 31: Fülle in das Textfeld den Wert 06/09/1989; suche dabei nach id=dateofmanufacture zum Finden dieses Textfelds
Zeile 32: Auswählen der Option 200 aus der Dropbox; suche dabei nach id=numberofseats und nach dem entsprechenden Text
Zeile 33: Auswählen der Option Petrol aus der Dropbox; suche dabei nach id=fuel und nach dem entsprechenden Text
Zeile 34: Fülle in das Textfeld den Wert 90000000; suche dabei nach id=listprice zum Finden dieses Textfelds
Zeile 35: Fülle in das Textfeld den Wert D-AABC; suche dabei nach id=licenseplatenumber zum Finden dieses Textfelds
Zeile 36: Fülle in das Textfeld den Wert 4000000; suche dabei nach id=annualmileage zum Finden dieses Textfelds
Zeile 37: Klicken auf Button Next; schaue dabei von der Ebene section[style="display: block;"] ausgehend nach dem Wert Next in den tieferliegenden Ebenen
Zeile 39: Beschreibung des dritten Testfalls
Zeile 40: Mitgabe von Argumenten [Arguments], nämlich des Vor- ${firstname}=Max und Nachnamens ${lastname}=Mustermann
Zeile 41: Fülle in das Textfeld den Wert Max, den wir uns dabei aus dem Argument von Zeile 40 ziehen; suche dabei nach id=firstname zum Finden dieses Textfelds
Zeile 42: Fülle in das Textfeld den Wert Mustermann, den wir uns dabei aus dem Argument von Zeile 40 ziehen; suche dabei nach id=lastname zum Finden dieses Textfelds
Zeile 43: Fülle in das Textfeld den Wert 03/31/1989; suche dabei nach id=birthdate zum Finden dieses Textfelds
Zeile 44: Wähle bei den Checkboxen die Option “Male“; schaue dabei von allen Ebenen label ausgehend nach id=gendermale in den tieferliegenden Ebenen
Zeile 45: Fülle in das Textfeld den Wert Test Street; suche dabei nach id=streetaddress zum Finden dieses Textfelds
Zeile 46: Auswählen der Option Germany aus der Dropbox; suche dabei nach id=country und nach dem entsprechenden Text
Zeile 47: Fülle in das Textfeld den Wert 12345; suche dabei nach id=zipcode zum Finden dieses Textfelds
Zeile 48: Fülle in das Textfeld den Wert Dummycity; suche dabei nach id=city zum Finden dieses Textfelds
Zeile 49: Auswählen der Option Employee aus der Dropbox; suche dabei nach id=occupation und nach dem entsprechenden Text
Zeile 50: Klicken der Checkbox mit dem Text Moonwalker
Zeile 51: Klicken auf Button Next; schaue dabei von der Ebene section[style="display: block;"] ausgehend nach dem Wert Next in den tieferliegenden Ebenen
Zeile 53: Beschreibung des vierten Testfalls
Zeile 54: Fülle in das Textfeld den Wert 06/09/1989; suche dabei nach id=startdate zum Finden dieses Textfelds
Zeile 55: Auswählen der Option 10.000.000,00 aus der Dropbox; suche dabei nach id=insurancesum und nach dem entsprechenden Text
Zeile 56: Auswählen der Option Bonus Plus aus der Dropbox; suche dabei nach id=meritrating und nach dem entsprechenden Text
Zeile 57: Auswählen der Option No Coverage aus der Dropbox; suche dabei nach id=damageinsurance und nach dem entsprechenden Text
Zeile 58: Wähle bei den Checkboxen die Option “Male“; schaue dabei von allen Ebenen label ausgehend nach id=EuroProtection in den tieferliegenden Ebenen
Zeile 59: Auswählen der Option Yes aus der Dropbox; suche dabei nach id=courtesyplane und nach dem entsprechenden Text
Zeile 60: Klicken auf Button Next; schaue dabei von der Ebene section[style="display: block;"] ausgehend nach dem Wert Next in den tieferliegenden Ebenen
Zeile 62: Beschreibung des fünften Testfalls
Zeile 63: Mitgabe von Argumenten [Arguments], nämlich der Preisoption ${price_option}=Silver
Zeile 64:  Klicken der Preisoption Silver; den wir uns dabei aus dem Argument von Zeile 63 ziehen; schaue dabei von allen Ebenen label ausgehend nach dem Wert Silver in den tieferliegenden Ebenen
Zeile 65: Klicken auf Button Next; schaue dabei von der Ebene section[style="display: block;"] ausgehend nach dem Wert Next in den tieferliegenden Ebenen
Zeile 67: Beschreibung des sechsten Testfalls
Zeile 68: Fülle in das Textfeld den Wert max.mustermann@example.com; suche dabei nach dem Text "E-Mail" und dem dazugehörigen Textfeld (input)
Zeile 69: Fülle in das Textfeld den Wert 0049201123456; suche dabei nach dem Text "Phone" und dem dazugehörigen Textfeld (input)
Zeile 70: Fülle in das Textfeld den Wert max.mustermann; suche dabei nach dem Text "Username" und dem dazugehörigen Textfeld (input)
Zeile 71: Fülle in das Textfeld den Wert SecretPassword123!; suche dabei nach dem Text "Password" und dem dazugehörigen Textfeld (input)
Zeile 72: Fülle in das Textfeld den Wert SecretPassword123!; suche dabei nach dem Text "Confirm Password" und dem dazugehörigen Textfeld (input)
Zeile 73: Fülle in das Textfeld den Wert Some comments; suche dabei nach dem Text "Comments" und dem dazugehörigen Textfeld (textarea)
Zeile 74 - 77: Parametrisierung eines Promise-Befehls (${promise}): Es soll auf eine Antwort der Seite http://dummysite.example.com/101/tcpdf/pdfs/quote.php gewartet werden, wobei ein Timeout von 10 Sekunden eingeräumt wird (timeout=10) 
Zeile 78: Klicken auf den Button "Send"
Zeile 79: Warten auf die Internetseite von Zeile 74 - 77, was wiederum in die Variable ${body} gepackt wird. 
Zeile 80: Loggen des status beim Aufruf der Internetseite
Zeile 81: Loggen des body beim Aufruf der Internetseite
Zeile 82: Warten auf den Zustand, wo die Nachricht "Sending e-mail success!" angezeigt wird
Zeile 83: Klicken auf den Button "OK"
Zeile 85: Beschreibung des siebten Testfalls
Zeile 86: Schließen von Context aus Zeile 24 
Zeile 87: Schließen von Browser aus Zeile 23

 

3. Testautomatisierung mit Robot Framework - eine Zusammenfassung

Wie wir aus diesem tiefergehenden Artikel sehen konnten, bietet das Robot Framework weitreichende Funktionen im Bezug auf E2E-Tests: So lassen sich mithilfe der Headers die Testdaten, wie entlang eines roten Fadens, übersichtlich strukturieren. Genauso ist die Nutzung von Variablen sehr intuitiv, wie auch die Nutzung der Schlüsselwörter. 
Anhand eines ausführlichen und komplexen Beispiels haben wir zudem den gesamten Flow eines E2E-Testfalls in Aktion gesehen, der Einblicke in die aktive Nutzung diverser Schlüsselwörter sowie der Identifizierung der jeweils zu suchenden Elemente in der jeweiligen DOM gibt. Dabei wurden auch Beispiele gezeigt, wie man mithilfe verschiedener Syntax ein und dasselbe Ziel erreichen kann. Zudem gab es einen ersten Überblick darüber, wie Argumente in den jeweiligen (Test)Methoden übergeben werden können. 
Natürlich bietet das Robot Framework einen wesentlich größeren Funktionsumfang, wie beispielsweise das Anlegen eigener Bibliotheken, was aber ein Gegenstand für weitere Blogbeiträge dieser Serie sein soll.

 

Weitere Artikel aus dieser Reihe: 

Testautomatisierung mit dem Robot Framework und Playwright Teil 1: Ein Überblick

 

Veröffentlicht am 07.Januar 2025

Aktualisiert am 10.Januar 2025

Valerius Schmidt

Junior Testautomation Engineer, Test Analyst

Ursprünglich als Sprachwissenschaftler für die antike sowie mittel und neuzeitliche Welt, war ich während und nach meiner aufbauenden Ausbildung zum Fachinformatiker für Anwendungsentwicklung in diversen Projekten in den Unternehmen wie der Trout GmbH und der fino digital GmbH involviert. Themenschwerpunkte waren dort zum einen die Softwareentwicklung, die Datenqualität sowie das Testen von Software und der Automatisierung. Seit August 2023 bin ich als Junior Testautomation Engineer und Test Analyst bei der Qytera GmbH tätig, wo mein Fokus aktuell auf dem Testen mit dem Automatisierungswerkzeug Playwright liegt.

Finden Sie weitere interessante Artikel zum Thema: