Testautomatisierung

Erschienen am 8.9.2020 | 18 Minuten zu lesen

Autor: Hanno Rippe

Was versteht man unter der Testautomatisierung? 

Hochwertige Software wird heutzutage in einer hohen Taktzahl ausgeliefert. Um trotzdem eine gleichbleibend hohe Qualität und geringe Fehlerrate zu sichern werden Testautomatisierungen etabliert. Diese führen – wie der Name schon sagt – automatische Testfälle durch und erstellen Testreports.

Doch was genau zeichnet automatisierte Tests aus?

Warum überhaupt Tests automatisieren? 

Auch wir führen Testautomatisierungen durch um sicherzustellen, dass die entwickelte Software den Anforderungen des Kunden entspricht und wie erwartet funktioniert. Häufig muss lediglich geprüft werden, ob aufgrund der letzten Arbeiten an der Codebasis etwas schadhaft verändert worden ist. Mit steigender Komplexität der Software wird es immer schwieriger, alle potenziell vorhandenen Fehlerfälle manuell zu testen.

Theoretisch ist dies möglich, allerdings wäre es enorm zeitaufwändig. Die menschlichen Eigenschaften, wie zum Beispiel rasche Ermüdung und Konzentrationsschwächen, führen dazu , viele Fehler zu übersehen . Daher sind ausschließlich manuelle Tests nicht für häufige Releases geeignet, wie sie in der agilen Softwareentwicklung jedoch üblich sind.

Seit längerem gibt es deshalb Ansätze,  systematisch Tests zu entwickeln und diese sukzessiv zu automatisieren. Dieses Vorgehen gibt uns die Gewissheit, dass wir auf dem Weg der Implementierung eines Anwendungsfalles keine Fehler machen. Die automatisierten Tests stellen sicher, dass die wichtigsten Geschäftsprozesse nach Änderungen des Codes weiter korrekt funktionieren werden.

Zusätzlich wird durch die Testautomatisierung der gesamte Entwicklungsprozess beschleunigt. Nicht alle Schritte lassen sich automatisieren. In der Praxis hat sich gezeigt, dass eine Zusammenarbeit von automatisierten und manuellen Tests an den richtigen zuvor definierten Stellen die größtmögliche Sicherheit für technisch und fachlich korrekt funktionierende Software bietet.

Welche Vorteile bietet das automatische Testen genau?

Was sind die Vorteile von Testautomatisierungen?

  • Das automatische Testen aller Prozesspfade, Felder und Szenarien ist zeit- und kostensparend
  • Mehrsprachige Websites können leichter getestet werden
  • Automatisierung erfordert kein menschliches Eingreifen. Die automatisierten Tests können unbeaufsichtigt durchgeführt werden (z.B. über Nacht).
  • Die Automatisierung erhöht die Geschwindigkeit der Testausführung
  • Durch die Automatisierung wird die Testabdeckung erhöht
  • Es besteht nicht die Gefahr, dass Tests zur Routine werden, da die Tests automatisch durchgeführt werden
Manuelles Testen Automatisiertes Testen
Manuelle Tests erfordern menschliches Handeln für die Testausführung. Beim Automatisierungstest werden Tools zum Ausführen von Testfällen verwendet
Manuelle Tests erfordern Fachkräfte, viel Zeit und verursachen hohe Kosten. Automatisierte Tests sparen Zeit, Kosten und Arbeitskräfte. Nach der Erstellung ist es einfacher, eine automatisierte Testsuite auszuführen
Jede Art von Anwendung kann manuell getestet werden. Bestimmte Testtypen wie Ad-hoc- und Affentests eignen sich besser für die manuelle Ausführung. Automatisierte Tests werden nur für stabile Systeme empfohlen und werden hauptsächlich für Regressionstests verwendet
Manuelle Tests können sich durch häufiges Wiederholen negativ auf die Konzentration auswirken und somit kein valides Ergebnis erzielen. Der langweilige Teil, immer wieder dieselben Testfälle auszuführen, wird von durch Automatisiertes Testen erledigt.

Was sollte vor der Durchführung von Testautomatisierungen beachtet werden? 

 

Um eine Strategie zur Umsetzung von Tests zu entwickeln ist es wichtig, vor dem eigentlichen Testen eine Teststrategieprozess zu finden und niederzuschreiben. Hier wird festgelegt, was die Ziele sind und wie diese erreicht werden sollen.

