Einführung in die Testautomatisierung für SAP- und Webanwendungen

Softwarefehler richten regelmäßig Millionenschäden an, dies ist kein Geheimnis. 2020 wurde der Schaden auf 1.56 Billionen $ geschätzt[1] (entspricht ca. 1.28 Billionen €). Nur zum Vergleich, der Berliner Flughafen kostet nach aktuellen Schätzungen 7.08 Milliarden Euro[2]. Von dem Geld der Softwareschäden ließe sich also besagter Flughafen rund 181 Mal bauen.

Das Thema automatisiertes Testen ist in den Unternehmen angekommen, diese Behauptung kann ich durch eigene Erfahrungen belegen, dennoch wird nach wie vor an der falschen Stelle manuell getestet. Zahlreiche Personen sitzen regelmäßig vor ihren Bildschirmen und führen mehrfach täglich immer wieder die gleichen Vorgänge durch. Dies ist nicht nur teuer, es demotiviert auch enorm. Genau das führt dazu, dass wiederholte Tests nicht mehr mit derselben Sorgfalt ausgeführt werden und die Ergebnisqualität schwankt. Zeitdruck und Stress führen zu menschlichen Fehlern bei der Durchführung.

Dieses Szenario klingt nach einem bewährten Fall für den Einsatz von Testautomatisierung und genau darum geht es in diesem Artikel. Nachfolgend werde ich die Grundlagen der Testautomatisierung vorstellen, dadurch lassen sich Mitarbeiter wieder zielführend einsetzen, ständig wiederholende Sachverhalte reduzieren und die Motivation steigern.

Grundlagen und Ziele der Automatisierung

Testautomatisierung ist ein großes Themengebiet, je nachdem welche Art von Tests automatisiert werden, kommen andere Vorgehensweisen und Werkzeuge zum Einsatz.

Die Testpyramide zeigt recht deutlich, in welchem Verhältnis die Testfälle idealerweise aufgeteilt sein sollten. Ende zu Ende Tests bzw. Akzeptanztests sind sehr aufwendig und komplex, sollten daher sparsam eingesetzt werden. Komponententest oder auch Unittests genannt, sind schnell entwickelt und benötigen auch nur wenige Millisekunden Laufzeit und sollten daher häufig vorkommen.


Abbildung 1: Testpyramide mit Komplexitätsansicht

Jeder Testfall benötigt drei Teile: Eine Vorbedingung, eine Testdurchführung und eine Ergebnisprüfung. Als Beispiel nehmen wir den Test einer Webseite.

Die Vorbedingung ist das Starten des Browsers gefolgt von der Navigation zur entsprechenden Testseite.

Anschließend findet der eigentliche Testprozess statt, dies kann das einfache Ausfüllen und Absenden eines Formulares sein.

Im letzten Schritt folgt eine Ergebnisprüfung. Je nach Komplexität kann dies die Abfrage des gespeicherten Formulardatenbankeintages oder ein simples auslesen der Erfolgsmeldung auf der Oberfläche sein.

Eines der weit verbreitetsten Werkzeuge für den automatisierten Test von Weboberflächen ist Selenium.

Testautomatisierung mit Selenium

Selenium ist ein open source Werkzeug und seit mehr als 15 Jahren auf dem Markt. Es teilt sich in drei Komponenten auf:

Selenium IDE, Selenium WebDriver und Selenium Grid. Zusätzlich dazu existiert noch Selenium Remote Control (kurz: RC), ein in Java geschriebener Server für die Browsersteuerung.

Selenium IDE

Bei Selenium IDE handelt es sich um ein Browser Plugin für Firefox und Chrome. Frei nach dem Record & Replay Prinzip zeichnet der Anwender seine Browseraktionen auf, das Plugin generiert daraus ein ausführbares Skript und dieses lässt sich wieder ausführen.

Dieses Vorgehen hat wie alle Record & Replay Verfahren weitreichende Nachteile: Der Code ist schlecht wartbar und garantiert keines falls, dass genau das aufgezeichnete Vorgehen fehlerfrei wieder ausgeführt werden kann. Häufig treten beim Abspielen des Skriptes Fehler auf, weil Elemente sich unerwartet verhalten.

Selenium Grid

Wie schon Selenium RC ist Grid ebenfalls ein Server. Dieser erlaubt die Ausführung von Selenium Testcode auf remote Maschinen mit verschiedensten Browsern in verschiedenen Versionen und unterschiedlichen Betriebssystemen. Ein Server dient als zentraler Hub und die verschiedenen Instanzen stellen die Nodes da. Alle Tests können parallel in den unterschiedlichen Instanzen durchgeführt werden, somit ist eine enorme Zeiteinsparung möglich.

Selenium WebDriver

Selenium WebDriver steuert Browser, daher kann Selenium auch nicht mehr als der Browser selbst. Es werden die gängigsten Programmiersprachen unterstützt.

Nachfolgend ein kurzes, in Java geschriebenes Beispiel.

System.setProperty(„webdriver.gecko.driver“, „X:\\geckodriver.exe“);

