Senior IT-Consultant Silvio Glöckner beschreibt in seinem Blogbeitrag, wie Sie mit Maven ein Template-Projekt bereitstellen, das als Ausgangsbasis für die Testautomatisierung dient. Dies war bereits ein Teilthema der Onlineschulung „Selenium – Getting started“ aus dem Januar 2021 und wird hier nochmal im Detail beleuchtet.
Hoher Aufwand für die Einrichtung neuer Testautomatisierungsprojekte mit Selenium
Selenium, als Tool zur automatischen Browsersteuerung, ist eine hervorragende Lösung für die Testautomatisierung im Bereich Webapplikationen.
Allerdings ist es kein Ein-Klick-Installations-Tool, sondern muss als Java-Bibliothek in ein Projekt eingebunden und mit Bibliotheken weiterer Tools kombiniert werden, um lauffähig zu sein. Daher ist das Aufsetzen eines neuen Testautomatisierungsprojektes mit einigen Hürden verbunden. Unter anderem muss man folgende Schritte durchführen:
- Anlegen eines neuen Projekts in der IDE
- Einrichtung eines Testtreibers wie JUnit oder TestNG
- Festlegung der Projektstruktur (Verzeichnisse für Ablage der Tests und Testressourcen)
- Spezifizierung der Testarchitektur (z.B. Verwendung des Page Object Patterns)
- Bereitstellung der Selenium WebDriver und Selenium Funktionsbibliotheken
- Einbindung eines umfangreichen Reporting für die Testergebnisse
- Implementierung von Hilfsfunktionen wie
- Interaktion mit E-Mail-Schnittstellen
- Validierung von PDF-Dokumenten
- Anbindung von Datenbanken für Testdaten
Je nach Komplexität des Testprojektes können so mehrere Stunden bis Tage vergehen, bevor der erste Testfall überhaupt automatisiert werden kann. Dies hängt im hohen Maße auch von der Erfahrung der Testautomatisierer ab.
Außerdem sind Unterschiede im Projektsetup zwischen verschiedenen Projekten wahrscheinlich, sodass Projektmitglieder oft nur mit einem erhöhten Einarbeitungsaufwand zwischen Projekten wechseln können. Durch die unterschiedlichen Projekte muss nicht nur eine inhaltliche Einbindung erfolgen, sondern auch die Orientierung in der andersartigen Ordner- und Projektstruktur muss aufgebaut werden. Schon bei einer geringen Anzahl verschiedener Testprojekte im Unternehmen kann es sich daher lohnen, ein Template-Projekt bereitzustellen, das als Ausgangsbasis für neue Projekte dient.
Lösung mit Maven Archetypes
Im einfachsten Fall lässt sich ein Referenzprojekt erstellen, das zentral in einem Versionsmanagementsystem zur Verfügung gestellt wird. Allerdings ist das nicht sehr portabel, da immer dieselbe Package-Struktur verwendet werden muss. Außerdem macht es unter Umständen die Versionierung und Weiterentwicklung schwierig.
Daher bietet sich hier die Verwendung von sogenannten “Maven Archetypes” an. Maven selbst ist ein Build-Tool zur effizienten Verwaltung externer Projektabhängigkeiten und Bereitstellung einer Bauanleitung für das Projekt. Es kompiliert und paketiert den Quellcode, führt Tests aus und stellt die erzeugten Softwareartefakte bereit. Ein Archetype ist ein Template für ein neues Maven-Projekt. Es beinhaltet eine vorbereitete Projektstruktur und Bauanleitung, um sofort mit der Implementierung beginnen zu können ohne vorher alle Abhängigkeiten und Hilfsfunktionen manuell bereitzustellen zu müssen. Der fertige Maven Archetype kann zentral in einem Artefakt-Repository wie Nexus oder JFrog bereitgestellt werden, um daraus über eine IDE wie Eclipse, IntelliJ oder Visual Studio Code ein neues Testautomatisierungsprojekt zu erzeugen.
Einrichtung eines Referenzprojektes
Die folgenden Schritte beschreiben wie ein Selenium-Referenzprojekt für den Archetype angelegt werden kann. Die nachfolgenden Abschnitte gehen dann tiefer auf die einzelnen Punkte ein:
- Design der Testautomatisierungsarchitektur (z.B. Page Object Pattern)
- Einrichtung von Templates für Testressourcen (Zugangsdaten, Testdaten)
- Einrichtung weiterer Komponenten und Hilfsklassen (z.B. Reporting, Backend-Validierung)
- Implementierung von Beispieltestfällen
- Erstellung der Dokumentation für die Verwendung des Archetypes
Der erste Schritt zur Erstellung eines Archetype ist ein Selenium-Referenzprojekt. Dieses kann entweder von einem bestehenden Projekt abgeleitet oder komplett neu erstellt werden. Bei der Einrichtung des Referenzprojektes muss im Vorfeld etwas Zeit in die Spezifikation einer Testautomatisierungsarchitektur investiert werden. Eine saubere Testarchitektur ist wichtig, um die langfristige Wartbarkeit der automatisierten Testfälle zu gewährleisten. Dies macht sich durch einen geringeren Wartungsaufwand bezahlt.
Ein wichtiger Aspekt, der bedacht und spezifiziert werden muss, ist die Struktur der Java-Klassen. Hier hat sich der Einsatz des Page Object Patterns als bewährte Herangehensweise erwiesen. Die Webelemente auf zu testenden Seiten einer Webapplikation werden in Klassen (sogenannten „Page Objects“) abgebildet und Methoden zur Steuerung werden ebenfalls dort bereitgestellt. Ein Testfall ist dann eine Aneinanderreihung von Page Object-Methoden und Prüfmethoden.
Ein weiterer wichtiger Punkt ist die Einbindung von Testressourcen, z.B. für Zugangs- und Testdaten. Diese sollten nach Möglichkeit nicht im Testfall, sondern in einfach austauschbaren Ressourcen, entweder im Testprojekt selbst oder in externen Quellen, verfügbar sein.
Zu guter Letzt werden die Hilfsklassen bereitgestellt, um häufig genutzte Funktionen in einem Testautomatisierungsprojekt zu vereinheitlichen und auf einfache Art und Weise zur Verfügung zu stellen. Sinnvolle Funktionen sind hier zum Beispiel der Zugriff auf E-Mail-Server, wenn eine Testaktion eine E-Mail als Versandbestätigung auslöst oder die Validierung eines PDF-Dokuments für eine automatisch erstellte Rechnung. Auch die Anbindung von Datenbanken zur Validierung der erzeugten Daten im Back-End kann hilfreich sein.
Außerdem ist es sinnvoll, ein paar Beispieltests bereitzustellen, die als Blaupause für neue Testfälle dienen können.
Abbildung 1: Struktur für ein Selenium-Referenzprojekt
Abbildung 1 zeigt, wie ein Referenzprojekt für einen Selenium-Archetype aussehen kann. Die Grundlage für das Testframework in diesem Beispiel bilden die Verzeichnisse common und reporting. Hier sind alle relevanten Hilfsklassen und die Software-Architektur des Testframeworks enthalten.
Erstellung des Maven-Archetypes
Die folgenden Schritte beschreiben, wie der Selenium Maven Archetype aus einem Selenium-Referenzprojekt erstellt wird. Die nachfolgenden Abschnitte gehen dann tiefer auf die einzelnen Punkte ein:
- Erzeugung eines Selenium-Referenzprojektes wie im vorangegangenen Abschnitt beschrieben
- Ersetzung der Java-Package-Namen durch Platzhalter (${groupId})
- Kopie des Referenzprojektes in das archetype-resources Verzeichnis
- Erstellung und Konfiguration der Datei archetype-metadata.xml
- Erstellung und Konfiguration der Parent pom.xml
Befindet sich das Selenium-Referenzprojekt in einem nutzbaren Zustand, kann daraus der Maven Archetype erstellt werden. Hier bietet Maven zwei Möglichkeiten: die Erstellung aus einem vorhandenen Maven-Projekt oder die Erzeugung aus einem dedizierten Maven-Archetype-Projekt.
Welcher Weg genommen wird, ist von den konkreten Umständen abhängig. Für die einmalige Erstellung eines Archetypes empfiehlt sich die Erzeugung aus einem vorhandenen Projekt. Soll der Archetype aktiv weiterentwickelt werden, ist ein dediziertes Projekt sinnvoll. Im Folgenden wird der Weg über ein eigenständiges Archetype-Projekt beschrieben, weil sich dadurch detaillierter festlegen lässt, was in den Archetype an Artefakten Einzug erhält.
Wichtig bei der Übernahme des Referenzprojektes in den Archetype ist die Ersetzung der Package-Namen der Java-Klassen durch Platzhalter, wie in Abbildung 2 dargestellt.
Abbildung 2: Ersetzung der Package-Namen
Dies ist daher wichtig, da bei der Erzeugung eines neuen Projektes aus einem Maven Archetype die Group ID dynamisch festgelegt werden kann und damit auch die Verzeichnisstruktur variabel ist. Aus der Verzeichnisstruktur wiederum ergibt sich der Package-Name.
Sind die Namen ersetzt, kann das gesamte Projekt in das Projekt für die Erzeugung des Archetype kopiert werden. Das Zielverzeichnis lautet src/main/resources/archetype-resources.
Abbildung 3: Struktur Archetype-Generierungs-Projekt
Im Verzeichnis src/main/resources/META-INF.maven muss eine Datei Namens archetype-metadata.xml angelegt werden. Diese enthält Informationen darüber, welche Verzeichnisse für den Archetype relevant sind und wie bei der Archetype-Generierung vorgegangen werden soll – unter anderem in welchen Verzeichnissen die Ersetzung der groupId in den Package-Namen durchgeführt werden soll. Abbildung 4 zeigt dazu ein Beispiel.
Abbildung 4: Inhalt archetype-metadata.xml
Die Maven Parent-POM (Project Object Model) des Maven Archetype-Generierungsprojekts enthält das Build-Plugin archetype-packaging sowie weitere Plugins, die für das Deployment in ein Artefakt-Repository notwendig sind. Dieser Teil kann sich je nach gewähltem Tool (z.B. Nexus, JFrog) stark unterscheiden. Abbildung 5 zeigt die archetype-packaging Extension in der POM.
Abbildung 5: Build-Extension archetype-packaging
Automatisches Build und Deployment
Ist der Archetype fertiggestellt, kann das Archetype-Artefakt manuell gebaut und in ein Artefakt-Repository eingecheckt werden. Dazu reicht ein Maven-Einzeiler:
mvn clean package deploy
Wird das Archetype-Projekt aktiv weiterentwickelt, so ist es ratsam, das Build und Deployment nachzuautomatisieren. Dazu bieten sich CI-/CD-Tools wie Jenkins oder TeamCity an. In der Endausbaustufe kann dann so nach jedem Check-In einer Erweiterung in ein Versionsmanagementsystem der Archetype neu gebaut und deployed werden. So steht er dann allen Benutzern zur Verfügung.
Schnell zum neuen Testautomatisierungsprojekt
Steht der Archetype in Ihrem Unternehmen bereit, so kann in wenigen Minuten ein neues Testautomatisierungsprojekt erstellt werden. Dazu sind folgende Schritte notwendig:
- Auswahl des Maven Archetypes in der IDE
- Festlegung der Projektparameter (Name, groupId, artifactId, version)
- Automatisierte Erzeugung der Projektstruktur
Abbildung 6 zeigt, wie in IntelliJ ein Archetype ausgewählt werden kann. Im nachfolgenden Dialog müssen dann nur noch die GroupId, die ArtifactId und die Version angegeben werden.
Abbildung 6: Auswahl Archetype in IntelliJ
Ein Testautomatisierer kann dann sofort mit der Implementierung neuer Testfälle beginnen. So entsteht nur ein geringer zeitlicher Verzug bei der Einrichtung der Testautomatisierungswerkzeuge in einem Projekt.
Da die grundsätzliche Projektstruktur immer gleich ist, werden sich erfahrene Mitarbeiter sofort zurechtfinden. Die Einarbeitung neuer Kollegen sowie die projektübergreifende Zusammenarbeit werden dadurch erleichtert. Durch die zentrale Bereitstellung des Template-Projektes ist es außerdem möglich, eine umfangreiche Dokumentation zu erzeugen, die bei der Einarbeitung zusätzlich unterstützt.
Ausblick
Mit dem Selenium Maven Archetype lässt sich ein unternehmensweites Template für Selenium Testautomatisierungsprojekte erstellen. Eine weitere Effizienzsteigerung lässt sich dadurch erreichen, dass auch die Ausführungsinfrastruktur zentral zur Verfügung gestellt werden kann. Selenium bietet hier durch seine Client-Server-Architektur und der Verwendung von Selenium-Grid die Möglichkeit, dies projektübergreifend zu gewährleisten. Dies kann statisch über physische Server beziehungsweise virtuelle Maschinen erfolgen oder dynamisch in Form von Cloudlösungen wie Kubernetes/Openshift. Eine dritte Möglichkeit ist die Beauftragung spezialisierter Anbieter, die fertige Selenium-Lösungen anbieten.