Folgende Schritte sind zur praktischen Umsetzung der Teststrategie notwendig:

  • Priorisierung und Bewertung der Kernfunktionalitäten der Anwendung (Was soll getestet werden?)
  • Tests schreiben, ordnen und organisieren (Einführen von Microsoft Azure Testplans)
  • Transparenz, Rückverfolgbarkeit und eine Kontrolle des Testprozesses schaffen, um qualitativ hochwertige Software bereitzustellen. (Integration der Tests in den agilen Kanban Workflow)
  • Automatisierte Prozesse zur regelmäßigen und dauerhaften Sicherung der Qualität aufbauen
  • Dokumentation des Fortschritts

Wie werden die Kernkomponenten bei Testautomatisierungen bestimmt? 

 

Um eine unbekannte Anwendung möglichst effektiv testen zu können ist es wichtig die Komponenten zu bestimmen, welche für das Automatisieren der Tests relevant sind.

Eine Möglichkeit besteht darin vorab für die einzelnen Elemente die Wahrscheinlichkeit der Fehlerhaftigkeit zu ermitteln, und die Schwere der Auswirkungen in diesem Fall zu definieren.

Die Elemente aus der Gruppe mit der kleinsten Risikoprioritätszahl werden intensiv getestet, die der folgenden Gruppen (mit steigendem Wert) in Abstufungen weniger intensiv getestet.

Gewicht ++ 1 + 2 o 3 – 4 –5 Testaufwandsklassifizierung
sehr hoch 1 1 2 3 4 5 1 – intensiv
hoch 2 2 4 6 8 10 1 – intensiv
mittel 3 3 6 9 12 15 2 – solide
gering 4 4 8 12 16 20 3 – oberflächlich
sehr gering 5 5 10 15 20 20 4 – bei Gelegenheit

Testautomatisierungen: Umsetzung des Testkonzepts  

Die Pyramide der agilen Testautomatisierung 

Die Umstellung auf agile Prozesse hat viele Teams dazu veranlasst, eine Pyramidenteststrategie zu verfolgen. Die Pyramide sieht demnach häufig so aus, wie hier dargestellt.

An dieser Stelle möchte ich darauf hinweisen, dass es sehr viele verschiedene Ansätze und Meinungen darüber gibt, welche die richtige Strategie in Bezug auf agiles Testen ist. Wer sich näher mit dem Thema beschäftigen möchte, sollte sich den Artikel „Why the test pyramid is a bullsh*t(von Mateusz Roth) durchlesen.

Fest steht: Nur eine Kombination verschiedener Testtypen kann die gleichbleibende Qualität einer Software gewährleisten.

Wie in Abbildung 1 der Testpyramide gezeigt, bilden Unit-Tests idealerweise eine breite Basis. Durch diese Tests wird ein guter Eindruck davon vermittelt, was in einzelnen Klassen oder ähnlich kleinen Codeanteilen passiert. Integrationstests stellen die Interaktion zwischen Komponenten sicher.  

Die End-to-End-Tests oder UI Tests sollen sicherstellen, dass der gesamte Programmablauf von Anfang bis Ende getestet wird. Weiterhin soll das Verhalten der Nutzer möglichst realitätsnah abgebildet werden. Nachfolgend möchte ich besonders auf die E2E Tests eingehen, da diese im Zeitalter der agilen Entwicklung und kontinuierlichen Integration an Relevanz gewonnen haben. Der Entwickler muss heutzutage garantieren, dass die Anwendung fast zu jedem Zeitpunkt ausgeliefert werden kann. 

Lange Testphasen vor der Freigabe sind ein Hindernis. Daher ist eine höchstmögliche Testabdeckung erforderlich, um Fehler, die während des Entwicklungsprozesses auftreten, direkt zu erkennen und zu korrigieren. 

Die ersten umzusetzenden Tests sollen feststellen, ob die wichtigsten Funktionen des Programms fehlerfrei sind, ohne jedoch einzelne Details zu berücksichtigen. Ein täglicher Build und ein Smoke-Test könnten im Projekt zum Beispiel die Zielsetzung sein.  

Testautomatisierung: Smoke Tests vs. Sanity Tests 

Smoke Tests Sanity Tests
Smoketests stellen sicher, dass die kritischen Funktionen des Programms einwandfrei funktionieren Sanity Testing wird zur Überprüfung der Fehlerbehebung durchgeführt durchgeführt, um zu überprüfen ob die neuen Funktionen/Fehler behoben wurden
Ziel dieser Tests ist es, die „Stabilität“ des Systems zu überprüfen, um strengere Tests durchführen zu können Ziel dieser Tests ist es, die „Rationalität“ des Systems zu überprüfen, um strengere Tests durchführen zu können
Die Smoketests überprüfen das gesamte System von Ende zu Ende. Bei Sanity-Tests wird nur eine bestimmte Komponente des gesamten Systems überprüft
Smoketests sind gleichzusetzen mitallgemeinen Gesundheitsuntersuchungen Sanity Testing gleicht einerspezialisierten Gesundheitsuntersuchung

