LU01a - Grundlagen des Testens

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.

Lernziele

Sie können

Warum testen?

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.

Was ist ein Fehler?

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.

Vorgehen: SOLL mit IST vergleichen

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:

  1. Planen: Wir legen fest, welche Situation wir testen wollen.
  2. Testfall beschreiben: Wir notieren die konkreten Eingaben und das erwartete Ergebnis (SOLL). Siehe LU01c - Aufbau eines Testfalls.
  3. Ausführen: Wir führen das Programm mit genau diesen Eingaben aus und notieren das tatsächliche Ergebnis (IST).
  4. Vergleichen: Stimmen SOLL und IST überein, ist der Test bestanden. Sonst haben wir einen Fehler gefunden. Siehe LU01d - Aufbau eines Testprotokolls.

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

Gute Testdaten finden

Wir können nie alle möglichen Eingaben testen. Zwei einfache Techniken helfen, mit wenigen Testfällen viel abzudecken.

Äquivalenzklassen

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

Grenzwerte

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.

Psychologie des Testens

  • Sei hart zum Programm: Deine Aufgabe ist es, möglichst viele Fehler zu finden.
  • Sei nett zum Menschen: Du kritisierst die Arbeit, nicht die Person.

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 und Glassbox

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.

Ablauf eines Tests

  1. Analyse: Die Anforderungen an das Programm werden ermittelt. Sie sind die Grundlage für das Programm und für die Testfälle.
  2. Testfälle erstellen: Aus den Anforderungen entstehen die Testfälle, meistens parallel zur Programmierung.
  3. Programmieren: Die Entwicklerin erstellt das Programm.
  4. Testdurchlauf: Die Testerin führt jeden Testfall einmal aus und hält das Ergebnis im Testprotokoll fest.
  5. Entscheid: Nach dem Testdurchlauf entscheidet die Testerin, ob das Programm in Ordnung ist oder überarbeitet werden muss.
  6. Korrektur und erneuter Test: Muss das Programm überarbeitet werden, korrigiert die Entwicklerin die Fehler. Danach werden alle Testfälle erneut durchgeführt und in einem neuen Testprotokoll festgehalten.

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.

Normen: IEEE 829

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.

Begriffe

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.

Kontrollfragen

  1. Warum kann Testen nicht beweisen, dass ein Programm fehlerfrei ist?
  2. Eine Webseite zeigt bei Bestellungen am 29. Februar ein falsches Lieferdatum. Ist das eine Fehlhandlung, ein Fehlerzustand oder eine Fehlerwirkung?
  3. Bilden Sie Äquivalenzklassen für ein Eingabefeld «Alter» (ganze Zahl zwischen 0 und 120). Welche Grenzwerte testen Sie?
  4. Formulieren Sie den Satz «Die Validierung ist komplett falsch programmiert» so um, dass er in ein Testprotokoll passt.
  5. Warum werden nach einer Korrektur alle Testfälle erneut durchgeführt?

Marcel Suter