Umstellung unseres Delphi Unit-Tests auf DUnitX

In dem letzten Beitrag haben wir uns angesehen, wie man Unit-Tests in Delphi mit DUnit erstellt. Da DUnit aber mittlerweile nicht mehr weiterentwickelt wird, schreiben wir unseren Testcode nun um und verwenden stattdessen das DUnitX-Framework.

In den neueren Delphi-Versionen gibt es mittlerweile einen Wizard, der automatisch das DUnitX-Test-Projekt erstellt. Da ich aber noch mit Delphi-XE arbeite, steht dieser noch nicht zur Verfügung. Deshalb werde ich das Framework händisch installieren und unseren Test vom letzten mal so um umstellen, dass er statt DUnit mit DUnitX läuft.

Als erstes laden wir das DUnitX-Framework von der GitHub-Seite runter (Button „Clone or download“ -> „Save as zip“) und entpacken es in ein beliebiges Verzeichnis. Dieses müssen wir dann unserer Delphi-IDE als Library-Pfad hinzufügen indem wir auf „Tools“ -> „Optionen“ -> „Umgebungsoptionen“ -> „Delphi-Optionen“ -> „Bibliothek“ gehen und bei der Option Bibliothekspfad den kompletten Verzeichnispfad zu unserer DUnitX-Bibliothek hinzufügen.

Ein Grund wiese DUnitX erst ab Delphi 2010 verwendet werden kann, ist dass es von sogenannten Attributen Gebrauch macht. Dies sind neuere Delphi-Elemente welche ähnlich wie Annotations in Java verwendet werden können, d.h. man kann z.B. Variablen, Klassen oder Methoden mit zusätzlichen Informationen „dekorieren“ indem man über der Deklaration diese in eckigen Klammern hinzufügt.

DUnitX verwendet diese Attribute um z.B. die Setup und Teardown Methoden zu kennzeichnen. D.h. diese Methoden können nun, im Gegensatz zu DUnit, beliebige Namen haben und werden nur über das gesetzte Attribut von DUnitX als solche erkannt:

    public
        [Setup]
        procedure SetUp;
        [TearDown]
        procedure TearDown;

Hier ist nun die geänderte TestAddCalculator-Klasse:

unit TestAddCalculator;

interface

uses
  DUnitX.TestFramework, AddCalculator;

type
    // Testmethoden für Klasse TAddCalculator

    TestTAddCalculator = class
    strict private
        FAddCalculator: TAddCalculator;
    public
        [Setup]
        procedure SetUp;
        [TearDown]
        procedure TearDown;
    published
        procedure TestgetResult;
    end;

implementation

procedure TestTAddCalculator.SetUp;
begin
    FAddCalculator := TAddCalculator.Create;
end;

procedure TestTAddCalculator.TearDown;
begin
    FAddCalculator.Free;
    FAddCalculator := nil;
end;

procedure TestTAddCalculator.TestgetResult;
var
    ReturnValue: Integer;
begin
    ReturnValue := FAddCalculator.getResult(2, 3);
    Assert.AreEqual(5, ReturnValue);
end;

initialization
  // Alle Testfälle beim Testprogramm registrieren
    TDUnitX.RegisterTestFixture(TestTAddCalculator);
end.

Folgende Änderungen mussten wir durchführen:

  • in der uses-Klausel verwenden wir nun DUnitX.TestFramework
  • die Setup und Teardown Methoden werden wie oben beschrieben mit Attributen gekennzeichnet
  • anstatt der CheckEquals-Methoden gibt es nun eine Assert-Klasse
  • die Registrierung beim Test-GUI erfolgt mit „TDUnitX.RegisterTestFixture(TestTAddCalculator);“

Damit wäre Schritt 1 erledigt und unsere Test-Klasse umgestellt. Was jetzt noch fehlt: das Testprojekt startete bis jetzt die DUnit-GUI, mit welchem man die Tests ausführen kann und visuelles Feedback über das Testergebnis bekommt. Dieses müssen wir noch auf DUnitX umstellen:

Hierzu gehen wir im Fenster „Projektverwaltung“ auf die Datei „dunit_exampleTests.exe“ (unser Hauptprogramm), rechte Maustaste und wählen „Quelltext anzeigen“. Hier müssen wir den Code folgendermaßen umschreiben:

program dunit_exampleTests;

uses
  Forms,
  DunitX.TestFramework,
  DunitX.Loggers.GUI.VCL,
  DunitX.Test,
  DunitX.TestRunner,

  TestAddCalculator in 'TestAddCalculator.pas',
  AddCalculator in '..\AddCalculator.pas';

{$R *.RES}
var
  runner : ITestRunner;
begin
    DUnitX.Loggers.GUI.VCL.Run;
end.

Starten wir nun unser Test-Projekt, sollte folgendes Fenster erscheinen, in welchem wir unseren Test starten können:

Die Assert-Klasse von DUnitX stellt eine Reihe nützlicher Methoden bereit:

Funktion Beschreibung
Pass Prüft, ob eine Routine funktioniert.
Fail Prüft, ob eine Routine fehlschlägt.
AreEqual Prüft, ob zwei Elemente gleich sind.
AreNotEqual Prüft, ob zwei Elemente ungleich sind.
AreSame Prüft, ob zwei Elemente den gleichen Wert haben.
AreNotSame Prüft, ob zwei Elemente nicht den gleichen Wert haben.
Contains Prüft, ob sich das Element in einer Liste befindet.
DoesNotContain Prüft, ob sich das Element nicht in einer Liste befindet.
IsTrue Prüft, ob eine Bedingung wahr ist.
IsFalse Prüft, ob eine Bedingung falsch ist.
IsEmpty Prüft, ob der Wert eines Elements leer ist.
IsNotEmpty Prüft, ob der Wert eines Elements nicht leer ist.
IsNull Prüft, ob ein Element null ist.
IsNotNull Prüft, ob ein Element ungleich null ist.
WillRaise Prüft, ob die Methode eine Exception auslöst.
StartsWith Prüft, ob ein String mit einem bestimmten Teilstring beginnt.
InheritsFrom Prüft, ob eine Klasse von einer bestimmten Klasse abgeleitet ist.
IsMatch Prüft, ob das Element mit einem bestimmten Muster übereinstimmt.

Die Tests können auch in der Konsole, automatisiert bzw. im TestInsight-Plugin ablaufen. Daneben bietet DUnitX eine Reihe weiterer nützlicher Optionen, mit welchen wir uns vl. in einem zukünftigen Beitrag beschäftigen.

Schreibe einen Kommentar