FirefoxDriver driver = new FirefoxDriver();

driver.get(„https://www.it-freelancer-magazin.de/“);

Über die Systemproperty wird der Pfad für den sogenannte Geckodriver gesetzt, jeder Browsertyp benötigt seinen zugehörigen Treiber. Bei Edge ist dies der Edge Treiber, bei Chrome der Chromedriver usw.

Anschließend wird eine Browserinstanz über den new Operator erstellt und über driver.get die Webseite „https://www.it-freelancer-magazin.de/“ geladen.

Hier beginnt der eigentliche Testablauf, zuvor war lediglich die Vorbedingung mit Browser starten und Webseite aufrufen. In diesem Test wird die Funktionalität der Suche geprüft.

driver.findElementByLinkText(„Suchen“).click();

driver.findElementByClassName(„search-field“).sendKeys(„das ist ein Test“);

driver.findElementByClassName(„search-field“).sendKeys(Keys.ENTER);

Zunächst wird über die Methode „findElementByLinkText“ der Suchbutton gesucht und anschließend geklickt. Selenium verfügt über zahlreiche Methoden je nachdem wie das benötigte Element gefunden werden soll. Am einfachsten ist es, wenn eine ID (hier z.B. Suchen) zur Verfügung steht.

In Schritt zwei wird das Suchfeld mit „das ist ein Test“ gefüllt und anschließend mit Hilfe der Enter-Taste bestätigt.

Thread.sleep(1500);

WebElement result = driver.findElementByCssSelector(„#post-9417 > div > header:nth-child(2) > h2> a“);

assertEquals(„Manager-Interview zur Corona Situation: Survival of the IT- fittest“, result.getText());

Da der Test schneller wie die zu testende Applikation ist wurde hier der einfachheitshalber eine künstliche Pause von 1,5 Millisekunden eingebaut. Ohne diese Pause schlägt der Test fehl, weil das benötigte Ergebniselement noch nicht geladen ist. Im Echtfall würde dies viel eleganter durch Waits gelöst.

Als Erfolgreicher Test gilt wenn die Suche ein erwartetes Suchergebnis zurückliefert. In diesem Falle einen bestimmten Artikel.

Mit der findElementByCssSelector wird dieser Artikel mit einer eindeutigen Id gesucht und anschließend der HTML- Pfad von dort aus weiter nach unten navigiert, bis der Parser bei der Artikelbezeichnung angekommen ist.


Abbildung 2: HTML Code des Suchergebnisses

Die assertEquals Methode vergleicht, ob die Bezeichnung des Artikels mit der Vorgabe übereinstimmt.

Ist dies der Fall gilt der Test als erfolgreich.

Während Selenium ausschließlich für Weboberflächen geeignet ist, existieren auf dem Mark zahlreiche andere für Desktopanwendungen. Eines davon ist das kommerzielle Tool von Borland, Silk4j, welches ich regelmäßig für SAP GUI Tests verwende.

Testautomatisierung von SAP Anwendungen mit Silk4J

Im Gegensatz zu Selenium wird bei Silk4j die Installation eines sogenannten Agents auf der Testmaschine benötigt. Dieser Agent ist vergleichbar mit einem Browsertreiber und übernimmt die Kommunikation zwischen Testscript und den eigentlichen Desktopanwendungen.

Object Maps

Ein weiterer Unterschied ist die Arbeitsweise: Silk ermöglicht das interne Speichern aller Zugriffspfade bezüglich Interaktionselementen (aka. Locator) in einer sogenannten Object Map. Beim Ansteuern eines Elements wird dieser Locator über die ID in der Object Map gefunden und entsprechend geladen. Ebenfalls mitgespeichert wird der Typ des Elements. „Input“ steht für ein einfaches Eingabefeld.

Abbildung 3: Auszug einer Object Map

Die Locator lassen sich mit dem mitgelieferten „Locator Spy“ – Werkzeug auslesen

Abbildung 4: Locator Spy, auslesen eines SAP Text Feldes

Die Verwendung der Object Map ist optional, trägt aber positiv zur Performance bei, sobald ein Element mehrfach verwendet wird. Außerdem wird die Wartbarkeit erleichtert. Sobald eine Änderung der Zugriffslocator eintritt, müssen diese nur an einer Stelle in der Object Map angepasst werden.

Silk IDE Plugins

Silk liefert außerdem für Eclipse und IntelliJ passende IDE Plugins mit. Diese Plugins sind vergleichbar mit der Selenium IDE. Mit ihnen lassen sich Scripte aufzeichnen und abspielen. Die bereits oben erwähnten Nachteile sind hier ebenfalls gegenwärtig, allerdings werden Object Maps automatisch durch das Aufnehmen der Eingabeaktionen erzeugt.

Silk4j angewendet

Der Testcode von Silk4j ist ähnlich dem von Selenium, dennoch gibt es einige Unterschiede. Nachfolgendes Beispiel zeigt einen vereinfachten SAP Anmeldeprozess ohne Object Map.

Zu Beginn wird der Treiber initialisiert.

private Desktop desktop = new Desktop();

Dieses Vorgehen ist vergleichbar mit dem Browser starten von Selenium. Der Silk Agent greift hier auf eine Konfigurationsdatei zurück, in der alle notwendigen Parameter zum Start der Desktopanwendung stehen, unter anderem auch der Dateipfad. Diese Config-Datei kann mit einem simplen Editor gepflegt werden oder über das IDE Plugin.

Abbildung 5: Silk Konfiguration über IDE Plugin einstellen

Nachdem die Anwendung gestartet ist, verhält sich die Programmierung ähnlich zu der von Selenium:

desktop.<SapTextField> find(„/SapWindow[@automationId=’/app/con[0]/ses[0]/wnd[0]‘]//SapTextField[@automationId=’usr/txtRSYST-BNAME‘]“).setText(„TEST“);

desktop.<SapTextField> find(„/SapWindow[@automationId=’/app/con[0]/ses[0]/wnd[0]‘]//SapTextField[@automationId=’usr/pwdRSYST-BCODE‘]“).setPasswordText(„0XMe“);

desktop.<SapWindow> find(„/SapWindow[@automationId=’/app/con[0]/ses[0]/wnd[0]‘]“).sendVKey(VKey.ENTER);

In diesem Beispiel wird der Benutzername und das Passwort im SAP Loginfenster gesetzt und anschließend mit der Enter-Taste bestätigt.

Im Gegensatz zu Selenium arbeitet Silk ausschließlich mit XPath- Ausdrücken. Über die find- Methode ist der XPath Ausdruck zu übergeben, anschließend ist auf dieses Element ein Zugriff möglich.

Tests in der Praxis

In der Praxis werden Frameworks und Abstraktionen verwendet, um die Programmierung mehr zu kapseln und die Wartung des Codes zu vereinfachen. Ein Beispiel hierzu zeigt der nachfolgende Code.

FirefoxDriver driver=initialiseAndOpenBrowser(„https://www.it-freelancer-magazin.de/“);

IndexPage indexPage=new IndexPage(driver);

ResultPage resultPage=indexPage.clickSearchButton().setSearchField(„das ist ein Test“).sentEnterKeys();

String title=resultPage.getFirstTitle();

assertEquals(„Manager-Interview zur Corona Situation: Survival of the IT- fittest“, title);

Der gleiche Selenium Test wie weiter oben lässt sich so viel leserlicher darstellen, kapselt die Verwendung der Elemente in Unterfunktionen und ermöglicht somit einen Zugriff über eine Stelle. Dadurch wird der Wartungsaufwand deutlich verringert und der Code ist um einiges lesbarer.

Dies ist nur ein einfaches Beispiel. Im produktiven Code ist noch viel mehr möglich.

Fazit

Selenium und Silk4j haben noch wesentlich mehr Features und Funktionalitäten. Selenium ist beispielsweise problemlos in der Lage, Tests parallel auszuführen, während Silk ebenfalls Browser steuern kann. Egal welches der beiden Tools eingesetzt wird, empfiehlt es sich, ein eigenes Framework zu entwickeln sowie Design Pattern zu verwenden. Darüber hinaus ist es von Vorteil, häufig verwendete Funktionen auszulagern. Das PageObject Pattern für WebTests oder analog als DialogObject Pattern für DesktopTests erleichtern die Arbeit enorm.

Ich verwende beispielsweise ein selbstentwickeltes Framework für Silk, das mir die Arbeit mit den Object Maps abnimmt und besagte Design Pattern verwendet. Das Framework verwaltet die Object Maps und generiert entsprechende Inhalte dynamisch, je nachdem welches Element vorhanden ist.

Für Selenium verwende ich ebenfalls Eigenentwicklungen, die sich unter anderem um das automatische Erstellen von Reports und Screenshots im Fehlerfall kümmern.

Das Thema Testing ist sehr umfangreich, daher biete ich speziell für Selenium eigene Schulungen an, die das erlernte Wissen mit praktischen Übungen festigen.

Mehr Informationen auf meiner Homepage https://pmo-it.de

Gerne können mir auch auf Twitter Fragen gestellt werden: @Keeper_pmo.

  1. https://www.it-cisq.org/pdf/CPSQ-2020-report.pdf CISQConsortium for Information & Software Quality Seite 24
  2. https://www.flughafen-berlin-kosten.de/
Share.

Pascal Moll ist freiberuflicher Berater, Java-Entwickler und agiler Tester. 2021 belegte er den 2. Platz beim Freelancer des Jahres Wettbewerb. Er ist ISTQB Advanced Zertifiziert und seine Schwerpunkte liegen im Testmanagement und Testautomatisierung. Sein Wissen teilt er regelmäßig in Podcasts, Artikeln, Blogposts und Webinaren. Neben Cucumber Schulungen gibt er auch regelmäßig Selenium Kurse.

Leave A Reply

IT Freelancer Magazin Newsletter

Verpasse keine IT Freelancer News mehr! Jetzt zum Newsletter anmelden.

IT Freelancer Magazin F-Icon