Testing in Zeiten agiler Entwicklung

Wie Testautomatisierung immer mehr Deployments in immer kürzerer Zeit ermöglicht.

Im heutigen, agilen Umfeld, wird die Entwicklung immer schneller. Es gibt immer mehr Deployments in immer kürzerer Zeit. Dadurch muss immer mehr, in immer kürzerer Zeit, getestet werden. Hat man ausschließlich manuelle Testfälle in seinem Projekt, so ist der Testaufwand im agilen Projekt nicht mehr zu leisten.

Testautomatisierung zur Reduzierung des manuellen Aufwands

Testautomatisierung kann hier eine Lösung sein. Durch automatisierte Regressionstests kann der manuelle Testaufwand im Projekt stark reduziert werden. Es gibt verschiedene Ansätze zur Testautomatisierung. Je nach Arbeitsweise im Projekt und Testtyp, gibt es unterschiedliche Werkzeuge und Vorgehensweisen.

Verbreitete Arten der Automatisierung: Oberflächentests, Last- und Performancetests, Unit Tests und Schnittstellentests

Die häufigsten Arten der Automatisierung sind, zum Beispiel Oberflächentests, Last- und Perfomancetests (LuP), Unit Tests oder Schnittstellentests. Bei der Testautomatisierung werden die Testschritte, die vorher manuell durchgeführt wurden, durch einen Automaten ausgeführt. Nehmen wir an, Du möchtest eine Login-Maske testen. Dein manueller Testfall hätte also Schritte, wie “Website öffnen”, “Logindaten eingeben”, “Klick auf Login”. Der Login ist vermutlich bei vielen Testfällen eine Vorbedingung. Der manuelle Tester führt nun also immer wieder die gleichen drei Schritte aus. Überführst Du diesen Testfall nun in einen automatisierten Testfall, so kann sich der Tester diese Schritte sparen. Der Automat führt den Login mit den angegebenen Testdaten durch und validiert die tatsächlichen Ergebnisse. Einmal geschrieben, kannst Du Dein Login-Skript nun in anderen Testfällen wiederverwenden. So erhöhst Du den Modularisierungsgrad und verringerst den manuellen Zeitaufwand.

Die Testpyramide von Cohn

Je nachdem, wie in Deinem Projekt entwickelt wird, welche fachliche Komplexität die Tests haben und welche Kenntnisse die Tester haben, gibt es unterschiedliche Möglichkeiten der Automatisierung.
Vielleicht hast Du schon mal die Testpyramide von Cohn gesehen. Grundsätzlich gilt: Je früher im Projekt Fehler gefunden und behoben werden, desto geringer die Fehlerkosten.
Auf dieser Grundlage zeigt die Testpyramide, von welchen Tests welche Menge sinnvoll ist. Ganz unten, also am breitesten Punkt der Pyramide, stehen die Unit Tests. Hiervon benötigst Du viele. Diese sind einfach zu automatisieren und können direkt vom Entwickler geschrieben werden. Unit Tests haben häufig eine Ausführungsdauer von wenigen Millisekunden.
Die nächste Stufe stellen Komponenten- und Integrationstests dar. Auch hier ist eine Automatisierung sinnvoll und einfach umsetzbar. Hier kann meistens ebenfalls ein hoher Automatisierungsgrad erreicht werden. Auch Komponententests haben meistens eine kurze Ausführungsdauer. Sie können also, zusammen mit den Unit Tests, direkt in den Buildprozess integriert werden, ohne diesen unnötig zu verlängern.
An der Spitze der Pyramide stehen die UI Tests. Ein häufiger Trugschluss ist, dass nur UI Tests automatisiert werden, oder hier zu viel Aufwand in die Automatisierung gesteckt wird. Die Entwicklung kann komplex werden, die Ausführung dauert in der Regel eine Weile. Die Testpyramide soll uns das vor Augen führen. Wichtig ist, für jedes Softwarefeature genau abzuwägen, ob der einmalige Aufwand der Automatisierung einen signifikanten Vorteil gegenüber dem manuellen Testen bietet.

UI-Tests
Service Tests
Unit-Tests