Bevor mit dem eigentlichen Automatisieren der Tests begonnen werden kann, müssen zuvor noch einige Schritte erledigt werden:

Das Automatisieren von E2E- Tests bringt eine Reihe an Herausforderungen mit sich. Zwei der meistgenutzten Testframeworks im E2E Bereich sind Protractor und Cypress.  

Eines der größten Probleme von Protractor ist jedoch, dass es sich nicht wie ein normaler User verhält und ein solches Verhalten nur kompliziert, mit hohem programmatischem Aufwand zu erreichen ist. 

 

Das relativ neue Framework Cypress versucht, dieses Problem mit einer neuen Philosophie und einer neuen Architektur zu lösen. Wie in der unteren Grafik zu sehen ist, erfreut sich Cypress bei Github einer immer größeren Beliebtheit. 

Welche Tools können für die Testautomatisierung genutzt werden? 

Protractor: Das meistverbreiteste Tool für die Testautomatisierung? 

Protractor ist eines der meistverbreiteten End-to-End-Testframeworks für Angular Anwendungen. Mit Hilfe des Frameworks können Angular Apps als auch Websites und Webanwendungen getestet werden die nicht auf Angular aufbauen. Es basiert auf WebdriverJS und Selenium und läuft im Kontext von Node.js.

Protractor konzentriert sich auf verhaltensgesteuerte Tests (BDT) und wird standardmäßig mit dem Javascript Framework Jasmine ausgeliefert.

Dies bedeutet nicht, dass man nur auf Jasmin beschränkt ist. Aalternativ oder zusätzlich kann man es gemeinsam mit anderen BDT-Frameworks (wie Mocha und Cucumber) verwenden.

So installierst du Protractor richtig

Da Protractor auf Node aufbaut, muss zunächst Node.js installiert werden. Zusätzlich besteht eine Abhängigkeit zumwebdriver-manager“, um den Selenium-Server ausführen zu können (fast jedes e2e-Tool verwendet Selenium).  

Die Abhängigkeiten können in einer Angular Anwendung über die package.json definiert werden. 

Nachdem Protractor installiert ist, sollte ein Test-Framework definiert werden. Wie zuvor erwähnt verwendet Protractor dafür standardmäßig Jasmine. Man kann allerdings auch diverse andere Frameworks wie Mokka, Qunit oder Karma verwenden. Dann muss allerdings noch zusätzlich eine Assertionsbibliothek ausgewählt werden, wie Chai oder Expect.js. Zum mocken können Bibliotheken wie Sinon oder TestDouble hilfreich sein.  

Nach erfolgreicher Konfiguration und nachdem der erste Test geschrieben wurde, passiert beim Ausführen folgendes: 

Testautomatisierung: Vor- und Nachteile von Protractor 

 

Unsere Tests senden Requests an den Selenium-Server, um die Benutzerinteraktion im lokalen Browser zu simulieren. Selenium führt Testskripte also außerhalb des Browsers auf dem Selenium-Server aus. Die Kommunikation mit dem Browser erfolgt über die Rest-Schnittstelle. Abhängig von der Umgebung oder der Systemlast kann die Ausführungszeit jedoch länger als erwartet sein. Die asynchrone Verarbeitung erhöht zudem die Komplexität des Testcodes erheblich.  

Es ist oft schwierig, die richtige Wartezeit für asynchrone Vorgänge zu definieren: Eine zu lange Wartezeit wirkt sich nachteilig auf die Gesamtdurchsatzzeit aus. Eine zu kurze Wartezeit kann zu Inkonsistenzen und zu sogenannten „Flaky-Tests“ führen. Obwohl keine Änderung vorgenommen wurde, wird der Test manchmal erfolgreich ausgeführt und ein anderes Mal schlägt er fehl. 

Ein weiteres Problem von Protractor ist, dass es seit mehreren Jahren nicht mehr aktiv aktualisiert wurde. Es gibt keine größeren Verbesserungen, keine Fehlerkorrekturen und keine Dokumentationsaktualisierungen. Im Haupt-Repository gibt eine große Anzahl alter Probleme und seit Monaten wurden keine Commits mehr eingereicht. Auch die Doku ist teils veraltet oder man stößt auf ungelöste, langjährige Probleme. 

