Follow my new blog

Donnerstag, 17. März 2011

Fit für FitNesse

imageFitNesse ist ein hübsches Framework für Akzeptanztests. Ist zwar Java-basiert mit seinem eigenen Web-Server, aber der Einsatz ist auch für .NET möglich. Gojko Adzic hat dazu schon vor längerer Zeit ein Buch geschrieben – Test Driven Development with FitNesse -, dass auch kostenlos als eBook verfügbar ist.

Leider hat sich der Einstieg dann aber doch nicht so flüssig gestaltet, wie ich es gern gehabt hätte. Die grundsätzliche Installation ist simpel:

  1. Java VM installieren; Download von http://www.java.com/de/download/
  2. FitNesse Server herunterladen von http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad. Er kommt als .jar-Datei, für das Sie am besten ein FitNesse-Verzeichnis anlegen, z.B. C:\FitNesse
  3. FitSharp herunterladen von http://fitsharp.github.com/. Das ist ein Framework wie NUnit, mit dem Sie .NET-Klassen zu FitNesse-Fixtures machen können. Die FitSharp Assemblies legen Sie am besten im FitNesse-Verzeichnis ab, z.B. unter C:\FitNesse\FitSharp.
  4. FitNesse-Server starten. Ich habe mir dazu einen einzeiligen Batch gebastelt, der im FitNesse-Verzeichnis liegt und den Server auf Port 8888 startet:

    java -jar fitnesse.jar -p 8888

Das Ergebnis einer soweit erfolgreichen Installation ist ein laufender Server:

image

Auf den können Sie über den Browser mit Adresse localhost:8888 zugreifen:

image

Soweit lief bei mir auch alles gut. Knifflig wurde es, als ich dann eine C# Testfixture aufrufen wollte. Ich hatte sie nach Gojkos Beispiel wie folgt geschnitzt:

image

Die FitSharp Assemblies fit.dll und fitSharp.dll musste ich referenzieren (am besten aus einem projektlokalen Verzeichnis) und die Fixture-Klasse von ColumnFixture ableiten. Weitere Details entnehmen Sie am besten Gojkos Buch.

Ein FitNesse-Test war ebenfalls einfach aufgesetzt:

image

Nur leider zeigte der nicht den gewünschten Erfolg. Nach Start über das FitNesse-Dashboard passierte schlicht nichts :-( Nicht mal eine Fehlermeldung erschien. Der Test war angestoßen worden… aber “kam nicht zurück”. FitNesse schien zu hängen.

Tip #1: Um mehr Infos über einen (abstürzenden) Test zu erhalten, nicht mit dem FitSharp Runner.exe starten, sondern mit RunnerW.exe:

!define TEST_RUNNER {fitsharp\RunnerW.exe}

Der Grund für das Hängen war, dass durch eine Security Policy Änderung bei .NET 4 der Runner-Prozess Libraries nicht einfach so laden konnte. Ob es daran lag, dass meine Test-Assembly nicht auch im FitSharp-Verzeichnis lag (wie in Gojkos Beispiel), weiß ich nicht. Diesen Grundsatz wollte ich jedenfalls nicht aufgeben.

Tip #2: Um das Laden der nötigen Assemblies für den Runner zu ermöglichen, einfach zwei App.Config-Dateien im FitSharp-Verzeichnis anlegen. Runner.exe.config und RunnerW.exe.config:

<configuration>
   <runtime>
      <loadFromRemoteSources enabled="true"/>
   </runtime>
</configuration>

Mit der Konfigurationsdatei lief dann der Runner, meldete aber, dass er meine Testklasse nicht finden können. Dafür die Ursache zu finden, hat mich dann einige Zeit gekostet. Google war keine Hilfe. Ich hatte ja auch alles Formal richtig gemacht.

Am Ende stellte sich heraus, dass FitNesse oder FitSharp ein Problem mit dem Namespace der Testklasse hatte. Dessen Name lautete ursprünglich “spike_fittest”. Als ich ihn dann nach “fittest” umbenannt hatte, lief der Test durch.

image

Tip #3: Sonderzeichen in Namen von Namensräume oder Testklassen vermeiden, allemal einen Unterstrich “_”. (Umlaute scheinen allerdings kein Problem zu machen und sogar falsche Groß/Kleinschreibung wird toleriert.)

Schließlich noch ein Hinweis auf FitSharp Suite-Dateien. Zwischendurch schien es, dass “etwas” besser wurde, als ich eine solche testspezifische Datei mit Runner-Konfigurationsdaten im Test referenzierte. Meine Suite-Datei suite.config.xml sah so aus:

<suiteConfig>
    <ApplicationUnderTest>
        <addNamespace>fitlibrary</addNamespace>
    </ApplicationUnderTest>
</suiteConfig>

Eingebunden hatte ich sie in den Test so:

image

Heute, beim Schreiben dieses Artikels, konnte ich allerdings keinen Vorteil mehr darin erkennen. Auch ohne Referenz dieser Suite lief der Test problemlos. Merkwürdig… Aber egal. Ich denke, ein Hinweis auf Suite-Dateien ist trotzdem nützlich.

Ich hoffe, mit diesem kleinen Erfahrungsbericht mache ich Ihnen den Einstieg in FitNesse mit .NET ein bisschen einfacher. Mir gefällt der Framework als Grundlage für Softwareprüfstände. Bevor Sie einen Prüfstand komplett selbst aufsetzen, schauen Sie sich einmal FitNesse an. Damit können Sie auch mal einen Kunden auf Ihren Code loslassen.

Keine Kommentare: