Mit Klick auf den Play-Button laden Sie ein Video von unserem externen Anbieter YouTube. Datenschutzerklärung

Who ya gonna call? Prozeduraufrufe automatisch erzeugen für saubere und wartbare Tests

In diesem Webinar zeigen wir Ihnen, wie QF-Test 11 beim Aufnehmen von Sequenzen dazu passende Prozeduren aus Ihrer Bibliothek erkennen und entsprechende Aufrufe automatisch einfügen kann.

Den gleichen Mechanismus können Sie auch nutzen, um bestehende Testfälle automatisiert aufzuräumen und einzelne Knoten durch strukturierte Prozeduraufrufe zu ersetzen. Das sorgt für saubere Tests und konsequente Wiederverwendung.

Transkript

Daniel Rieth, QF-Test Softwareentwickler
Ute Erler, QF-Test Softwareentwicklerin und Hauptverantwortliche hinter dem Prozeduraufnahmen-Feature

Das Problem

Bei der Erstellung neuer Tests entstehen häufig lange Folgen aus Mausklicks, Eingaben, Checks und weiteren QF-Test-Knoten. Gleichzeitig existieren oft bereits sorgfältig erstellte Prozeduren, die Edge Cases berücksichtigen, für zuverlässige Testabläufe sorgen und die Wartbarkeit verbessern.

In einem verteilten Team ist jedoch nicht gewährleistet, dass Testautoren diese vorhandenen Prozeduren kennen und verwenden. Ohne Unterstützung entstehen deshalb Testfälle, die dieselbe Logik erneut als einzelne Knoten abbilden.

Die Prozeduraufrufaufnahme löst dieses Problem, indem Knotenfolgen automatisch in bereits vorhandene Prozeduren umgewandelt werden können. Dies ist sowohl während der Aufnahme als auch nachträglich durch eine Konvertierung möglich.

Der wesentliche Vorteil besteht darin, dass die vorhandenen Prozeduren tatsächlich verwendet werden. Änderungen an der zugrunde liegenden Funktionalität müssen dadurch nur an der Prozedur vorgenommen werden und nicht in jedem einzelnen Test.

Funktionsweise

Das Feature besteht im Wesentlichen aus drei Komponenten:

Prozeduraufrufdefinition

Die Prozeduraufrufdefinition beschreibt die charakteristischen Aktionen einer Prozedur. Sie legt fest, welche Knotenfolge als Aufruf dieser Prozedur erkannt werden soll.

Die Definition wird in einer YAML-Notation beschrieben und kann detailliert konfiguriert werden. Dadurch lässt sich festlegen, welche Knoten erwartet werden, in welcher Reihenfolge sie auftreten müssen, welche davon optional sind und unter welchen Bedingungen ein Knoten als passend gilt.

Konvertierungsfunktion

Die Konvertierungsfunktion vergleicht aufgenommene oder bereits vorhandene Knotenfolgen mit den Prozeduraufrufdefinitionen.

Wird eine passende Definition gefunden, ersetzt QF-Test die entsprechenden Einzelknoten durch den Aufruf der definierten Prozedur. Auf diese Weise wird beispielsweise aus einer Folge von Mausklicks und Eingaben ein einzelner Prozeduraufruf mit den entsprechenden Parametern.

Aufnahmeprotokoll

Das Aufnahmeprotokoll unterstützt insbesondere beim Erstellen und Debuggen von Prozeduraufrufdefinitionen. Es zeigt, welche erwarteten Knoten erkannt wurden und an welcher Stelle eine Definition nicht mehr mit der tatsächlichen Aufnahme übereinstimmt.

Damit lässt sich nachvollziehen, warum eine Definition nicht gegriffen hat und welche Anpassung erforderlich ist.

Einfache Prozeduren automatisch erkennen

Als erste Demonstration wird eine Anwendung zur Berechnung der Grundsteuer verwendet. Darin existieren bereits Prozeduren zum Öffnen und Abbrechen des Dialogs zum Anlegen eines Betriebs.

