Software-Test / Testautomatisierung

Keywords, Clients, Generatoren – wovon reden wir überhaupt?

Während der Entwicklung unseres Advanced Automation Approaches haben sich einige Begriffe und Konzepte etabliert, welche sich in der Praxis bewährt haben. Manche davon, wie etwa „Keyword Driven Testing“, sind vielen bereits bekannt. Andere, wie „Clients“ und „Datengeneratoren“, bedürfen da vielleicht schon mehr Erklärung. Auch die richtige Wahl des passenden Applikationslayers sollte bedacht werden. Um hier für einen besseren Überblick zu sorgen, möchte ich näher auf die Ideen, die hinter diesen Konzepten stecken eingehen und deren Vorteile aufzeigen.

(c)Fotolia

Keyword driven testing

Man kann bestimmte technische Aktionen, wie das Befüllen von Textfeldern und das Klicken von Buttons, zu fachlichen Aktionen zusammenfassen. Werden diese anschließend in Testfällen verwendet, hat dies gleich mehrere Vorteile!

Nun wollen wir zum Beispiel das Anlegen von neuen Kundinnen und Kunden in unserer CRM-Applikation testen. Wir befinden uns noch früh im agilen Entwicklungsprozess, eine Eingabe von mehr Daten als Vor- und Zuname sowie das Geburtsdatum, ist noch nicht möglich.

Ohne Keywords könnte ein typischer Testfall zur Anlage, unter der Annahme, dass die Applikation bereits geöffnet ist, folgendermaßen aussehen:

  1. Finde Element mit der ID „kundenverwaltung“ und klicke es
  2. Finde Element mit der ID „neuekunden“ und klicke es
  3. Finde Element mit der ID „vorname“ und tippe „Petra“ ein
  4. Finde Element mit der ID „nachname“ und tippe „Muster“ ein
  5. Finde Element mit der ID „geburtstag“ und tippe „01.01.1980“ ein
  6. Finde Element mit der ID „anlegen“ und klicke es
  7. Überprüfe, ob Element mit der ID „message“ vorhanden ist
  8. Überprüfe, ob Element mit der ID „message“ das Klassenattrribut „success“ besitzt
  9. Überprüfe, ob Element mit der ID „message“ den Text „Petra Muster wurde erfolgreich angelegt“ enthält

Solche Tests findet man häufiger als gedacht. Diesem Muster entsprechen auch die meisten Testfälle, die durch diverse Tools generiert werden.

Hoffentlich werden hinter den Feldern jedoch auch Validierungen stecken, die es ebenfalls zu testen gilt. Ungültige Geburtsdaten dürfen genauso wenig gespeichert werden wie zu kurze oder zu lange Vor- und Nachnamen. Ist der Gutfall bereits geschrieben, würden sich daraus also einfach 5 weitere Negativfälle ableiten lassen. Da die Anpassungen jedoch nur in den eingegebenen Werten und dem zu überprüfenden Text notwendig sind, ist die Wahrscheinlichkeit hoch, dass der Test einfach 5 weitere Male kopiert wird.

Kommen zu einem späteren Zeitpunkt Felder für Firmenname und Adresse, bestehend aus Straße, Hausnummer, Postleitzahl, Stadt & Staat hinzu, müssen diese 7 Felder in den bestehenden 6 Testfällen zusätzlich befüllt werden. Sollen auch hier die Feldvalidierungen überprüft werden, wird Copy/Paste erneut zum besten Freund.

Hat man bereits etwas Erfahrung im Programmieren, sieht man schnell, dass sich hier der Einsatz von Funktionen oder Methoden anbietet. Und genau diese werden verwendet, um Keywords zu modellieren. Schritt 1 und 2 ließen sich als „Navigiere zur Kundenanlage“ zusammenfassen, Schritt 3 – 6 als „Lege Kunde an“ und Schritt 7 – 9 als „Überprüfe Nachricht“:

Lege Kunde an

  1. Finde Element mit der IDs „vorname“ und tippe [vorname] ein
  2. Finde Element mit der IDs „nachname“ und tippe [nachname] ein
  3. Finde Element mit der IDs „geburtstag“ und tippe [geburtsdatum] ein
  4. Finde Element mit der IDs  „anlegen“ und klicke es

Mit diesen Keywords wäre ein Negativtestfall für ein ungültiges Datum nun deutlich kürzer:

  1. Navigiere zur Kundenanlage
  2. Lege Kunde an: Vorname „Petra„, Nachname „Muster„, Geburtsdatum „29.02.2015
  3. Überprüfe Nachricht: Art „error„, Enthaltener Text „Ungültiges Datum

 

