Der Schrecken aller Programmierer

Was ist die größte Angst der Software-Entwickler? Dass ihre App oder ihr Programm nicht rund läuft. Und genau um das zu verhindern, gibt es verschiedene Möglichkeiten, die Software auf diverse Bugs zu testen. Wie diese aussehen und was man dabei beachten muss, erfährst du, wenn du jetzt weiter liest.

Worst Case: Die Deadline für eine neue App rückt näher, die letzten Code-Zeilen werden geschrieben. Pünktlich zum Release ist die App fertig, jedoch noch nicht ausreichend getestet. Beim ersten Starten der App stürzt diese sofort ab. Beim zweiten Mal kommt man immerhin bis zum Log-in, jedoch kommt sofort wieder die Meldung „die App reagiert nicht mehr“. Diese oder ähnliche Meldungen hatte sicher jeder schon einmal auf seinem Smartphone oder auch auf seinem PC. Was für den Nutzer ärgerlich ist, ist für den Programmierer noch unangenehmer, weil es in den meisten Fällen mit schlechten Rezensionen und einem Haufen zusätzlicher Arbeit endet. Häufig tritt dieses Phänomen auch bei modernen PC-Spielen auf, wo User als Betatester eingesetzt werden, doch dazu später mehr. Kommen wir also zu den verschiedenen Testmethoden, die man anwenden kann.

Verschiedene Testmethoden und Testbegriffe

Grundsätzlich gilt: Der Testablauf sollte schon vor dem eigentlichen Programmieren feststehen, da es sonst dazu kommen kann, dass die Prüfung auf die fertige Software „zugeschnitten“ ist. Daher sollte auch unbedingt jemand anders als der Entwickler selbst die App testen. Doch selbst wenn man die App nicht selbst programmiert hat, aber eng mit den Entwicklern zusammenarbeitet, kennt man die Funktionen normalerweise schon im Vorhinein und kannst im Endeffekt gezielt auf diese Funktionen hin testen. Allerdings gibt es auch Testmethoden, die kein Wissen über die Software voraussetzen.

Funktionstests

Funktionstest stellen die grundsätzliche Funktion der Software sicher. Dies muss nicht am Ende geschehen, sondern kann auch partiell getestet werden und kann daher auch schon in der Alpha-Phase einer Entwicklung geschehen. Zum Beispiel kann nach Fertigstellung der Anmeldefunktion getestet werden, ob auch alle erlaubten Zeichen erkannt werden und zu keinem Absturz führen. (Umlaute oder ein „ß“ können hier manchmal zu Problemen führen, vor allem bei nicht im deutschsprachigen Raum erstellter Software). Das Testen kann entweder manuell durchgeführt werden, was unter Umständen sehr langwierig wird, oder automatisch erfolgen. Es sollte jedoch auch am Ende nicht darauf vergessen werden, alle zusammenhängenden Bausteine in Funktion zueinander zu testen.

Usability Tests

Bei Usability-Tests wird weniger auf die spezifischen Funktionen der App geachtet, sondern das Hauptaugenmerk auf die Bedienbarkeit der Software gelegt. Es wird also getestet, ob die Funktionen der App leicht zu erlernen sind und die Bedienung den Nutzern nicht unnötig schwer gemacht wird. Dazu werden Versuchspersonen herangezogen, die bestimmte Abläufe ausprobieren sollen. Die Personen sollen dabei z.B. laut denken, um die auftretenden Probleme nachvollziehen zu können. Durch das Vorwissen der Programmierer zu ihren Programmen können manche Schritte für Außenstehende nicht nachvollzogen werden, die für den Ersteller komplett selbstverständlich sind. Dies soll durch Usability-Tests behoben werden. Allerdings muss man auch beachten, dass bestimmte Apps nur „In-House“ bzw. von einer spezifischen Anwenderugruppe genutzt werden, was dann wiederum Usability-Tests für die breite Masse obsolet macht.

Monkey Testing

Monkey Testing stellt die einfachste Methode des Testens von Software dar. Es werden zufällige und manchmal in schneller Reihenfolge ausgewählte Befehle ausgeführt, um zu testen, ob bei der Anwendung diese Befehle dann auch ausgeführt werden oder ob das Programm abstürzt. Der Name kommt daher, dass die Situation so simuliert werden soll, als würde ein Affe eine Reihe zufälliger Eingaben tätigen. Man kann allerdings auch zwischen „intelligentem“ und „dummem“ Monkey- Testing unterscheiden.

Beim intelligenten Testen, welches schon Richtung Funktionstest gehen kann, werden nach einer bestimmten Eingabe gewisse Zustände erwartet bzw. sind manche Funktionen bekannt und man versucht, z.B. durch wiederholtes Ausführen bestimmter Befehle, die App zum Absturz zu bringen. Man kann ebenfalls schon bekannte Zustände zu Gunsten des Testers ausnutzen (z.B. wie oben erwähnt,  eine vorherige Eingabe eines Umlauts, um diesen später wieder aufzurufen).