Eine normale Aufnahme würde lediglich die entsprechenden Mausklicks enthalten. Über Weitere Knotenoperationen → Knoten erneut als Prozeduraufrufe aufnehmen können diese Knoten jedoch nachträglich in die vorhandenen Prozeduren umgewandelt werden.

Die zugehörigen Prozeduraufrufdefinitionen lassen sich direkt aus den vorhandenen Prozeduren erzeugen. Für kurze und eindeutige Prozeduren funktioniert diese automatische Generierung häufig ohne weitere Anpassungen.

Die Demonstration zeigt außerdem, dass Prozeduraufrufe bereits während der Aufnahme erzeugt werden können. Dafür wird die Prozeduraufrufaufnahme aktiviert. Die aufgenommenen Aktionen werden dann direkt gegen die vorhandenen Prozeduraufrufdefinitionen geprüft.

Prozeduraufrufdefinitionen und das Aufnahmeprotokoll

Eine automatisch erzeugte Definition beschreibt unter anderem:

  • die zugehörige Prozedur,
  • ihre Priorität,
  • die erwartete Reihenfolge der Knoten,
  • die erwarteten Komponenten und Events,
  • optionale Knoten und
  • gegebenenfalls Prozedurparameter.

Eine einfache Definition kann beispielsweise einen Mausklick auf einen bestimmten Button erwarten.

Komplexere Prozeduren lassen sich ebenfalls beschreiben. Wird beispielsweise nach dem Klick auf einen Abbrechen-Button optional noch ein Button zum Verwerfen von Änderungen angezeigt, kann dieser zweite Schritt als optional definiert werden.

Das Aufnahmeprotokoll macht sichtbar, wie diese Definition abgearbeitet wird: Zunächst muss der erwartete Abbrechen-Button gefunden werden; anschließend kann der optionale Klick auf den Button zum Verwerfen der Änderungen folgen.

Komplexere Definitionen mit Conditions und Placeholders

Nicht jede automatisch erzeugte Definition ist sofort robust genug. Als Beispiel dient eine Prozedur zum Ändern der Sprache.

Die Oberfläche enthält zwei mögliche Toggle Buttons, einen für Deutsch und einen für Englisch. Die automatische Generierung erkennt diese zunächst als mögliche Alternativen und bildet sie als Choice Group ab.

In der Demo zeigt sich jedoch, dass die tatsächlich verwendeten Komponenten nicht exakt mit den automatisch erzeugten Definitionen übereinstimmen. Ursache ist unter anderem, dass sich die ID der Komponente abhängig vom aktuellen Zustand verändert.

Die Definition kann deshalb verfeinert werden. Statt ausschließlich die ID zu verwenden, lässt sich beispielsweise die Class der Komponente heranziehen. Dadurch kann die Definition zunächst allgemein einen Toggle Button erkennen.

Für eine noch präzisere Unterscheidung werden Conditions verwendet. Eine Condition kann beispielsweise prüfen, ob die ID einer Komponente mit einem bestimmten Text beginnt.

Dabei kommen Placeholder zum Einsatz. Sie stellen während der Aufnahme konkrete Eigenschaften des gerade verarbeiteten Knotens zur Verfügung, beispielsweise die ID einer Komponente. Diese Werte können innerhalb einer Condition verglichen oder als Prozedurparameter ausgegeben werden.

Damit kann eine Definition beispielsweise unterscheiden, ob der deutsche oder der englische Toggle Button verwendet wurde, und entsprechend de oder en als Prozedurparameter erzeugen.

Prozedurparameter automatisch aufnehmen

Prozeduraufrufdefinitionen können nicht nur erkennen, dass eine Prozedur verwendet wurde, sondern auch die während der Aufnahme verwendeten Parameter übernehmen.

Dazu wird im entsprechenden Knoten Set Procedure Call Parameter verwendet. Aufgenommene Werte können so automatisch aus den Text- oder Auswahlaktionen extrahiert und als Parameter des Prozeduraufrufs weitergegeben werden.

Das ermöglicht beispielsweise einen Sprachparameter, der aus der tatsächlich angeklickten Komponente abgeleitet wird.

Die verschiedenen Gruppen

Erwartete Knoten werden innerhalb von Gruppen organisiert. Drei Gruppen sind besonders relevant.

Sequential Group

Eine Sequential Group erwartet ihre Knoten in einer bestimmten Reihenfolge.

Beispielsweise kann eine Definition erwarten:

  1. einen Mausklick,
  2. eine Texteingabe und
  3. anschließend einen Check.

Die Reihenfolge ist dabei relevant. Für einzelne Knoten können Wiederholungen definiert werden. Ein Knoten kann außerdem als optional markiert werden.

Ein optionaler Knoten entspricht im Wesentlichen einem Repeat-Bereich, der auch null Vorkommen zulässt.

Choice Group

Eine Choice Group beschreibt mehrere mögliche Alternativen. Es wird erwartet, dass einer der enthaltenen Knoten beziehungsweise Zweige auftritt.

Das eignet sich beispielsweise für ein if/else-Verhalten. In der Sprachänderungsprozedur kann entweder der deutsche oder der englische Toggle Button ausgewählt werden.

Auch Choice Groups können Wiederholungen und optionale Inhalte enthalten.

Unsorted Group

Eine Unsorted Group eignet sich für mehrere Knoten, deren Reihenfolge keine Rolle spielt.

Ein typisches Beispiel ist ein Formular, bei dem mehrere Textfelder ausgefüllt werden. Für das Matching kann relevant sein, dass bestimmte Eingaben stattgefunden haben, während die Reihenfolge dieser Eingaben nicht festgelegt werden soll.

Für einzelne Knoten innerhalb einer Sequential Group kann alternativ ein Repeat verwendet werden. Eine Unsorted Group ist insbesondere dann sinnvoll, wenn mehrere verschiedene Knoten unabhängig von ihrer Reihenfolge erkannt werden sollen.

Komplexe Prozedur: „Neues Weingut“

Eine umfangreichere Demonstration verwendet die Prozedur Neues Weingut. Sie führt mehrere Aktionen aus:

  • Eingaben in verschiedene Textfelder,
  • Auswahl eines Bundeslands,
  • Auswahl einer weinbaulichen Nutzung,
  • Interaktionen mit einer Tabelle,
  • Eingabe eines Grundsteuer-Hebesatzes,
  • optionales Öffnen des Berechnungsschemas und
  • Speichern des neuen Eintrags.

Die automatisch erzeugte Prozeduraufrufdefinition funktioniert zunächst nicht vollständig. Das Beispiel zeigt, wie eine solche Definition schrittweise robuster gemacht werden kann.

Mouse Events aus der Aufnahme ausschließen

Ein Problem entsteht dadurch, dass ein Benutzer vor einer Texteingabe möglicherweise zunächst in das Textfeld klickt. Die eigentliche Prozedur benötigt diesen Mausklick jedoch nicht.

Statt für jedes einzelne Textfeld einen optionalen Mausklick in die Definition aufzunehmen, kann eine Ignore-Definition verwendet werden.

Seit QF-Test 11.0.2 kann dafür direkt die Option

Ignore the following nodes for procedure call recording

verwendet werden.

Damit lassen sich beispielsweise Mouse Events auf Textfeldern von der Prozeduraufrufaufnahme ausschließen. Auch spezifische Klicks auf eine Tabelle können auf diese Weise ignoriert werden.

Dadurch wird die Definition unabhängig davon, ob der Benutzer ein Feld zunächst anklickt oder beispielsweise per Tastatur dorthin navigiert.

Tastatur-Events ignorieren

