Unit-Tests mit DUnit
Testfall anlegen
Das neue Testprojekt wird alle Testfälle aufnehmen. Legen wir direkt einen an. Dazu wählen wir „Testfall“ in der Objektgalerie aus (Datei/Neu/Weitere). Es öffnet sich wieder ein Assistent, in dem zuerst die Unit ausgewählt werden muss, die getestet werden soll. Wir wollen unsere DemoClass testen, also wählen wir die entsprechende Unit aus:
Direkt nach der Auswahl der Unit werden alle verfügbaren öffentlichen Methoden angezeigt. Wir selektieren „Add“ und „GetData“, weil wir diese beiden Methoden testen wollen.
Nach Klick auf „Fertigstellen“ wird uns eine Unit generiert, die bereits eine Klasse mit mehreren Methoden enthält. Die Klasse heißt „TestTDemoClass“ (weil unsere zu testende Klasse TDemoClass heißt) und erbt von TTestCase. Das ist die Basisklasse aller Testfälle.
Die ersten beiden Methoden heißen „SetUp“ und „TearDown“. In SetUp steht der Code, der vor der Durchführung jeder einzelnen Testmethode ausgeführt werden soll. Da wir für jeden Test eine Instanz von TDemoClass benötigen (sonst könnten wir die Methoden ja nicht aufrufen), wird in SetUp bereits eine erzeugt und in TearDown wieder freigegeben. TearDown wird nach der Ausführung jeder einzelnen Testmethode ausgeführt. Die Instanz landet im Feld „FDemoClass“.
Für jede im Assistenten ausgewählte Methode wird eine Testmethode erzeugt mit dem Präfix „Test“. Darin wird bereits die Original-Methode aufgerufen.
Der automatisch generierte Testfall sieht also so aus:
unit Testdemoclass; { Delphi DUnit-Testfall ---------------------- Diese Unit enthält ein Skeleton einer Testfallklasse, das vom Experten für Testfälle erzeugt wurde. Ändern Sie den erzeugten Code so, dass er die Methoden korrekt einrichtet und aus der getesteten Unit aufruft. } interface uses TestFramework, democlass; type // Testmethoden für Klasse TDemoClass TestTDemoClass = class(TTestCase) strict private FDemoClass: TDemoClass; public procedure SetUp; override; procedure TearDown; override; published procedure TestAdd; procedure TestGetData; end; implementation procedure TestTDemoClass.SetUp; begin FDemoClass := TDemoClass.Create; end; procedure TestTDemoClass.TearDown; begin FDemoClass.Free; FDemoClass := nil; end; procedure TestTDemoClass.TestAdd; var ReturnValue: Integer; b: Integer; a: Integer; begin // TODO: Methodenaufrufparameter einrichten ReturnValue := FDemoClass.Add(a, b); // TODO: Methodenergebnisse prüfen end; procedure TestTDemoClass.TestGetData; var ReturnValue: TTestrecord; begin ReturnValue := FDemoClass.GetData; // TODO: Methodenergebnisse prüfen end; initialization // Alle Testfälle beim Testprogramm registrieren RegisterTest(TestTDemoClass.Suite); end.
Was jetzt noch nicht ganz passt: Im SetUp des Testfalls wird der Konstruktor ohne Parameter aufgerufen. In unserer Implementierung gibt es aber einen Konstruktor, der zwei Werte entgegen nimmt. Deshalb passen wir diese Stelle entsprechend an:
procedure TestTDemoClass.SetUp; begin FDemoClass := TDemoClass.Create(3, 5, 'IchBinText'); end;