Auf einen Blick
Testen heisst, ein Programm mit dem Ziel auszuführen, Fehler zu finden.
Vor dem Test legen wir fest, mit welchen Daten wir testen und welches Ergebnis wir erwarten (SOLL).
Beim Test vergleichen wir das tatsächliche Ergebnis (IST) mit dem SOLL.
Sie können
Software steuert Bankkonten, Stundenpläne, Ampeln und Medizingeräte. Fehler sind deshalb nicht nur ärgerlich, sondern können teuer oder gefährlich werden.
Je später ein Fehler entdeckt wird, desto teurer wird er:
| Fehler wird entdeckt … | Folge | Aufwand |
|---|---|---|
| beim Programmieren | Entwickler korrigiert den Code sofort | Minuten |
| beim Testen vor der Auslieferung | Fehler wird protokolliert, korrigiert und erneut getestet | Stunden |
| beim Kunden im Betrieb | Support, Notfall-Update, Imageschaden, eventuell Schadenersatz | Tage bis Wochen |
Testen ist ein Teil der Qualitätssicherung. Dabei gilt ein Grundsatz, der auf den Informatiker Edsger W. Dijkstra zurückgeht:
Testen kann zeigen, dass Fehler vorhanden sind, aber nie, dass ein Programm fehlerfrei ist.
Wir testen also nicht, um zu beweisen, dass alles funktioniert. Wir testen, um möglichst viele Fehler zu finden, bevor sie jemand anderes findet.
Im Alltag sagen wir für alles «Fehler» oder «Bug». In der Softwareentwicklung unterscheidet man drei Stufen:
| Begriff | Bedeutung | Beispiel |
|---|---|---|
| Fehlhandlung (Irrtum) | Ein Mensch macht etwas falsch. | Die Programmiererin verwechselt > und >=. |
| Fehlerzustand (Defekt, Bug) | Der Irrtum steckt jetzt im Code. | Im Code steht if alter > 18: statt if alter >= 18:. |
| Fehlerwirkung (Ausfall) | Das Programm verhält sich beim Ausführen falsch. | Eine 18-jährige Person wird als minderjährig abgewiesen. |
Beim Testen beobachten wir immer nur die Fehlerwirkung. Den Fehlerzustand im Code suchen und korrigieren die Entwicklerinnen und Entwickler.
Manche Programmierer «testen», indem sie irgendwelche Daten eingeben und schauen, was passiert.
Ihr Motto: Schiess einen Pfeil ab und nenne alles, was du triffst, ein Ziel.
Systematisches Testen geht anders:
Beispiel:
| Was wir testen | Eingabe | SOLL | IST | Ergebnis |
|---|---|---|---|---|
| Negative Menge wird abgelehnt | Feld «Menge»: -4 | Meldung «Menge muss grösser als 0 sein» | Bestellung über -4 Stück | Fehler |
Wir können nie alle möglichen Eingaben testen. Zwei einfache Techniken helfen, mit wenigen Testfällen viel abzudecken.
Wir teilen die möglichen Eingaben in Gruppen (Klassen) ein, die das Programm gleich behandeln sollte. Aus jeder Klasse testen wir einen Vertreter.
Beispiel Feld «Betrag» im Programm British Inheritance Tax:
| Klasse | Art | Vertreter |
|---|---|---|
| Betrag bis 325'000 | gültig | 200000 |
| Betrag über 325'000 | gültig | 500000 |
| Betrag 0 oder negativ | formal korrekt, ungültig | -100 |
| keine Zahl | formal falsch | abc |
| Zahl mit Tausendertrennzeichen | formal falsch | 500'000 |
Fehler passieren besonders häufig an den Grenzen zwischen zwei Klassen, zum Beispiel wenn < und ⇐ verwechselt werden.
Deshalb testen wir zusätzlich die Werte direkt an der Grenze und knapp daneben: 324999, 325000, 325001.
Viele Programmierer fühlen sich angegriffen, wenn ihre Arbeit kritisiert wird. Im Testprotokoll gilt deshalb:
| Gut | Schlecht |
|---|---|
Eingabe 0 im Feld «Zahl» führt zu einem Absturz. | Die Bedingung zur Prüfung der Eingabe ist falsch. |
| Bei Beträgen über 1 Mio. fehlen die Nachkommastellen. | Da hat jemand mal wieder schlampig programmiert. |
Ausserdem gilt: Wer ein Programm geschrieben hat, sieht die eigenen Fehler schlecht. Deshalb ist es sinnvoll, wenn eine andere Person die Testfälle durchführt.
| Blackbox-Test | Glassbox-Test (Whitebox-Test) | |
|---|---|---|
| Grundlage | Anforderungen und Spezifikation | Quellcode |
| Sicht auf das Programm | Wie eine schwarze Kiste: nur Eingabe und Ausgabe | Wie eine Glaskiste: der Code ist sichtbar |
| Typische Frage | Macht das Programm, was es soll? | Wurde jede Anweisung und jede Bedingung ausgeführt? |
| Techniken | Äquivalenzklassen, Grenzwerte, Zustandsdiagramme | Anweisungs-, Zweig-, Bedingungsabdeckung (LU02c) |
| Wer testet meistens? | Testerinnen und Tester, Kundinnen und Kunden | Entwicklerinnen und Entwickler |
Beide Arten ergänzen sich: Der Blackbox-Test findet fehlende Funktionen, der Glassbox-Test findet ungetesteten Code.
Warum alle Testfälle und nicht nur die fehlgeschlagenen? Eine Korrektur kann an einer anderen Stelle neue Fehler verursachen. Diesen erneuten Test nennt man Regressionstest.
Die Norm IEEE 829 beschreibt, welche Dokumente beim Testen entstehen. Die wichtigsten davon kennen Sie aus diesem Modul:
| Dokument | Inhalt | Im Modul |
|---|---|---|
| Testkonzept / Testplan | Was wird wann, wie und von wem getestet? | LU02 |
| Testfallspezifikation | Die einzelnen Testfälle mit Eingaben und SOLL | LU01c |
| Testprotokoll | Die Ergebnisse eines Testdurchlaufs (IST) | LU01d |
| Testabschlussbericht | Zusammenfassung und Empfehlung zur Freigabe | Fazit im Testprotokoll |
IEEE 829 wurde inzwischen durch die internationale Normenreihe ISO/IEC/IEEE 29119 abgelöst. Die Grundidee ist gleich geblieben.
| Begriff | Bedeutung |
|---|---|
| Testen | Ausführen eines Programms mit dem Ziel, Fehler zu finden. |
| Testfall | Beschreibung einer Situation mit konkreten Eingaben und erwartetem Ergebnis. |
| Testdurchlauf | Einmaliges Ausführen aller Testfälle. |
| Testprotokoll | Ergebnisse eines Testdurchlaufs. |
| SOLL / IST | Erwartetes / tatsächliches Ergebnis. |
| Positivtest | Test mit gültigen Eingaben: Funktioniert das Programm wie gewünscht? |
| Negativtest | Test mit ungültigen Eingaben: Reagiert das Programm richtig auf Fehler? |
| Regressionstest | Erneuter Test nach einer Änderung, um neue Fehler zu entdecken. |