Der Testfall besitzt nun nicht nur deutlich weniger Schritte, sondern die durchgeführten Aktionen sind auch auf einem Blick erkennbar. Die Lokalisierungsmechanismen in diesen Beispiel-IDs, befinden sich nicht mehr in den Testfällen. Daraus ergibt sich neben der besseren Lesbarkeit des Tests der größte Vorteil: verbesserte Wartbarkeit.

Solange der Testfall Relevanz besitzt, also solange die Funktionalität des Anlegens von Kunden besteht, kann dieser in seiner derzeitigen Form weiterverwendet werden. Bekommt die Kundenanlage einen neuen Überpunkt und muss anders erreicht werden? Werden IDs umbenannt? Muss vor der Eingabe der Kundendaten ein weiterer Button geklickt werden? Ändert sich etwas an der Überprüfung der Erfolgs- oder Fehlernachrichten? Statt einer fehleranfälligen und aufwändigen Überarbeitung ALLER Testfälle ist nur das jeweilige Keyword anzupassen.

Um die Keywords allen Testfällen zur Verfügung zu stellen, bieten sich eigens dafür geschaffene Klassen an. Martin Fowler schlägt etwa den Ansatz der Page Objects vor.

 

Clients

Wenn im Zusammenhang mit A2A von Clients gesprochen wird, sind Anbindungen an diverse Technologien gemeint, die aus den Keywords heraus verwendet werden. So kann es jeweils einen Client für HTML über Selenium geben, einen Client für die Kommunikation mit der Datenbank, einen Client für REST-Aufrufe, …

Im Falle des HTML/Selenium-Clients können hier etwa Funktionalitäten zum Auslesen von Tabellen implementiert werden, es empfiehlt sich aber auch ein Wrapper um die WebDriver-API, welche dann aus den Keywords heraus verwendet wird. Dieser Wrapper besitzt wenig Logik und wird die meisten Aufrufe lediglich an den verwendeten WebDriver weiterleiten. Was anfangs vielleicht nach unnötiger Abstraktion und Schreibarbeit wirkt, macht sich spätestens bei einem Wechsel des Automatisierungstools bezahlt: da die Keywords lediglich den selbst geschriebenen Wrapper benutzen, können sie im besten Fall unverändert bleiben. Lediglich im Wrapper muss das alte mit dem neuen Tool ausgetauscht werden.

Diese Zwischenschicht macht bei allen externen Technologien und Frameworks Sinn, besonders wenn zusätzlich zur Anbindung der Technologie noch andere Funktionalitäten Sinn ergeben – etwa das einfachere Setzen von HTTP-Headern bei einer REST-Bibliothek, bessere Transaktionskontrolle bei einer Datenbankanbindung, etc…

 

Keywords für verschiedene Applikationslayer

Die drei gebräuchlichsten Wege, um mit Webapplikationen zu interagieren, sind über die verwendete Datenbank, über HTTP oder direkt über die Benutzeroberfläche. Für jeden Layer der Applikation lassen sich Keywords schreiben, die die entsprechenden Clients zur Kommunikation verwenden. So könnte es z.B. Keywords zur Anlage eines Kunden über die Oberfläche geben, aber auch durch das Simulieren der HTTP-Requests, die durch die Oberfläche erzeugt werden würden. Von schreibenden Zugriffen in der Datenbank ist für fachliche Aktionen generell eher abzuraten, da hier sehr leicht inkonsistente Zustände erreicht werden können.

Stehen nun unterschiedliche Keywords für unterschiedliche Layer zur Verfügung, kann dies die Testdurchführung erheblich unterstützen. So kann etwa die Anlage eines neuen Kundens ein sehr häufiger Geschäftsfall sein, der in jedem Test durchzuführen ist. In Testfällen, die als Testziel die Überprüfung der UI-Funktionalität haben, können so die jeweiligen UI-Keywords verwenden. In allen anderen Testfällen, wo die Anlage eines Kunden lediglich eine Vorbedingung darstellt, kann mit der Applikation direkt über HTTP kommuniziert werden. So werden die Testfälle nicht nur deutlich stabiler, sondern auch merkbar schneller!

 

Datengeneratoren

Die Ausführungsreihenfolge von Testfällen sollte unabhängig voneinander sein – daraus ergibt sich, dass ein Testfall das System nach Durchführung in einem sauberen Zustand hinterlassen soll. Je nach getesteter Applikation können hier die Anforderungen variieren. Es kann genügen, wenn alle offenen, dem Kunden zugeordneten Aufträge abgeschlossen werden, oder der Kunde muss nach Testdurchführung wieder komplett entfernt werden.

