Software Testing ist etwas für Warmduscher!?

Mehr Softwarequalität durch richtiges Testing

Häufig hört man Sprüche wie „Wir arbeiten ja agil und dadurch werden die wichtigsten Teile der Software ohnehin frühzeitig entwickelt. Somit testen wir diese Funktionen im Laufe des Projektes oft genug.“ … oder … „Das manuelle Testen reicht völlig, das automatisierte Testen ist viel zu aufwändig und bringt uns im Projekt nicht weiter.“

Besonders oft werden diese Aussagen verwendet, wenn der Zeitplan eng oder Ressourcen knapp sind.
Welche Auswirkungen das hat und den Stellenwert von Software Testing bei solvistas zeigt Ihnen dieser Beitrag.    

Continuous Testing

Eine weitverbreitete Ursache für Probleme mit Softwareprojekten ist, dass unter Druck das Testen vernachlässigt oder reduziert wird. Dies führt zu Fehlern, die dann im bereits ausgelieferten Release zu beheben sind, was deutlich teurer ist als die Behebung eines früh erkannten Fehlers.

Mit der Einführung agiler Methoden in der Softwareentwicklung hat sich auch „continuous testing“ als Teil von „continuous integration“ oder „continuous delivery“ etabliert. Dabei wird versucht, möglichst viele Tests zu automatisieren und Fehler frühestmöglich aufzudecken sowie nachhaltig zu beheben. Für neue Bugs werden neue Tests entwickelt und durch automatisiertes Testen das erneute Auftreten verhindert. Ein Lieferobjekt wird nur dann ausgeliefert, wenn keine Fehler mehr festgestellt wurden.

Je nach Wert für den Kunden oder der Bedeutung für das System macht es auch Sinn, hier Abstufungen zu treffen. Mindestens die wichtigsten 20-30% des Software-Systems sollten, wenn möglich, vollständig automatisiert getestet werden. Dies beginnt idealerweise bei der Beschreibung der Anforderungen in Form von User-Stories, deren Akzeptanzkriterien ausdrücken, wann die Anforderung erfüllt ist. Mittels Test-getriebener Entwicklung (TDD – test-driven development) werden vom Entwickler-Team zuerst die Komponententests (Unit-Tests) erzeugt, noch bevor die Komponenten in der Software realisiert werden. Dies trägt auch dazu bei, dass die User-Stories auf korrektes Verständnis überprüft werden, bevor die Arbeit an den Komponenten so richtig beginnt. Die tatsächliche Fertigstellung der Komponenten ist dann auch durch die erfolgreich laufenden Unit-Tests sichergestellt. Allerdings muss dies nicht die Erfüllung aller Akzeptanzkriterien bedeuten, weil etwa die korrekte Darstellung am Frontend oder die Geschwindigkeit auf diese Weise selten getestet werden kann.

Sehr ähnlich kann mittlerweile auch für das Frontend vorgegangen werden. Die Anforderungen an die Benutzeroberfläche (=Userinterface oder UI) werden in Form von Prototypen spezifiziert, was die Akzeptanz bei den AnwenderInnen maximiert. Auf Basis eines Prototyps wird bereits mit ersten UI-Tests begonnen. Dabei gibt es folgende Vorgehensweisen:

  • Applikations-orientiertes Testen: die Benutzeroberfläche wird systematisch durchnavigiert und für jede Maske werden UI-Tests entwickelt
  • User-story-orientiertes Testen: für die User-Stories mit Akzeptanzkriterien für die Benutzeroberfläche werden UI-Tests erstellt
  • Gemischte Vorgehensweise

Dabei hat sich auch hier das User-Story-orientierte Vorgehen bewährt. Für die wichtigsten User-Stories werden automatisierte UI-Tests entwickelt. Dazu werden bei solvistas meist Werkzeuge wie Protractor oder Selenium eingesetzt. Beispiel: Im Projekt solTicketing für den EHC Black Wings Linz wurden bereits in der ersten Version Funktionen wie die Bestellung von Saisonkarten und der Online-Kauf von Tages-Tickets mit Protractor-Tests abgesichert.

Das führt uns zum nächsten Problem: es reicht nicht, alle Tests zu automatisieren oder nur die EntwicklerInnen testen zu lassen. Manuelle Tests sind in einer rechtzeitig gestarteten Testphase mit guten TesterInnen durchzuführen. Es sollte TesterInnen geben, die mit den zukünftigen AnwenderInnen vergleichbar sind.

Planung ist das halbe Leben – besonders beim Testen

Mit der steigenden Komplexität von Software-Systemen muss die Softwarequalität und damit auch das Testen immer besser konzeptioniert und geplant werden. In einer modernen Web-Applikation muss das Software-Architekten- und Software-Entwickler-Team viele Faktoren berücksichtigen:

  • Funktionierende Abläufe und korrekte Berechnungen via Komponententests
  • Frontend- und Usabilitytests für korrekte und optimierte Darstellung auf dem entsprechenden Endgerät
  • Last- und Performancetests für Stabilität und Sicherheit, wenn viele User gleichzeitig das System benutzen

Damit diese Faktoren im System effizient getestet werden können, sollten diese Tests bereits zu Beginn des Projektes geplant und festgelegt werden. Für einige Punkte ist es sinnvoll und mittlerweile auch üblich, diese automatisiert zu testen. Allerdings können bestimmte Bestandteile oft nur manuell getestet werden. Dies wird im Abschnitt Integrationstests näher erläutert.

Test des integrierten Systems

Vor einem Release müssen alle Bestandteile gemeinsam getestet werden. Zu diesem Zeitpunkt müssen sämtliche automatisierte Tests funktionieren und sind somit eine gute Basis. Für die nun folgenden manuellen Tests ist es wichtig, diese Testphasen zeitlich einzuplanen, um die Verfügbarkeit von Testpersonen und -Ressourcen sicherzustellen:

  • Release Planung mit Meilensteinen als Grundlage
    • Feature Freeze: ab dem Start der Tests werden nur noch Fehler behoben. Dies hilft einerseits dem Entwickler-Team sich auf Bugs zu konzentrieren, andererseits ist es für das Tester-Team einfacher, wenn sich die Software nicht ständig ändert.
    • Testsystem ist mit Feature Freeze vorbereitet. Das Testsystem sollte möglichst genau dem Produktiv-System entsprechen.
    • Testplan für manuelle Tests auf Basis von User-Stories und Szenarien ist erstellt. Die Testszenarien sollten gut vorbereitet sein und den wesentlichen Nutzen der Software absichern. Speziell konzentriert man sich auf Tests, die nicht automatisiert durchgeführt werden können.
  • Testphase mit ausreichend Zeit für Test und Problembehebung (vor dem Release)

Fazit

Autor: Gerald Holzbauer

Unsere Conclusio: das richtige Software Testing wird umso wichtiger, je komplexer ein Software-System ist. Neben continuous testing und der Automatisierung von Komponenten- und UI-Tests ist aber auch ein sogenannter Integrationstest unerlässlich. Die Erfahrungen aus unseren Projekten zeigen uns, dass dabei die Planung und Vorbereitung entscheidend für einen erfolgreichen Test ist. Früh erkannte und behobene Fehler erzeugen nicht nur weniger Kosten, sondern steigern die Software-Qualität und somit die Akzeptanz bei dem/der AnwenderIn sowie die Zufriedenheit des Kunden.