empros gmbh - process & information management services
1009-chat Simplicity is the most difficult thing to secure in this world; it is the last limit of experience and the last effort of genius.

- George Sand

xUnit4Delphi

Das Warum und Wie

Das konsequente, frühe und fortwährende Unit-Testen ist fester Bestandteil unserer Arbeit. Wir können uns das Schreiben von Software ohne regressives Unit-Testing nicht mehr vorstellen. (Ja, auch wir haben früher das Testen unserer Software stiefmütterlich behandelt. Aber das ist zum Glück schon lange her.)

Das xUnit-Testframework nach Beck und Gamma hat sich als De-Facto Standard in diesem Bereich durchgesetzt. (Was leider nicht bedeutet, dass sich das konsequente Unit-Testen als fester Bestandteil der Entwicklertätigkeit auf breiter Front durchgesetzt hätte). Unter xprogramming.com findet sich eine Sammlung von xUnit-Implementierungen für eine Vielzahl von Programmiersprachen, u.a. auch für Delphi. Warum haben wir uns also die Mühe gemacht, eine eigene DUnit-Version zu entwickeln?

Unsere ursprüngliche xUnit-Umsetzung für Delphi (xUnit4Delphi) liegt bereits mehrere Jahre zurück. Damals existierte die erwähnte DUnit-Implementierung noch nicht. Mit dem Erscheinen von DUnit haben wir für neue Projekte auf DUnit gewechselt. Obwohl DUnit sich stark an JUnit orientiert, weist es mehrere z.T. lästige Unterschiede auf. So bietet DUnit lediglich eine sehr eingeschränkte Zahl von Check-Methoden. Dass diese Methoden Check und nicht Assert heissen wie in JUnit ist zumindest ärgerlich. Auch sonst gibt es kleine aber feine Unterschiede, die uns als Reisende zwischen den Welten Java und Delphi immer wieder störten. Jedoch nicht genug, um eine eigene DUnit-Umsetzung ernsthaft ins Auge zu fassen.

Das änderte sich, als wir vor der Aufgabe standen, einem Entwickler die Ideen und Konzepte der test-getriebenen Entwicklung (engl. Test-Driven Development, kurz TDD) zu vermitteln. Inspiriert von Kent Becks Buch Test-Driven Development beschlossen wir, TDD und Entwurfsmuster am Beispiel von xUnit zu vermitteln. Nun, aus dem ursprünglichen Lernprojekt ist eine elegante, klar strukturierte und mächtige Umsetzung von xUnit für Delphi geworden. Das Testframework ist Schritt um Schritt entstanden und vollständig mit sich selbst getestet. Es bietet uns zwar (noch) nicht alles, was unser Delphi-Entwicklerherz begehrt, ist aber dennoch ausgereift genug, um im harten Praxiseinsatz zu bestehen. Eine kurze Liste geplanter Erweiterungen und Verbesserungen findet sich hier.

Wir haben uns entschlossen das Framework als xUnit4Delphi der Delphi Gemeinschaft unter der Mozilla Lizenz 1.1 zur Verfügung zu stellen. Wir sehen unser Framework dabei nicht in Konkurrenz sondern vielmehr als eine Alternative zu DUnit.

xUnit4Delphi auf einen Blick

  • xUnit4Delphi orientiert sich soweit als möglich an JUnit
  • Getestet für die Delphi Versionen 5 -7.
  • Vollständig mit sich selbst getestet (TestFramework.dpr)
  • Bietet eine Basisklasse TAssert mit einer Reihe von Assert-Funktionen (an Stelle von Check), die auch ausserhalb des Frameworks zur Überprüfung von Vorbedingungen verwendet werden können (Design By Contract). Weiter wird dadurch das endoskopische Testen mit Hilfe von Mock-Objekten erleichtert.
  • Tests zur Überprüfung, ob Exceptions korrekt geworfen werden, können im JUnit-Stil implementiert werden (vgl. JUnit FAQ)

Offene Punkte

  • Vollständige Dokumentation erstellen.
  • Refactoring der GUI-Implementierung
  • Unterstützung für das Testen von Benutzerschnittstellen
  • Optionale Möglichkeit für das Neuerzeugen der Testklassen.

Download

xUnit4Delphi Version 1.0 (Zip-Archiv [25 KB] )
xUnit4Delphi ReadMe (html / txt [2 KB] )

Neues in der aktuellen Version 1.0.4

  • Bug behoben in TAssert.AssertEquals(const AMsg: string; Expected, Actual: TObject);
  • neue Assert Methode AssertNil eingeführt.
  • TearDown wirft nun eine Exception, wenn ein Fehler auftritt
  • TAssert um ExpectedException Test Handling erweitert.