Testverfahren zur Qualitätssicherung in der Software-Entwicklung
Wer suchet, der findet
Die zitierte Redensart hat im Bereich der Software-Entwicklung eine besondere Bedeutung. Der Prozess der Qualitätssicherung besteht zu einem wesentlichen Teil aus der Suche nach Programmfehlern. Und bei praktisch jedem Programm lassen sich Fehler beheben. Diese müssen dokumentiert, bewertet und behoben werden. Denn: Je weniger Fehler das Endprodukt hat, desto höher ist die Qualität des Programms und desto zufriedener ist der Kunde.
Qualitätssicherung beginnt beim Programmieren
Der Programmierer einer Software selbst ist die erste Instanz der Qualitätssicherung. Seine Aufgabe besteht zunächst darin, die Programmfunktion exakt nach den Vorgaben des Konzepts zu erstellen. Nach der Implementierung muss er die programmierte Funktion mindestens einmal aufrufen und prüfen, ob sie das gewünschte Ergebnis liefert.
Ein beliebtes Verfahren hierfür ist die Programmierung sogenannter Unit Tests. Es handelt sich um Programmerweiterungen, die nur zum Zweck des Tests erstellt werden. Unit Tests schaffen zunächst die Voraussetzungen für einen Test und rufen dann eine spezielle Programmfunktion auf. Anschließend wird das von der Programmfunktion gelieferte Ergebnis überprüft. Stimmt es mit dem erwarteten Ergebnis überein, ist der Test o.k., andernfalls wird von einem Fehler ausgegangen.
Unit Tests werden in der Regel auf der Ebene von mehr oder weniger elementaren Funktionen auf der Ebene der Geschäftslogik oder sogar darunter implementiert. Sie eignen sich daher weniger für das Testen der Benutzeroberfläche, sind aber ein hervorragendes Mittel, um die implementierten Programmfunktionen direkt vom Programmierer selbst testen zu lassen. Bei .NET wird häufig NUnit zur Ausführung von Unit Tests verwendet.
Nach der Fertigstellung: Wer testet?
Ein qualitativ hochwertiges Programm zeichnet sich dadurch aus, dass es den vereinbarten Leistungsumfang und wenig Fehler hat. Im Rahmen der Qualitätssicherung wird zunächst geprüft, ob das Programm die im Realisierungskonzept aufgeführten Leistungsmerkmale enthält.
Im weiteren Verlauf der Qualitätssicherung muss die Stabilität des Programms überprüft werden. Ganz nach dem Motto „Wer suchet, der findet“ wird das Programm zunächst von den Mitarbeitern des Herstellers auf Herz und Nieren überprüft. Gefundene Fehler werden in einem Ticketsystem dokumentiert und vor der Auslieferung des Programms behoben.
Sind alle Fehler behoben, dann wird das Programm auf einem sogenannten Staging-System ausgerollt. Dies sollte genauso aufgesetzt sein wie das spätere Produktivsystem. Auf dem Staging-System testen die Mitarbeiter des Kunden die programmierte Software und möglichst realitätsnahen Bedingungen. Sobald keine Fehler mehr gefunden werden, wird der Kreis der Tester ausgedehnt. Solange es sich um Mitarbeiter des Kunden handelt, spricht man von einem internen Feldtest. Kommen auch externe Partner hinzu, hat der externe Feldtest begonnen.
Der Zyklus von Fehlersuche und Fehlerbehebung ist ein iterativer Prozess, der zu einem immer stabileren Programm führen sollte. Wenn keine neuen Fehler mehr gefunden werden und keine Fehler mehr zu beheben sind, kann das Programm in den Produktivbetrieb gehen.
Testplan und Testprotokoll
Ein Testplan ist ein Dokument, das mehrere Testfälle enthält. Jeder einzelne Testfall besteht aus der Beschreibung einer Folge von Aktionen, die mit dem zu testenden Programm durchzuführen sind. Zu jedem einzelnen Schritt ist also beschrieben, in welcher Reihenfolge der Benutzer klicken, Daten eingeben oder andere Aktionen durchführen soll. Ein wichtiger Bestandteil des Testfalls ist die Nennung des erwarteten Ergebnisses.
Aus der Durchführung eines Testplans entsteht das Testprotokoll. Hierbei notiert der Tester zu jedem erwarteten Ergebnis das beobachtete Ergebnis. Beispiel: Erwartet wird der Wert 5, das Programm zeigt aber den Wert 276 an. In diesem Fall stellt sich die Frage, ob der Testfall oder das Programm einen Fehler enthält. Dies muss dann im Einzelnen und möglicherweise auch in Absprache mit dem Kunden geklärt werden.
Mit einem gut geschriebenen Testplan kann der Test einen hohen Anteil der Programmfunktionen überprüfen. Er eignet sich besonders gut, um nach der Vollendung einer neuen Programmfunktion die Seiteneffekte auf andere Programmteile zu überprüfen. Der Nachteil eines Testplans ist gleichzeitig auch ein Vorteil: Das Anpassen des Testplans an eine neue Programmversion verursacht einen gewissen Aufwand. Bei dieser Arbeit muss jedoch zu jedem Testfall das erwartete Ergebnis bestimmt werden. Der Testplan enthält also auch eine recht genaue Beschreibung dessen, was ein Programm leisten soll.
Automatisierte Tests der Benutzeroberfläche
Für den automatisierten Test von Programmen über die Benutzeroberfläche gibt es gesonderte Anwendungen. Die Entwicklungsumgebung Microsoft Visual Studio enthält Programmfunktionen zum Test der GUIs von Web- und Windows-Desktop-Anwendungen. Unter dem Namen „Selenium“ ist ein Test-Framework bekannt, dass speziell für den Test von Web-Anwendungen auf verschiedenen Plattformen entwickelt wurde. GUI-Tests simulieren Mausklicks und Eingaben des Benutzers. Sie sind daher besonders anfällig gegenüber Programmänderungen und verursachen einen hohen Aufwand bei der Anpassung an neue Programmversionen.
Aufwand bei der Fehlersuche und Fehlerbehebung
Der Aufwand für Fehlersuche und Fehlerbehebung wächst exponentiell zum Projektfortschritt. Der Programmierer braucht die Software oder den Unit Test nur aus seiner Entwicklungsumgebung zu starten. Meist kommt er mit nur wenigen Mausklicks zum Aufruf der Programmfunktion, die er testen möchte. Falls ein Fehler auftritt, kann er diesen direkt beheben.
An den Tests in späteren Projektphasen sind mehr Personen beteiligt. Bei den internen Tests mit Testplan und Testprotokoll handelt es sich um interne Mitarbeiter, beim Feldtest sind auch externe Mitarbeiter beteiligt. Hierdurch steigt der Aufwand sehr stark an. Es beginnt damit, dass das Programm nicht mehr einfach aus der Entwicklungsumgebung gestartet werden kann. Installationsdateien müssen erstellt und auf dem Staging-System ausgerollt werden.
Die Tester müssen über das Vorhandensein einer neuen Testversion und deren Programmfunktionen informiert werden. Anschließend erhalten die Tester eine Dokumentation der zu testenden Programmfunktionen. Gefundene Fehler müssen dokumentiert, bewertet und an den Programmierer weitergeleitet werden. Und dann beginnt der Zyklus wieder von vorne. Die aufwändigen Iterationen enden erst, wenn keine betriebsverhindernden Fehler mehr gefunden werden.