Jedes Programm enthält Fehler — das ist keine Ausnahme, sondern die Regel. Die Frage ist nie "ob", sondern "wie schlimm die Folgen sind, wenn er auftritt". Ein Fehler in einer privaten Wetter-App ist ärgerlich. Ein Fehler in der Steuerungssoftware der Ariane-5-Rakete hat 1996 zum Verlust der Rakete geführt. Ein Fehler im Bestrahlungsgerät Therac-25 hat Patienten getötet. Testen ist der Versuch, solche Fehler zu finden, bevor sie in Produktion jemandem schaden.
Ein zentrales Prinzip aus der Testtheorie, das sich in der Praxis ständig bestätigt:
Testing shows the presence of defects, but it does not prove their absence.
Ein Test, der grün ist, beweist nur, dass für die geprüften Fälle kein Fehler gefunden wurde. Er
beweist nicht, dass die Funktion für jede denkbare Eingabe korrekt ist. Deshalb reicht es nicht, eine
Funktion einmal mit einem plausiblen Wert auszuprobieren und dann zu sagen "läuft". Besonders
Grenzwerte — der Punkt, an dem sich eine Bedingung von wahr zu falsch dreht — sind eine der
häufigsten Fehlerquellen, weil > und >= sich nur in genau einem Wert unterscheiden, aber ein
komplett anderes Verhalten auslösen können.
Testen verfolgt dabei mehrere Ziele gleichzeitig: korrektes Verhalten unter allen Bedingungen prüfen, Übereinstimmung mit den Anforderungen sicherstellen, den aktuellen Stand des Produkts sichtbar machen, Fehler früh statt spät finden — und dadurch am Ende Entwicklungskosten senken, weil ein Fehler, der erst beim Kunden auffällt, deutlich teurer zu beheben ist als einer, der beim Schreiben des Codes auffällt.
Lies den Code genau durch, bevor du ihn ausführst.
fun endpreisInCent(preisProStueckInCent: Int, mengeRabattAb: Int, menge: Int): Int {
return if (menge >= mengeRabattAb) preisProStueckInCent * menge * 9 / 10
else preisProStueckInCent * menge
}
fun main() {
println(endpreisInCent(1000, 5, 5))
println(endpreisInCent(1000, 5, 4))
}
Was geben die beiden println-Aufrufe aus (Preis in Cent)?
Die Funktion gibRabattstufe soll ab 10 Stück 5 % Rabatt geben und ab 50 Stück 10 % Rabatt, alles darunter bekommt keinen Rabatt. Führe den Code aus und vergleiche jede Ausgabe mit dem erwarteten Ergebnis im Kommentar dahinter. Mehrere der drei Aufrufe passen nicht zur Spezifikation — finde die gemeinsame Ursache und korrigiere sie so, dass alle drei Fälle stimmen.
Bevor du einen Hint bekommst: Was hast du schon probiert, und woran hängt es genau?
1. Welches Testprinzip zeigt das Predict-Beispiel oben am deutlichsten?
2. Was besagt das Prinzip 'Testing shows the presence of defects, not their absence'?