Nehmen wir mal an es gibt eine sehr komplexe Berechnungsformel, die unter bestimmten Umständen versagt.
Beim Entwickeln war einem dieser Umstand nicht bekannt und darum ist dort jetzt ein Fehler.
Kunde A beschwert sich und bevor man sich an den Code macht, erweitert man den Test um diese Konstellation und fängt an den Code zu prüfen und zu fixen.
Wann ist der Fix fertig? Wenn alle anderen und der neue Test fehlerfrei durchlaufen.
Ein wenig später kommt die Erkenntnis, dass man alles viel einfacher umsetzen/berechnen könnte.
Also einfach die neue Berechnungsformel implementieren.
Wann ist man fertig? Wenn alle Tests fehlerfrei durchlaufen.
Ein Test ist nur so gut wie die Testbedingungen, aber die sind nicht in Stein gemeißelt, sondern dynamisch und wachsen eben mit. Dadurch vermeidet man aber auf jeden Fall Fehler aus der Vergangenheit nochmals zu begehen.
BTW Tests mit Idealbedingungen zeigen nur, ob der Code im Idealfall funktioniert. Robusten Code testet man aber mit Bedingungen die zwar abwegig, aber möglich sind (werden Exceptions richtig geworfen, etc.)
EDIT
Dazu fällt mir gerade folgendes noch ein (reallifeexperince, allerdings kein Delphi aber egal)
Eine Funktion zum Ermitteln des Brutto-Preises:
Delphi-Quellcode:
function GetBrutto( Preis : currency; MwSt : currency ) : currency;
begin
Result := ( Preis * ( 100 + 19 ) ) / 100; // ja, war hardcoded!
end;
Tja, und wer jetzt die Tests nur mit 19% macht fällt hier auf die Nase.
Vor allem, wenn sich dieser Fehler nach 2 Releases wieder ins Programm schleicht (ein VCS kannten die nicht)
Und vorsorglich haben die gar keine Tests drin gehabt, sondern die Funktion mit einem Artikel getestet.
So würde ich diese Funktion testen
Delphi-Quellcode:
// Idealbedingung
CheckEquals( 119, GetBrutto( 100, 19 ) );
// Variationen
CheckEquals( 100, GetBrutto( 100, 0 ) );
CheckEquals( 107, GetBrutto( 100, 7 ) );
// Abwegig, aber möglich
CheckEquals( 110.5, GetBrutto( 100, 10.5 ) );
CheckEquals( 90, GetBrutto( 100, -10 ) );
// Weitere Variationen
CheckEquals( 1190, GetBrutto( 1000, 19 ) );
// Fehler von Kunden gemeldet (bei Bedarf erweitern)
CheckEquals( 0, GetBrutto( 0, 19 ), 'case 0815');