#LuckeExperiences
Lesezeit ca. 10 Minuten
Einleitung
In agilen IT-Projekten (Scrum, DevOps…) ist eine schnelle Rückmeldung darüber, ob neue Softwarekomponenten den gewünschten Umfang haben und eine Integration ins gesamte System möglich ist, State of the art. Viele erfolgreiche Unternehmen haben dieses Modell daher bereits fest etabliert. Eine Testautomatisierung ermöglicht zudem Integration Test und System Test bereits früh wiederverwendet werden und der Testprozess somit beschleunigt wird.
Selenium hat sich im Markt als das meist eingesetzte Testautomatisierungstool etabliert. Das Open Source Tool basiert auf Java und ermöglicht die Integration mit verschiedenen Versions- und Integrations-Systemen (Jenkins). Selenium bietet viele Umsetzungsmöglichkeiten (Page object Factory, Data Driven Testing, Hybrid Automation), diese können je nach Projektstruktur effizient integriert werden. Dadurch erhöht sich die Wiederverwendbarkeit des Codes. Die Kosten für die Skriptwartung verringern sich und die Lesbarkeit des Codes wird verbessert.
In diesem Artikel zeige ich anhand eines Praxisbeispiels die Testautomatisierung mit Selenium in einem agilen Umfeld. Im Beispiel werden die wesentlichen Komponenten zur Implementierung eines Testframeworks mit Selenium in einem Continus Testing Szenario erläutert:
– Page Factory Konfiguration
– TestNG Konfiguration
– Maven als Build-Management-Tool zur Erstellung der benötigten Dependencies für das Projekt
– GitLab als System zur Versionsverwaltung
– Jenkins für Testintegration, -durchführung und -reporting
Folgende Software/Add-Ons müssen hierzu auf dem Rechner eingerichtet werden:
– Entwicklungstool (Eclipse)
– Maven Projekt erstellen
– Die Plugins Selenium, TesNg, Log4j sowie apache.maven sind als Dependencies in POM.xml hinzuzufügen. Diese können unter https://mvnrepository.com/ heruntergeladen werden.
– TestNG Add ons in Eclipse unter Marketplace herunterladen
– Git installieren
– Jenkins konfigurieren
Selenium Page Factory Konfiguration
Das Verwalten mehrerer Codezeilen in einer einzelnen Klassendatei ist eine mühsame Aufgabe und erhöht die Komplexität. Um die Projektstruktur innerhalb der Entwicklungsplattform wie Eclipse oder IntelliJ effizient zu gestalten und die Leistung der Skripte sicherzustellen, müssen unterschiedliche Seiten für unterschiedliche Aufgaben verwendet werden.
Page Factory erstellt dabei eine Art von Objekt-Repositories: Pro Webseite wird eine Java Klasse erstellt, in welcher die zugehörigen Elemente (Buttons, Listen, Checkboxes, Radio Buttons…) gekapselt und mit einem Locator aufgenommen werden. Die Klassen in Page Factory werden gesplittet, somit werden WebElemente, Testmethoden, Testdaten und die Browser Settings getrennt entwickelt. Damit ist es einfacher, den Code zu pflegen: Alle Änderungen an der Benutzeroberfläche werden dort angezeigt, wo sie in der Klasse verwendet werden – dies minimiert die Duplizierung von Code.
Die wichtigsten Klassen in Page Factory sind folgendermaßen aufgebaut:

BasePage:
Die Klasse Base Page führt die eigentlichen Operationen auf den WebElementen durch. Alle Grundfunktionalitäten wie z.B. click, get, set sind dort implementiert. Eine von der BasePage abgeleitete Klasse verfügt somit über die Grundfunktionalitäten und die zu ihrer Seite gehörenden Webelemente, die bekannt sein müssen.


Browser Settings:
In dieser Klasse wird der Browser festgelegt, außerdem umfasst sie die Instanzen der einzelnen PageObjects und die before und after Methode von TestNG. Die Browser Settings Klasse erhält aus der TestNg.xml-File den Browsernamen als Parameter. Somit wird während der Testdurchführung dynamisch ermittelt, in welchem Browser der Test gestartet wird.

DataProvider:
An dieser Stelle wird die Ausführungsstrategie beschrieben, nach der Testfälle automatisch mehrmals mit unterschiedlichen Testdaten ausgeführt werden. Die DataProvider Klasse erspart es, die Testdaten in einer externen Schnittstelle (Excel, csv…) hinterlegen zu müssen und trägt somit zur Steigerung der Performance bei der Testdurchführung bei.