„Dummes“ Testen erfolgt ohne Wissen über die Software und deren Funktion. In diesem Fall werden wahllos Funktionen und Befehle aufgerufen, die einen Absturz herbeiführen könnten.
Die Nachteile beim Monkey-Testing sind allerdings, dass sich die Eingaben nicht immer genau nachverfolgen lassen. Allerdings kann dies durch Absturzberichte behoben werden, wenn diese die Eingaben mitverfolgen.

Betatests

Betatests werden vor allem in der Gaming-Industrie viel eingesetzt. Hierfür wird die Software in der Betaphase einem bestimmten Publikum zur Verfügung gestellt. Teilweise wird diese Gruppe durch z.B. Zugangsschlüssel begrenzt, teilweise sind diese Tests öffentlich. Die User können die Software meist in einem begrenzten Umfang nutzen, um so einen fehlerfreien Gesamtablauf testen zu können. Bei geschlossenen Gruppen besteht jedoch die Gefahr einer Weitergabe des Zugangsschlüssels, was zu einem unfreiwilligen Veröffentlichen der (noch unfertigen) Anwendung führen kann.

Heutigen Computerspielherstellern wird oft vorgeworfen, die User für fertige Produkte zahlen zu lassen und sie als Betatester zu nutzen, obwohl die Käufer ja vermeintlich eine schon fertige Software kaufen. Die Hersteller bessern dann laufend mit Updates und Patches die von den Usern gefundenen Fehler aus. In diesem Zusammenhang gibt es den Begriff „bananaware“, da die Software sozusagen erst beim Kunden „reift“.

Automatisiertes Testen

Automatisiertes Testen stellt eigentlich keine eigene Testmethode dar, sondern wird meistens in Kombination mit einer der obigen Testmethoden genutzt. Beim automatischen Testen können sich wiederholende Eingaben z.B. durch eine Software automatisiert werden. Dadurch wird ermöglicht, bestimmte Abläufe immer wieder auszuführen und zu testen, ob gewisse Wiederholungen einen Absturz der Software herbeiführen.

Die Testumgebung

Was ebenfalls beim Testen zu beachten ist, ist die Testumgebung. Es braucht manchmal nur eine kleine Änderung irgendwelcher Einstellungen oder bestimmter Funktionen, um eine App zum Absturz zu bringen. Dies kann durch das Aktivieren der Bluetooth Funktion passieren, oder aufgrund einer zu schwachen Netzverbindung. Daher sollten alle diese Möglichkeiten beim Testen beachtet werden. Ebenfalls kann z.B. der Ladestand des Akkus oder die Tatsache, dass er gerade geladen wird oder nicht eine Rolle spielen. Durch Aufzeichnen dieser Umgebungsdaten kann dann auf den Fehler rückgeschlossen und das Problem behoben werden.

Aufzeichnung der Testdaten

Um das vollständige Auflösen eines Fehlers zu garantieren, muss man wissen, worauf der Fehler basiert. Daher fertige ich bei meinen Tests immer ein Testprotokoll an. Darin wird beschrieben, zu welcher Zeit, mit welcher Hardware, mit welchem Betriebssystem und mit welchen Einstellungen der Test ausgeführt wurde. Außerdem werden die Schritte beschrieben, die unternommen worden sind. Um ein besseres Nachvollziehen zu garantieren, können auch Screenshots oder Fotos hinzugefügt werden.

Protokoll zum Testen von Software
Abb.1: Auszug aus einem Testprotokoll

Hier wurde z.B. das Datum, die App-Versionsnummer und die Uhrzeit des Tests eingetragen. Außerdem wurde aufgezeichnet auf welchem Gerät der Test stattfand und welche zusätzlichen Funktionen aktiviert bzw. deaktiviert waren. Im Testablauf wurden die verschiedenen Schritte und im rechten Fenster die aufgetretenen Fehler beschrieben.

Also alles fehlerfrei?

Man kann sich also schon vorstellen, dass Software Tester bei den Programmierern nicht immer sehr beliebt sind. Allerdings können so oft schwerwiegende Fehler gefunden werden, welche die fertige App andernfalls stark beeinträchtigen würden, also was soll‘s. Zusätzlich kann man aus solchen Fehlern oft wichtige Infos für neue Programme oder Anwendungen mitnehmen und dort dann schneller Lösungen finden. Und auch wenn der Absturz der App oder Spieles manchmal zur ungelegensten Zeit passiert, liegt der Fehler nicht immer beim Programmierer. Manche Fehler sind nicht auf den eigentlichen Programm-Code zurück zu führen, vor allem weil man nicht jede mögliche Hardware-Spezifikation prüfen kann.  Also im Grunde gesagt: „wer von euch ohne Bugs ist werfe den ersten Stein!“ …oder so 😉