Saturday, 19. April 2008
Document-Driven-Development mit FIT (2)
Im ersten Teil hatten wir eine einfache Tabelle mit Rechnername und Portnummer, die wir mit Hilfe des FIT-Frameworks automatisch überprüft haben. Jetzt wollen wir alle aktiven Ports testen:

de.aosd.PortScannerFixture
Rechner Portnummer Status()
localhost 22 aktiv
localhost 80 aktiv

Für solche Aufgaben, wo evtl. Tabellen-Zeilen hinzukommen können, bietet sich die RowFixture an:
public class PortScannerRowFixture extends RowFixture {

    @Override
    public Class<?> getTargetClass() {
        return PortTester.class;
    }

    @Override
    public Object[] query() throws Exception {
        return new Object[0];
    }

}

getTargetClass() liefert eine Klasse zurück, die eine Reihe in der Port-Tabelle vom letzten Mal repräsentiert, und die query()-Methode liefert alle Ergebnisse zurück. Fangen wir mit getTargetClass() an und definieren dafür die PortTester-Klasse:
public class PortTester {
    public String Rechner;
    public int Portnummer;
	
    public String Status() throws UnknownHostException {
        return PortScanner.isActive(Rechner, Portnummer) ? "aktiv" : "inaktiv";
    }
}

Für die Klasse gelten die gleichen Regeln wie für die PortScannerFixture-Klasse vom letzten Mal: Überschriften werden zu Attribute bzw. zu Methoden, wenn sie mit "()" enden. Damit können wir jetzt schonmal den FileRunner aufrufen:

de.aosd.PortScannerRowFixture
Rechner Portnummer Status()
localhost missing 22 aktiv
localhost missing 80 aktiv

FIT bemängelt hier, das beim Test die beiden Zeilen mit Port 22 und 80 fehlen – dies liegt daran, dass query() noch ein leeres Array zurückliefert. Das wollen wir ändern und für jeden offenen Port ein PortTester-Objekt in einem Array sammeln:
public Object[] query() throws Exception {
    ArrayList active = new ArrayList();
    for (int i = 0; i < 1023; i++) {
        PortTester tester = new PortTester();
        tester.Portnummer = i;
        tester.Rechner = "localhost";
        if (tester.Status().equals("aktiv")) {
            active.add(tester);
        }
    }
    return active.toArray();
}

Hier werden jeweils für die wellknown Ports zwischen 0 und 1023 ein PortTester-Objekt angelegt. Nur wenn der Aufruf von Status() "aktiv" ist, wird es in die Liste aufgenommen und am Ende als Array zurückgegeben. Das Ergebnis auf meinem Rechner sah danach so aus:

de.aosd.PortScannerRowFixture
Rechner Portnummer Status()
localhost 22 aktiv
localhost 80 aktiv
localhost surplus   111   aktiv
localhost surplus   631   aktiv

Mit "surplus" werden die Spalten markiert, die hinzugekommen sind. Offensichtlich sind auf meinem Rechner noch die Ports 111 und 631 offen. Ein Blick in List of TCP and UDP port numbers offenbart, dass sich dahinter das "sun protocol" (RPC-Aufruf) und das "Internet Printing Protocol (IPP)" verbirgt.

Damit ist der kleine Ausflug in FIT beendet. Wenn Sie Interesse daran gefunden haben, dann besuchen Sie mich doch auf meinem Vortrag "Wie man tote Dokumente zum Leben erweckt" auf dem Java Forum Stuttgart.

Viel Spaß mit FIT!

Links:

... comment