Ein großer Käfer an einer Fensterscheibe.

Test-Automatisierung

Warum testen?

Fehler sind in der Software-Entwicklung unvermeidbar. Sie treten in allen Bereichen eines Projektes während der Entwicklung, der Systemintegration, bei Updates, der Wartung und im schlimmsten Fall im produktiven Einsatz auf.

Fehler entstehen nicht nur durch Unachtsamkeit. Die Komplexität von Software, ungenaue oder falsch verstandene Anforderungen, Fehlkonfigurationen, Toleranzen oder inkompatible Schnittstellen führen häufig zu Problemen, die nicht sofort sichtbar werden, sondern erst im Zusammenspiel auftreten.

Tests sollen Fehler sichtbar machen. Sie loten Grenzen und Sonderfälle aus. Tests sollen Fehler vermeiden helfen und mit erfolgreichem Abschluss die reibungslose Verwendbarkeit der Software absichern und bestätigen.

Warum automatisiert testen?

Die Erstellung von Tests kostet Zeit! Die manuelle Ausführung kostet noch viel mehr Zeit. Automatisierte Tests können in verschiedenen Konstellationen immer wieder erneut ohne nennenswerte Kosten ausgeführt werden. Sie können als in Code geschriebene Anforderungen Funktionalität besser beschreiben als jede manuell erstellte, technische Dokumentation.

Manuell ausgeführte Tests können Software nur von außen als geschlossenes System betrachten, sie haben keinen Zugriff auf innere Zustände des Systems. Automatisierte Tests können auf granularer Ebene einzelne Methoden einer Klasse, das Zusammenspiel von Systemkomponenten oder auch ganze Systeme und Oberflächen abbilden.

Manuell durchgeführte Tests sind durch den Faktor Mensch fehleranfälliger. Sie hängen häufig von der Qualität der vorgegebenen Testanforderung und der Erfahrung des einzelnen Testers ab. Die manuelle Erstellung von Testberichten, basierend auf den erhaltenen Testergebnissen erlaubt ebenfalls Interpretationsspielräume.

Automatisierte Tests werden immer gemäß ihrer Definition auf dem gewählten System ausgeführt. Ob in der Entwicklungsumgebung zum Refactoring durch den Entwickler gestartet, auf dem Build-Server nach einer Code-Änderung automatisiert aufgerufen oder in regelmäßigen Abständen im Test- oder QA-System ausgeführt. Sie liefern Testergebnisse immer in gleichbleibender Qualität und können in automatisierten Berichten, z.B. per E-Mail, an verantwortliche Personen weitergeleitet oder auch in Echtzeit auf einem Dashboard oder der Entwicklungsumgebungen dargestellt werden.

Welche Tests werden automatisiert?

Modultests (engl. Unit Test) oder auch Komponententest genannt, prüfen isolierte Funktionalität einzelner Methoden. Sie werden durch den Entwickler, im besten Fall noch vor der Implementierung von funktionalem Code, geschrieben und bilden das Grundgerüst für eine automatisierte Teststrategie. Modultests sind einfach zu schreiben, schnell auszuführen und unterstützen die Entwickler über eine hohe Testabdeckung während des gesamten Lebenszyklus der Softwareentwicklung.

Integrationstests dienen der Prüfung des Zusammenspiels verschiedener, von einander abhängiger Module. Sie werden meist als Reihe aufeinander abgestimmter Testfälle umgesetzt und benötigen häufig Testdaten, um erfolgreich ausgeführt werden zu können. Neben Modultests, sind Integrationstest ein wichtiger Bestandteil der automatisierten Teststrategie.

Systemtests prüfen die Interaktion ganzer Teilsysteme bis hin zum Gesamtsystem eines Software-Produktes. Neben der Funktionalität einzelner Teilaspekte des zu testenden Systems (Funktionaler Test) werden auch Benutzbarkeit, Sicherheit und Performanz (Nichtfunktionaler Test) überprüft. Systemtests sollten möglichst auf einem Testsystem ausgeführt werden, das dem Umfang und der Performanz des Produktivsystems nahekommt, um validierbare Testergebnisse zu erzielen. Aufgrund ihrer Komplexität und einer Beschaffenheit (siehe Nichtfunktionaler Tests), lassen sich Systemtests nur bedingt und mit hohem Aufwand automatisiert durchführen. Sie bilden daher den Abschluss der automatisierten Teststrategie.

Akzeptanz- oder auch Abnahmetests (engl. User Acceptance Tests) prüfen das gesamte Produkt aus der Sicht des Anwenders und dienen der Projektabnahme. Als wichtiger Teil einer ganzheitlichen Teststrategie sind sie Bestandteil des Anforderungsmanagements. Im Gegensatz zu den bisher genannten Tests, werden sie nicht automatisiert, sondern über einen repräsentativen Durchschnitt von Nutzern der Zielgruppe ausgeführt.

Testorientierte Entwicklung

Software wird häufig nur unter funktionalen Gesichtspunkten entwickelt und erfüllt dann nicht alle Aspekte für eine testorientierte Entwicklung. Dies führt häufig zu schwer umzusetzenden Tests und zu einer geringen Testabdeckung insgesamt.

In der testorientierung Entwicklung werden Anforderungen an Funktionalität immer auch im Hinblick auf Testbarkeit betrachtet und zusammen mit den benötigten Tests umgesetzt. Diese Herangehensweise kann weiterführen in eine testgetriebene Entwicklung, in der grundsätzlich Tests vor der funktionalen Implementierung geschrieben werden. Dieser Entwicklungsansatz fördert nicht nur eine hohe Testabdeckung, sondern erhöht auch die Code-Qualität.