Automatisierte Testfallerstellung

Natürlich ist nicht nur die eigentliche Testausführung automatisierbar. Auch für die Testfallerstellung gibt es Werkzeuge und Methoden zur vereinfachten Erstellung. So gibt es, zum Beispiel ALM Werkzeuge, mit denen sich Testfälle direkt aus Anforderungen heraus generieren lassen, oder Ansätze wie BDD, bei dem durch Keywords die Anforderung ganz einfach direkt in einen automatisierten Testfall überführt wird.
Für gute, wiederverwendbare, automatisierte Testfälle, benötigst Du höchstwahrscheinlich Testdaten.

Testdatengenerierung

Je nachdem in welcher Branche Du tätig bist, muss es sich dabei um anonymisierte Daten handeln. Du kannst häufig nicht einfach einen DB Export durchführen und mit Echtdaten testen.
Auch zur Testdatengenerierung gibt es diverse Tools am Markt, die Deine Daten entweder anonymisieren, Echtdaten mit synthetischen Daten anreichern, oder vollständig synthetische Daten nach einem vorgegebenen Muster generieren. Die meisten klassischen Automatisierungswerkzeuge erstellen die Testdokumentation direkt bei der Ausführung. Diese kann häufig direkt im Tool ausgewertet werden.
Oft wird nach jedem Durchlauf ein Testbericht erstellt, mit dem Du auf den ersten Blick erkennen kannst, wie viele und welche Deiner Tests “grün gelaufen” sind, also erfolgreich waren.
Auch die Sicherheit ist ein nicht zu unterschätzender Aspekt beim Testing. Security Features sollten gerade bei Webanwendungen bei der Testplanung berücksichtigt werden.

Was ist bei der Umsetzung/Durchführung einer Testautomatisierung zu beachten?

Planst Du, eine Testautomatisierung aufzubauen, solltest Du einige Dinge beachten. Viele stellen sich eine Lösung vor, in der auf einen Knopf gedrückt wird, und nach wenigen Minuten die komplette Anwendung vollständig durchgetestet ist.

Eine 100%ige Automatisierung ist nicht anzustreben!

Ein Automatisierungsgrad von 100% sollte allerdings in der Regel nicht angestrebt werden. Nicht für jeden Testfall ist es sinnvoll, eine Automatisierung aufzubauen. Schließlich muss eine Automatisierung ebenfalls mit einem gewissen Aufwand entwickelt werden. Für Funktionen, die sich häufig ändern, ist der Aufwand, diese zu automatisieren, häufig höher, als sie einfach manuell zu testen. Du solltest Dir also vor der Einrichtung der Automatisierung Gedanken machen, welche Testfälle automatisiert werden sollen. Im Gegensatz zu manuellen Tests, benötigt man für die meisten Automatisierungswerkzeuge und Methoden technische Kenntnisse.
Gerade bei Oberflächentests ist es in der Regel erforderlich, eine Programmiersprache zu beherrschen. Natürlich gibt es auch Capture & Replay Tools, bei denen einfach der Klickpfad aufgenommen wird.
Hier stößt man jedoch bei komplexeren Tests schnell auf Grenzen, sodass man ohne eigenen Code nicht weit kommt.

Die richtigen Tests sind Spezialistenarbeit

Häufig sind für spezifische Testarten auch Spezialisten nötig. Nicht umsonst gibt es, zum Beispiel für LuP Tester, eine eigene TÜV Zertifizierung. Für manuelle Tests ist dagegen wenig oder gar kein technisches Wissen erforderlich. Der Fachbereich kann die eigenen Anforderungen direkt selber testen. Bevor Du anfängst, Deine Testfälle zu automatisieren, solltest Du auch Dein Testmanagement beachten. Hast Du ein geeignetes Werkzeug, um alle unterschiedlichen Testarten gemeinsam auszuwerten? Sollten die Testfälle im Deployment Prozess automatisiert angestoßen werden?
Am Besten hast Du Antworten auf diese Fragen, bevor Du mit der Automatisierung beginnst.

Ein Testansatz als Beispiel: Behaviour Driven Development