In Zukunft wird es eine weitere Hürde geben: In Protractor 5 werden Promises unter Verwendung des Kontrollflussmechanismus synchronisiert. Dies wurde allerdings aus der Selenium-Webdriver-Bibliothek in Version 4 entfernt. Das bedeutet, dass Protractor nach dem Upgrade auf Selenium-Webdriver 4 die Kontrollflussmechanismen ebenfalls nicht mehr unterstützen wird. Daher müssen alle Tests zukünftig mit async / await neu geschrieben werden.

Testautomatisierung: Fazit Protractor 

 

Die Verwendung von async / await gibt zwar ein besseres Verständnis und mehr Kontrolle über asynchrone Vorgänge, für Entwickler kann es jedoch schwieriger sein, zu diesem neuen Stil zu wechseln, wenn sie nicht damit vertraut sind. Jeder Browseraufruf muss also mit dem Schlüsselwort await aufgerufen werden. Das Fehlen eines einzigen await führt zu fehlerhaften und unvorhersehbaren Tests. 

Async / await wird kommen. Das Problem hierbei ist, dass wir nicht exakt wissen wann dies passiert. Protractor 6 wurde aufgrund einiger kritischer Probleme nie freigegeben. Und es gibt noch keine offizielle Aussage wann eine neue Version verfügbar sein wird.

Cypress: So machen automatisierte Test Spaß. 

 

Mit Cypress soll es Entwicklern erleichtert werden E2E-Tests zu schreiben, um mehr Spaß am Testing zu bekommen. Der grundlegende Gedanke dabei ist, dass das Schreiben von Tests simpler gestaltet werden soll. In Folge dessen wird die Anzahl an  Tests steigen, der Arbeitsaufwand für das Anfertigen eines Tests jedoch reduziert.

Dank der umfangreichen Dokumentation des Frameworks können die ersten Basistests sofort durchgeführt werden. Cypress kann für alle modernen JavaScript-Frameworks verwendet werden – von React über Angular und Vue bis hin zu alten Anwendungen, die auf dem Server gerendert werden. 

Derzeit gilt das Selenium-Framework als aktueller Standard für E2E-Tests. Es bildet die Basis des gesamten modernen E2E-Frameworks (z. B. auch für Protractor).  

Cypress verzichtet auf die Verwendung von Selenium. Stattdessen führt Cypress den Testcode im selben Kontext wie den Anwendungscode aus:  

Testautomatisierung: Vor- und Nachteile von Cypress 

Vorgenanntes bedeutet, dass die Tests direkt im Browser ausgeführt werden. Das Verhalten entspricht der Interaktion eines echten Users.. Die Tests werden im gleichen Ausführungskontext wie die zu testende Anwendung ausgeführt. Aufgrund dessen kennt Cypress immer den aktuellen Status der Anwendung, z. B. auch die zur Testzeit ausgeführten Ajax Requests.

Hierdurch lassen sich typische Fehler, die durch Asynchronität entstehen, vermeiden. Beispielsweise wenn ein DOM-Element auf der Seite ausgewählt wird, die erforderliche Antwort vom Backend aber auf sich warten lässt oder eine Animation noch nicht vollständig ausgeführt wurde.

Die programmatische Umsetzung der Tests hat in der Vergangenheit in Frameworks wie Protractor gerade bei unerfahrenen Programmierern immer wieder zu Verwirrung geführt, da die Tests, bei gleichbleibender Codebasis und Ausführung, inkonsistente Testergebnisse aufweisen konnten. Cypress zeigt auch dann seine Stärke, wenn der Test das auszuwählende DOM-Element nicht findet. In diesem Fall wartet Cypress auf das Erscheinen des Elements, bis das festgelegte Zeitlimit überschritten wird.

Die Arbeit mit Cypress ist einfach und  vergleichbar mit der Verwendung von Selektoren in JQuery. Cypress ist schneller und stabiler als Selenium, und kann von der Ausführung innerhalb der Anwendung profitieren.

 

Die Arbeit mit Cypress ist einfach und in vergleichbar mit der Verwendung von Selektoren in JQuery. Cypress ist schneller als Selenium, stabiler und kann von der Ausführung innerhalb der Anwendung profitieren.  

Testautomatisierung: Fazit Cypress 

