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
Du musst angemeldet sein, um einen Kommentar abzugeben.