Ein interessanter Ansatz, um das Testmanagement näher an die Entwicklung zu bringen, ist Behaviour Driven Development (BDD).
Bereits bei der Anforderungserstellung wird das Testing einbezogen. Testfälle lassen sich direkt aus den Anforderungen ableiten. Sprachen wie Gherkin sind auf BDD spezialisiert und machen die Testautomatisierung sehr einfach.

Keine tiefen Kenntnisse von Programmiersprachen erforderlich

Mittels Keywords, wie GIVEN, WHEN, THEN wird die Automatisierung aufgebaut. Dadurch ist die tiefe Kenntnis von Programmiersprachen zur Testautomatisierung nicht mehr erforderlich. Weitere Werkzeuge zur Automatisierung hängen von der gewünschten Testart ab. Unit Tests werden in der Regel vom Entwickler geschrieben. Hierfür gibt es Frameworks wie JUnit, um diese zu automatisieren.
Für API Tests gibt es Werkzeuge, wie zum beispiel SoapUi. Hier gibt es eine kostenlose Version. Nicht über den Namen wundern – auch REST APIs können mit SoapUi getestet werden.

Tools zur Automatisierung von Oberflächentests

Zur Oberflächenautomatisierung gibt es eine ganze Reihe von Tools. Bekannt ist, zum Beispiel Selenium, Ranorex oder HP UFT.
Für Selenium sind Programmierkenntnisse zwingend erforderlich, dafür ist es kostenfrei. Ranorex beispielsweise bietet eine Capture & Replay Funktionalität, mit der Du Deine UI Tests einfach aufzeichnen kannst. Das System hinter Last kann kostenlos mit JMeter von Apache getestet werden.
Ist das Budget kein Problem, gibt es für LuP Tests auch LoadRunner oder NeoLoad.

Tools zur Continuous Integration

Nutzt man Werkzeuge zur Continuous Integration, wie zum Beispiel Jenkins, lassen sich einige Tests direkt beim Deployment ausführen. Möchtest Du eine App oder mobile Anwendung testen, so kannst Du das mit einigen Werkzeugen abbilden. Ranorex zum beispiel hat eine Möglichkeit zum mobilen Testen integriert. Werkzeuge wie Appium bauen auf anderen Werkzeugen oder Frameworks auf (in diesem Fall Selenium), um diese für mobile Tests zu erweitern.

Testmanagement und Co

Auch zum Testmanagement gibt es diverse Werkzeuge am Markt. Die meisten Automatisierungswerkzeuge bringen eine Testfallverwaltung und einfache Reporting-Funktionen mit. Will man darüber hinaus weitere Verwaltungsfunktionen nutzen, kann es Sinn machen, ein Werkzeug dafür anzuschaffen. Interessant sind in dem Kontext auch Application Lifecycle Management (ALM) Lösungen, wie Microfocus ALM (ehemals HP ALM), Microsoft Team Foundation Server, oder aqua. Diese Werkzeuge geben Dir die Möglichkeit, den gesamten Produkt-Lebenszyklus in einem Tool abzubilden.
Du kannst Anforderungen verfassen, Fehler erstellen und natürlich Testfälle ausführen. Einige Tools binden dafür ihre eigenen Automatisierungswerkzeuge an, andere Werkzeuge steuern beliebige Werkzeuge, die auf dem Markt verfügbar sind. Es gibt Auswertungsmöglichkeiten, wie ein Berichtswesen, oder Dashboards. Der Vorteil bei der Verwendung von ALM Tools ist, dass Du Medienbrüche vermeidest, und alles an einer Stelle ausgewertet werden kann, auch wenn Du viele verschiedene Technologien miteinander verknüpfst.

Die Entwicklung geht in Richtung Continuous Deployment

Testautomatisierung ist ein wichtiger Schritt in Richtung Continuos Deployment. Dies ist aus der heutigen Zeit nicht mehr wegzudenken. In den meisten Fällen ist Testautomatisierung eine wichtige Ergänzung zu manuellen Tests. Vollständig ersetzen kann sie das manuelle Testen aber zum heutigen Zeitpunkt noch nicht.

Rückmeldungen