Dasselbe Prinzip kann auf Tastatur-Events angewendet werden. Bei einer manuellen Eingabe können beispielsweise Tab, Enter, Backspace oder andere Tasten zwischen den eigentlichen relevanten Aktionen auftreten.

Solche Events können über eine Ignore-Definition ausgeschlossen werden. Eine Condition kann dabei den <Keycode> des Events prüfen und bestimmte Keycodes ignorieren.

Damit bleibt die Prozeduraufrufdefinition auf die fachlich relevanten Aktionen konzentriert, anstatt von den konkreten Interaktionen des Testautors abhängig zu sein.

Mehrere Texteingaben zusammenfassen

Auch eine einzelne logische Texteingabe kann während der Aufnahme aus mehreren Text-Input-Events bestehen. Dies kann beispielsweise passieren, wenn ein Benutzer einen Text teilweise eingibt, löscht und anschließend korrigiert.

Eine Möglichkeit besteht darin, für den entsprechenden Knoten einen Repeat zu definieren. Wenn mehrere unterschiedliche Knoten unabhängig voneinander auftreten können, eignet sich dagegen eine Unsorted Group.

Bei der Erzeugung von Prozedurparametern können mehrere aufeinanderfolgende Eingaben außerdem zusammengeführt werden. Werden die Werte beispielsweise ohne Separator aneinandergehängt, kann aus mehreren aufgenommenen Text-Inputs wieder der ursprüngliche Parameterwert entstehen.

Knoten detailliert beschreiben

Die erwarteten Knoten können über zahlreiche Eigenschaften genauer beschrieben werden.

Bei einem Mausklick können beispielsweise Eigenschaften des Events berücksichtigt werden. Komponenten lassen sich unter anderem über folgende Merkmale identifizieren:

  • ID,
  • Class,
  • weitere Komponentenattribute und
  • Conditions.

Auch Key Events können über ihren Keycode beschrieben werden.

Darüber hinaus können Wiederholungen, optionale Knoten und Prozedurparameter für einzelne Definitionselemente festgelegt werden.

Die YAML-Definition lässt sich direkt bearbeiten. Die entsprechende Bearbeitungsfunktion hilft dabei, die erforderliche Struktur und Einrückung korrekt einzuhalten.

Aufnahmeprotokoll zum Debuggen

Das Aufnahmeprotokoll ist nicht nur für tatsächliche Aufnahmen relevant. Es kann auch beim nachträglichen Konvertieren vorhandener Knotenfolgen verwendet werden.

Wenn eine Prozeduraufrufdefinition nicht greift, lässt sich damit Schritt für Schritt nachvollziehen, welcher erwartete Knoten nicht erkannt wurde.

Das Vorgehen besteht im Wesentlichen darin, die Definition im Protokoll bis zu der Stelle zu verfolgen, an der die tatsächliche Aufnahme von der erwarteten Struktur abweicht. Anschließend kann die Definition beispielsweise durch eine andere Komponentenbeschreibung, eine Condition, einen Repeat oder einen optionalen Knoten angepasst werden.

Automatische Prozedurparameter bei komplexen Aufnahmen

Auch bei längeren Prozeduren können Parameter automatisch aus der Aufnahme übernommen werden.

Im Beispiel Neues Weingut werden unter anderem der Betriebsname, die Eigentumsfläche und der Hebesatz aus den entsprechenden Eingaben übernommen. Die Prozeduraufrufaufnahme erzeugt daraus automatisch die Parameter des späteren Prozeduraufrufs.

Dadurch muss der Testautor die Parameter nicht nachträglich manuell in den erzeugten Prozeduraufruf eintragen.

Ausblick

Das Prozeduraufruf-Feature soll weiter ausgebaut werden. Zwei geplante beziehungsweise in Entwicklung befindliche Integrationen werden besonders hervorgehoben.

Integration mit Keyword Driven Testing

Die Prozeduraufrufaufnahme soll mit Keyword Driven Testing verbunden werden.

