Home » Tutorials » Tools » Unit-Tests mit DUnit

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;