Bevor die Entscheidung getroffen wird Cypress zu nutzen, sollte man sich über dessen Einschränkungen bewusst sein. Da Cypress intern in einem Browserkontext ausgeführt wird, hat es keinen Zugriff auf externe Funktionen, wie zum Beispiel die Verwendung von IFrames, Verwaltung mehrerer geöffneter Fenster oder Tabs.  

Das Testen von Fileuploads als auch das Testen von nativen Maus- und Tastaturereignissen ist ebenfalls nicht möglich. Eines der größten Mankos von Cypress ist allerdings die fehlende Crossbrowserfähigkeit. Zurzeit werden lediglich auf Chromium basierende Browser unterstützt. Die Unterstützung für Internet Explorer entfällt komplett und die Kompatibilität für Firefox befindet sich im beta Status. 

 

Protractor und Cypress im Vergleich 

Bei der Wahl des Frameworks ist ein wichtiger Faktor die Installation.. Bei Protractor ist eben diese der kompliziertere Teil bei dessen Verwendung. Es muss aus vielen Frameworks und Tools gewählt werden. Cypress bietet das alles in einem.

Mit Cypress lassen sich erste Tests sehr schnell programmieren. Egal, ob es für ein neues Projekt oder für ein bereits bestehendes mit breiter Codebasis eingesetzt wird. Es gibt zurzeit kein vergleichbares Tool am Markt, welchem man in wenigen Minuten in der Lage ist, die Testprogrammierung zu beginnen.

Das liegt unter anderem auch daran, dass sich die gesamte Dokumentation an einer Stelle befindet. Während der Arbeit mit Protractor hingegen, sind die Dokumentationen verteilt zu finden. Für Fragen zum Framework muss in der Dokumentation Jasmine nachgesehen werden. Bei Fragen zum Assertion Framework muss die Dokumentation von Chai hinzugezogen werden und so weiter. Nach einer Weile gewöhnt man sich daran, doch für einen schnellen Einstieg gestaltet es sich hinderlich.

 

 

Fazit Testautomatisierung 

 

Der Grund warum viele Entwickler Teams sich von End-2-End-Tests wieder entfernen, sind komplizierte, fragile Tests. Wenn Tests zerbrechlich werden, nimmt das Team sie nicht mehr ernst und wird die Tests in der CI Pipeline deaktivieren. 

Einer der größten Vorteile von Cypress ist jedoch, dass Tests einfach und intuitiv zu schreiben sind und dass Befehle und Assertions für eine bestimmte Zeit wiederholt werden, bis sie funktionieren bzw. die Werte übergeben wurden.  

All diese Punkte sind in Cypress integriert, sodass jeder Befehl und jede Assertions für die angegebene Zeit wiederholt wird. Dadurch wird sichergestellt, dass die Tests so stabil funktionieren, als ob ein echter Benutzer testen würde. Für die Zukunft bleibt zu hoffen, dass die Crossbrowserfähigkeit von Cypress weiter ausgebaut wird, damit dieses innovative Tool sich noch stärker durchsetzen kann. 

Hanno Rippe
Hanno Rippe

Herr Rippe ist ein Frontend Developer und verfügt über mehr als 8 Jahre umfangreicher Projekterfahrung in den Branchen Luftfahrt, Werbung, Verlagswesen, Touristik, Essen und Trinken, Immobilien, E-Commerce und Finanzdienstleistungen. Seine IT-Laufbahn begann er als Entwickler mit Projekten im Werbeumfeld. Während dieser Zeit hat Herr Rippe kreativ, innovative Ideen mit den neuesten Techniken der Frontend Entwicklung umgesetzt. Der Wandel von statischen, zu dynamischen, auf Mobilgeräte optimierten Anpassungen als auch Neuentwicklungen von Internetauftritten zählten, im anschliessenden Wechsel, zur Immobilienbranche zu seinem Spezialgebiet. Die suk­zes­si­ve, agile Entwicklung des Java basierten Portals, innerhalb eines Scrum Teams, stand dabei im Mittelpunkt. Während der anschliessenden Zeit bei Seven Principles hat er umfangreiche Kenntnisse sowohl als Frontend Entwickler von Java basierten Web Portalen, als auch als Berater mit direktem Kundenbezug erworben. Zuletzt war Herr Rippe im Bereich Agiles Testmanagement beschäftigt. Durch die Ausbildung zum Mediengestalter ist er nicht nur auf die Programmierung beschränkt. Er hat ein offenes Auge für gutes Design und das optimieren von Workflows.


Diesen Artikel teilen:

Das könnte Sie auch interessieren: