Sunday, 13. April 2008
Document-Driven-Development mit FIT
(eine kleine Einführung in das FIT-Framework)

Schon mal TDD (Test-Driven-Development) ausprobiert? Dann wird Ihnen auch sicherlich das FIT-Framework von Ward Cunningham gefallen, dass sich sehr gut mit dem TDD-Ansatz kombinieren lässt.

Basis von FIT sind Tabellen, die als Eingabe für automatische Testfälle dienen. Als Beispiel werden wir eine Tabelle mit Ports heranziehen, die wir etwas abändern werden, um unseren eigenen Rechner damit überprüfen zu können:

de.aosd.PortScannerFixture
Rechner Portnummer Dienst Beschreibung Status()
localhost 20 FTP-Data Dateitransfer (Datentransfer vom Server zum Client) inaktiv
localhost 22 SSH Secure Shell aktiv
localhost 80 HTTP Webserver aktiv

Die Tabelle aus Wikipedia wurde um die Spalte "Rechner" und "Status()" ergänzt. Am Anfang der Tabelle wurde noch eine Zeile mit einem sogenannten "Fixture" eingefügt. Dabei handelt es sich um eine Java-Klasse, die später vom FIT-Framework aufgerufen wird:
public class PortScannerFixture extends ColumnFixture {
	
    public String Rechner;
    public int Portnummer;
    public String Dienst;
    public String Beschreibung;
	
    public String Status() {
        return "not implemented";
    }

}

ColumnFixture ist eine Oberklasse von FIT, die den meisten Komfort im Umgang mit Tabellen bietet. Zwei Dinge sind wichtig für die Imlementierung:
  1. ich muss Attribute als "public" bereitstellen, die genauso wie die Tabellen-Überschriften heißen (Rechner, Portnummer, Dienst, Beschreibung);
  2. Tabellen-Überschriften, die wie Methoden-Aussehen (hier: Status()) müssen implementiert werden und einen String zurückliefern.
Damit ist das FIT-Framework bereits einsatzbereit. Über den mitgelieferten FileRunner kann das HTML-Dokument mit dieser Tabelle als Eingabeparameter aufgerufen werden:

> java fit.FileRunner services.html result.html
0 right, 3 wrong, 0 ignored, 0 exceptions

Der zweite Parameter (result.html) gibt die Ausgabedatei an, in der das Ergebnis abgelegt wird. Das Ergebnis entspricht im Wesentlichen der Eingabedatei mit Ausnahme der Tabellen:

de.aosd.PortScannerFixture
Rechner Portnummer Dienst Beschreibung Status()
localhost 20 FTP-Data Dateitransfer (Datentransfer vom Server zum Client) inaktiv expected
not implemented actual
localhost 22 SSH Secure Shell aktiv expected
not implemented actual
localhost 80 HTTP Webserver aktiv expected
not implemented actual

Ok, jetzt können wir uns der Implementierung der Status()-Methode widmen, um die roten Tabellen-Einträge wegzubekommen:
public String Status() throws UnknownHostException {
    return PortScanner.isActive(Rechner, Portnummer) ? "aktiv" : "inaktiv";
}

Unter der Annahme, dass die PortScanner.isActive()-Methode das Gewünschte leistet, sollten die roten Einträge nun grün werden:

de.aosd.PortScannerFixture
Rechner Portnummer Dienst Beschreibung Status()
localhost 20 FTP-Data Dateitransfer (Datentransfer vom Server zum Client) inaktiv
localhost 22 SSH Secure Shell aktiv
localhost 80 HTTP Webserver aktiv

Damit wissen wir nicht nur, dass Port 22 und 80 auf unserem Rechner aktiv sind, sondern haben auch die isActive()-Methode unserer PortScanner-Klasse getestet.

Sollen noch andere Rechner oder Ports getestet werden, wird die Tabelle entsprechend erweitert. Was aber, wenn wir eine Liste aller aktiven Ports vorgeben wollen? Für solch eine Überprüfung bietet sich die RowFixture an – aber das ist ein Thema für's nächste Mal.

stay tuned...

Links:

... comment