Die Aufgabe von Datengeneratoren, auch Testdatengeneratoren oder Testdatenprovider genannt, ist nun eben die Anlage von benötigten Testdaten, aber auch das automatische „Aufräumen“ am Ende eines Testfalles. Um dies zu gewährleisten, sind Datengeneratoren häufig ähnlich zu bestehenden Keywords, allerdings mit dem Unterschied, dass sie das Wissen darüber besitzen, welche Aktionen durchgeführt wurden und wie diese zu bereinigen sind. Nach Möglichkeit sollten Datengeneratoren nicht über das normale User Interface kommunizieren, sondern eher wieder „niedrigere“ Applikationslayer wählen.

In vielen Fällen ist die genaue Ausprägung von Testdaten nicht relevant – man benötigt einen gültigen Kunden, der im System vorhanden ist, das Geburtsdatum sowie der Name spielt jedoch keine weitere Rolle. Deshalb sollten Datengeneratoren möglichst flexibel konfigurierbar sein: es sollte sowohl möglich sein, alle jeweiligen Daten genau anzugeben, oder auch Standarddaten aus einer Konfiguration zu laden. Hier empfiehlt sich besonders der Einsatz von Builder patterns.

 

Klassisch vs. Keyword, Clients & Generatoren

Um den Unterschied zu verdeutlichen, will ich nun nochmal zwei Testfälle gegenüberstellen. Beide testen die Anlage und Zuordnung von Aufträgen zu Kunden. Die Tabelle links zeigt die „klassische“ Art Testfälle zu schreiben, rechts die Möglichkeit unter Verwendung von Keywords, Clients & Generatoren.

 

  1. Finde Element mit der ID „kundenverwaltung“ und klicke es
  2. Finde Element mit der ID „neuekunden“ und klicke es
  3. Finde Element mit der ID „vorname“ und tippe „Petra“ ein
  4. Finde Element mit der ID „nachname“ und tippe „Muster“ ein
  5. Finde Element mit der ID „geburtstag“ und tippe „01.01.1980“ ein
  6. Finde Element mit der ID „anlegen“ und klicke es
  7. Finde Element mit der ID „auftragsverwaltung“ und klicke es
  8. Finde Element mit der ID „neueauftraege“ und klicke es
  9. Finde Element mit der ID „kundenname“ und tippe „Petra Muster“ ein
  10. Finde Element mit der ID „auftragsname“ und tippe „Testauftrag“ ein
  11. Finde Element mit der ID „auftragsbeschreibung“ und tippe „Testbeschreibung“ ein
  12. Finde Element mit der ID „bearbeiter“ und tippe „Max Muster“ ein
  13. Finde Element mit der ID „anlegen“ und klicke es
  14. Überprüfe, ob Element mit der ID „message“ vorhanden ist
  15. Überprüfe, ob Element mit der ID „message“ das Klassenattribut „success“ besitzt
  16. Überprüfe, ob Element mit der ID „message“ den Text „Auftrag erfolgreich angelegt“ enthält

Aufräumen!

  1. Finde Element mit der ID „kundenverwaltung“ und klicke es
  2. Finde Element mit dem Text „Petra Muster“ und klicke es
  3. Finde Element mit der ID „loeschen“ und klicke es

 

  1. Lasse Standardkunden anlegen und merke ihn
  2. Navigiere zur Auftragsanlage
  3. Lege Auftrag an: Kunde „Standardkunde, Name „Testauftrag„,
    Beschreibung „Testbeschreibung„, Bearbeiter „Max Muster
  4. Überprüfe Nachricht: Art „success„, Enthaltener Text „Auftrag erfolgreich angelegt

Fazit

Bei einem größeren Testteam lässt sich das Schreiben der Keywords und der Testfälle auch gut aufteilen! So kann eine Person sich auf das Ausdenken möglichst guter Testfälle konzentrieren, während eine andere Person die notwendige Infrastruktur, inklusive Keywords und Datengeneratoren, bereitstellt. Vor allem Datengeneratoren können auch für manuelle Tests äußerst hilfreich sein.

Durch den Einsatz von Keywords, Clients und Datengeneratoren lassen sich also folgende Vorteile erreichen:

  • Übersichtlichere & kürzere Testfälle
  • Wiederverwendbarkeit von Codeteilen
  • Geschwindigkeitsvorteil & höhere Stabilität über eine geeignetere Wahl der Applikationslayer
  • Auch wenn mit einer Programmiersprache automatisiert werden muss, ist das notwendige Wissen für das Schreiben von Testfällen überschaubar
  • Geringer Aufwand bei Änderungen der Applikation (Wechsel der Struktur oder IDs)
  • Geringer Aufwand bei Austausch der verwendeten Testtools

Schreiben Sie nachhaltige Testautomatisierung – Sie werden es nicht bereuen!

 

Passende Artikel

Kommentare gesperrt.