Dadurch können Prozeduraufrufe in einer für Fachabteilungen besser lesbaren Form dargestellt werden. Statt lediglich einen Prozedurpfad mit Parametern anzuzeigen, kann der Test beispielsweise als frei formulierter Text beziehungsweise Keyword-basierte Aktion dargestellt werden.

Das Feature ist insbesondere für Anwender interessant, die Tests stärker auf fachlicher Ebene formulieren möchten. Eine Beta-Version wird bereits von Kunden eingesetzt.

Integration mit KI

Auch die KI-Funktionen von QF-Test sollen mit der Prozeduraufrufaufnahme verbunden werden.

QF-Test kann bereits Tests per KI generieren und über einen AI Instruction Node Aktionen mit der Benutzeroberfläche ausführen lassen. Ziel ist, dass solche automatisch erzeugten Aktionen direkt auf vorhandene Prozeduren abgebildet werden können.

Das soll sowohl für KI-generierte Testsets als auch für die Aufzeichnung von Aktionen gelten, die innerhalb eines AI Instruction Node ausgeführt werden.

Fazit

Gut erstellte und robuste Prozeduraufrufdefinitionen helfen dabei, sicherzustellen, dass vorhandene Prozeduren tatsächlich in Tests verwendet werden.

Die Prozeduraufrufaufnahme kann dabei sowohl während der Aufnahme als auch nachträglich bei der Konvertierung eingesetzt werden.

Prozeduraufrufdefinitionen können automatisch aus bestehenden Prozeduren erzeugt und anschließend bei Bedarf verfeinert werden. Für komplexere Fälle stehen unter anderem:

  • Sequential Groups,
  • Choice Groups,
  • Unsorted Groups,
  • Conditions,
  • Placeholder,
  • optionale Knoten,
  • Repeat-Bereiche,
  • Ignore-Definitionen und
  • automatische Prozedurparameter

zur Verfügung.

Besonders bei komplexeren Prozeduren ist eine gewisse Einarbeitung in die Definitionssprache erforderlich. Mit den verfügbaren Mechanismen lässt sich jedoch sehr präzise festlegen, welche Aufnahmen als Aufruf einer bestimmten Prozedur erkannt werden sollen.

Wir verwenden Cookies zur anonymisierten Auswertung Ihres Besuchs auf unserer Webseite durch "Matomo". Dafür benötigen wir Ihr Einverständnis, welches für zwölf Monate gilt.

Cookie-Konfiguration

Funktionale Cookies

Wir verwenden funktionale Cookies, um die Basisfunktionalität der Webseite zu gewährleisten.

Performance- und Statistik-Cookies

Wir verwenden Matomo zur Analyse und Optimierung unserer Webseite. Cookies erlauben eine anonyme Erfassung der Informationen und helfen uns, Ihnen einen benutzerfreundlichen Besuch unserer Webseite zu bieten.

Cookie-Details
Bezeichnung Anbieter Gültigkeitsdauer Typ Verwendung
_pk_id Matomo 13 Monate HTTP Enthält eine eindeutige jedoch pseudonymisierte Matomo-interne Besucher-ID zur Erkennung wiederkehrender Besucher.
_pk_ref Matomo 6 Monate HTTP Wird verwendet, um zu tracken, von welcher Website der anonymisierte Benutzer auf die Website gekommen ist.
_pk_ses Matomo 1 Tag HTTP Das Session Cookie von Matomo wird verwendet, um die Seitenanforderungen des Besuchers während der Sitzung zu verfolgen.
_pk_testcookie Matomo Session HTTP Zur Prüfung, ob der Browser des Besuchers Cookies unterstützt.
_pk_cvar Matomo 30 Minuten HTTP Kurzzeit-Cookie für temporäre Besuchsdatenspeicherung.
_pk_hsr Matomo 30 Minuten HTTP Kurzzeit-Cookie für temporäre Besuchsdatenspeicherung.