Pages:
Der Aufbau der Page-Klasse ist wie folgt unterteilt:
1. Elementschlüssel: Ein Schlüssel ist jeweils eine String-Konstante mit einem sprechenden Namen, gefolgt vom Elementbezeichner für eine effiziente Trefferliste bei der Programmierung.

2. Web-Elemente sind einzelne Elemente bzw. ganze Web-Elementlisten einer Seite

3. Accessor-Methoden dienen dem Zugriff auf das Element.

4. Mapper-Methoden enthalten zum Mappen den Elementschlüssel. Dieser liefert entweder das gefunden Element oder NULL.

5. Test-Klasse: An dieser Stelle werden die konkreten Testfälle designt. Einzelne Teststeps werden aus der Page-Klasse aufgerufen. Somit ist allein durch den Punktoperator und das Eintippen von „INPU“ der gesuchte Schlüssel schnell gefunden.

2. TestNG Konfiguration
TestNG ist ein Framework, welches über unterschiedliche Test-Funktionen verfügt, um einzelne Klassen zu testen. Die Datei TestNG.xml ist die Konfigurationsdatei, die den Testablauf unterstützt. Es ermöglicht Testern, mehrere Test-Klassen zu erstellen und zu verarbeiten sowie Testsuiten und Tests zu definieren. Über die Priorisierung wird festgelegt, welche Testfälle zuerst ausgeführt werden und welche Abhängigkeiten zu anderen Testfällen existieren.

3. Maven als Build-Management-Tool
Apache Maven ist ein Projektmanagementprozess, in dem alle Bibliotheken und Dependencies für das Projekt dynamisch und einfach hinterlegt werden. Darüber hinaus kann eine Schnittstelle zu GitLab erstellt und das Projekt dort veröffentlicht werden.
Mit Maven Plugins können Variablen definiert werden, die durch Jenkins gesteuert werden – beispielsweise, welche Testsuite durchgeführt und in welchem Browser diese ausgeführt wird.


4. GitLab als Versionsverwaltungssystem
GitLab ist ein Version Control System (VCS). Es basiert vollständig auf Git, einem Versionierungssystem, welches als Open-Source-Software zur Verfügung gestellt wird. Alle Änderungen an Dateien und Quellcode können jederzeit nachvollzogen werden.
In Eclipse ist die Möglichkeit, ein Projekt in Git zu importieren, automatisch hinterlegt. Entweder man klont eine GitLaB URL oder ruft ein vorhandenes Repository auf. Wenn die Verbindung zu GitLab aufgebaut ist, kann das Projekt committet werden. Es ist dann im öffentlichen Repository vorhanden.



5. Jenkins-Konfiguration
Jenkins CI ist ein Open-Source-Automatisierungsserver (Build Server oder CI Server) für Continuous Integration und Continuous Delivery. Die Kernaufgabe von CI Servern ist es, Builds und Tests für Softwareprojekte durchzuführen. Jenkins ruft die Maven-Datei in GitLab auf, in welcher die Selenium-Konfigurationen gekapselt sind. Nach der Konfiguration in Jenkins werden die Testfälle dort durchgeführt. Über das TestNG-Plugin werden die Testergebnisse angezeigt. Die Jenkins-Konfiguration wird im Folgenden erläutert. Es wird ein Free Project in Jenkins erstellt und unter Konfigurationen in den Git-Repository-Link für das Selenium-Projekt kopiert.
Unter „Branches to build“ den Branch eingeben (*/master):

Maven Goals: „clean“ , „install“ und den TestNG.xml Pfad eingeben und dann definieren, wo der Test durchgeführt werden soll.

Unter Post-Build-Aktionen das TestNG-Plugin auswählen. Dieses ist für die Testergebnisse und das Reporting zuständig.


Fazit
Die Testautomatisierung mit Selenium ermöglicht eine qualitativ hochwertige Bereitstellung von Software in kürzeren Zyklen. Nach einem erforderlichen Initialaufwand sinken die Verfahrenskosten merklich durch den Prozess der continuous integration. Schnellere Erkenntnis über die Qualität, effektivere Risikosteuerung durch die CI/CD-Pipeline und frühere Vermeidung von Fehlern und Abweichungen sind zusätzliche Nutzen, welche durch die Anwendung von continuous testing erreicht werden können.
Ihr Ansprechpartner:
Jamal Oubaouih – Software-Entwickler – jamal.oubaouih@lucke-edv.de
Lucke EDV GmbH | Zurück