FitNesse vs. Robot Framework – Agile Testing Tools

10 Kommentare

Die Auswahl der “Kontrahenten”

Aus dem doch recht großen Pool an – kommerziellen und frei verfügbaren –Tools für agiles Testen möchte ich im Folgenden einen genaueren Blick auf FitNesse und das Robot Framework werfen. Beide Tools sind frei verfügbar und wie man an den Projektseiten sehen kann werden beide Projekte kontinuierlich weiterentwickelt. Auch finden sich bei Beiden aktuelle Support-Mailinglisten, was sich bei einem ernsthaften Einsatz sicherlich sehr hilfreich ist. Natürlich ist die Auswahl der Kontrahenten ein Stück weit willkürlich, da es noch eine ganze Reihe weiterer Tools in diesem Umfeld gibt. Zum Beispiel Concordion, welches ebenfalls frei verfügbar ist, oder Liquid als eine kommerzielle Alternative. Da Zeit aber – leider – eine begrenzte Ressource ist, musste ich hier eine Vorauswahl treffen. Ich hoffe aber in einem späteren Artikel noch auf weitere Tools eingehen zu können.

Die Installation

Bei der Installation hat FitNesse auf dem Papier zunächst einmal die Nase vorn. Da das Tool vollständig in Java geschrieben wurde sind keine großen Verrenkungen notwendig. Allerdings ganz so einfach wie beschrieben lief die Installation zunächst nicht durch. Das einfache java -jar fitnesse.jar ergab auf meinem Rechner eine Menge Fehlermeldungen der Art:

Unpacking new version of FitNesse resources. Please be patient.
java.io.FileNotFoundException: .FitNesseRootfilesimagesexecutionStatusThumbs.db (Das System kann den angegebenen Pfad nicht finden)

Für die Evaluierung bin ich daher auf einen etwas älteren Release-Stand gegangen, bei dem die Installation noch als ZIP ausgeliefert wurde. Nach dem Auspacken der ZIP-Datei konnte FitNesse dann ohne Probleme gestartet werden.

Das Robot Framework ist bei der Installation da nominell schon etwas anspruchsvoller, da es neben dem eigentlichen Framework zunächst eine Python– und eine Jython-Installation erwartet. Da die Installer hier jedoch sehr ausgereift sind war sowohl eine lokale Installation unter Windows XP als auch eine serverseitige Installation unter Linux völlig unproblematisch.

Achtung: Um den grafischen Editor des Robot Frameworks zu nutzen muss die Jython-Version 2.5.0 (oder höher) installiert werden. Wer wie ich zunächst eine ältere Version installiert hat muss nach dem Jython-Update, welches in ein seperates Verzeichnis erfolgt, noch in der Datei C:Python26Scriptsjybot.bat die Zeile set jython=“C:jython2.5.0jython.bat entsprechend setzen (hier die benutzten Default-Pfade unter Windows).

Somit liegt der Installationsaufwand bei beiden Tools vom Download bis zum ersten erfolgreichen Start bei ca. 15 bis 30 Minuten. Und auch trotz des Schnitzers bei der ersten Installation von FitNesse sehe ich hier beide Tools als extrem ausgereift an.

Die Philosophie

Auf den ersten Blick verfolgen beide Tools recht unterschiedliche Ansätze. FitNesse wird als eigener Web-Server gestartet und bringt eine eigene Web-Oberfläche in Form eines Wikis mit.

FitNesse_1

Neue Testcases werden durch editieren der Hauptseite als neue Seiten hinzugefügt, die dann im Wikistil bearbeitet werden können. Es ist möglich einzelne Tests direkt über die Web-Oberfläche auszuführen oder aber Tests scriptgesteuert zu starten.

Das Robot Framework kommt hier schon etwas schlichter daher. Testcases werden in Form von HTML-Tabellen beschrieben und es gibt auch keine Möglichkeit einzelne Tests aus einer Oberfläche heraus zu starten, sondern die Testausführung erfolgt immer über die Kommandozeile. Mit der Robot IDE gibt es jedoch einen sehr guten Editor (wenn auch noch im Alpha-Stadium), der das Erstellen der Testfälle – im Vergleich zum direkten Editieren der HTML-Seiten – extrem vereinfacht.

Robot_1

Allerdings gibt es auch grundlegende Gemeinsamkeiten zwischen beiden Tools. Tests werden in sogenannten Keywords implementiert. Hierbei unterstützen beide Frameworks Java. Das Robot Framework unterstützt zusätzlich „nativ“ Python, aber in diesem Artikel liegt der Fokus auf der Implementierung von Keywords in Java. Und da treten die Gemeinsamkeiten schon recht deutlich zu Tag:

  • In beiden Fällen werden die Keywords in Java-Klassen implementiert, welche wiederum als Bibliotheken in Form von JAR-Files eingebunden werden.
  • Mehrere Keywords formen einen Testfall.
  • Die Keywords können mit Parametern gefüttert werden, um verschieden Anwendungsfälle durchzuspielen (z.B. Testen von Daten in einer Datenbank).
  • Die Tests können scriptgesteuert ausgeführt werden und es wird ein Report zur Auswertung der Testresultate erzeugt.

Beide Tools legen aber natürlich auch eigene Schwerpunkte bei der Definition von Testcases. FitNesse hat hier ein eigenes Konzept Testdaten in tabellarischer Form an eine Testklasse zu übergeben. Auch wird hier der Ansatz verfolgt Tests in eher „natürlicher“ Sprache zu verfassen, indem Methoden und Parameter in einer Zeile „bunt gemischt“ werden können. Das Robot Framework verfolgt bei den Testklassen einen eher klassichen Ansatz, wobei auch hier durch Leerzeichen in den Methodennamen sprechende Namen sehr gut möglich sind. Dazu können sehr einfach bestehende Keywords zu neuen – mächtigeren – Keywords zusammengefasst werden. Auch liegt der Fokus hier sehr auf den Möglichkeiten Testfälle zu dokumentieren und mit Tags zu versehen, welche später im Reporting benutzt werden.

Ein Test mit Selenium

Um beide Tools anhand eines einfachen Beispiels zu testen habe ich mich für einen Selenium-Test entschieden, bei dem zunächst eine Seite in Google gesucht wird und dann diese Seite auf einen bestimmten Text hin abgeprüft wird. Beide Frameworks liefern eigene Libraries für die Unterstützung von Selenium mit (FitNesse Selenium und Robot Selenium). Jedoch haben mich beide Libraries nicht wirklich überzeugt, da es zu viele Probleme und Beschränkungen gibt und am Ende des Tages sind diese Bibliotheken schlicht auch komplizierter in der Benutzung als die Selenium IDE, welche als Firefox PlugIn zur Verfügung steht.

Daher werde ich im Folgenden die Selenium IDE nutzen, um eine Java-Klasse mit den passenden Keywords (=Test-Methoden) zu erstellen und versuchen diese dann sowohl in FitNesse als auch in das Robot Framework einzubinden.

Die folgende Java-Klasse kann so aus der Selenium IDE heraus (als Java-Export) erzeugt werden. Es wird zunächst in Google nach „codecentric gmbh“ gesucht. Die Homepage muss unter den Resultaten auf der ersten Seite sein. Auf der codecentric-Homepage wird dann zum Impressum navigiert und geprüft das die korrekte Handelsregister-Nummer dort zu finden ist. (Natürlich könnte man den ganzen Test noch verfeinern, aber zu Demonstrationszwecken soll das genügen.)

package de.codecentric.agiletesting.demo;
 
import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;
 
public class MyDemo extends SeleneseTestCase {
	public void setUp() throws Exception {
		setUp("http://www.google.de/", "*chrome");
	}
	public void testKeyword() throws Exception {
		selenium.open("/");
		selenium.type("q", "codecentric gmbh");
		selenium.click("btnG");
		selenium.waitForPageToLoad("30000");
		selenium.click("//div[@id='res']/div/ol/li[1]/h3/a/em");
		selenium.waitForPageToLoad("30000");
		selenium.click("//div[@id='footer_innen']/p/a[1]/span");
		selenium.waitForPageToLoad("30000");
		verifyTrue(selenium.isTextPresent("HRB 19214"));
	}
}

Nach kleineren Anpassungen am Namen und Package ist die Klasse im Prinzip für Tests nutzbar und hat zudem den Vorteil, dass diese auch aus Eclipse heraus als JUnit-Test gestartet werden kann. Dies ist ein wenig versteckt in der Ableitung von der Klasse SeleneseTestCase.

Vorbereitungen
Diese Klasse wird jetzt in ein kleines Eclipse-Projekt eingebunden und dann als SeleniumKeywordDemo.jar exportiert. Dazu benötigen wir das selenium-java-client-driver.jar, welches von der Selenium-Homepage heruntergeladen werden kann und das junit.jar, welches Teil jeder Eclipse-Installation ist. Ich habe alle JARs in ein Verzeichnis C:projectscodecentricSeleniumKeywordDemolib abgelegt, so dass diese von dort in den Tests genutzt werden können. Desweiteren muss ein lokaler Selenium-Server gestartet werden, um die Tests ausführen zu können.

Robot Framework – Test einbinden und ausführen
Beim Robot Framework starten wir zunächst den grafischen Editor in einer Shell (Pfade bei einer Default Windows-Installation):

C:>cd C:Python26Scripts
C:Python26Scripts>ride.py

Dann erzeugen wir unter Suite -> New Suite einen neue Testsuite und fügen unter dem Top-Level Ordner die benötigten Bibliotheken hinzu (-> New Library). Dabei werden hier keine JARs angegeben, sondern es werden die voll qualifizierten Klassennamen hinzugefügt. In unserem Beispiel also de.codecentric.agiletesting.demo.MyDemo. Bei der späteren Ausführung der Tests über ein Script muss dann sichergestellt werden, dass alle benötigten JARs im Klassepfad liegen. In der Robot IDE fügt man dann einen neuen Test hinzu und ruft einfach die beiden Keywords aus der Java-Klasse auf.

Da die setUp()-Methode jedoch keinen echten Testcase implementiert sollten wir diese als Setup-Methode für unseren Testsuite definieren. Ein Klick auf den folgenden Screenshot führt zu den HTML-Sources des fertigen Robot-Tests.

Robot_2

Nun brauchen wir noch ein Batch-File, um die Tests aufrufen zu können. Das folgende Script übernimmt diesen Job unter Windows:

@echo off
set CLASSPATH=C:projectscodecentricSeleniumKeywordDemolibjunit.jar;C:projectscodecentricSeleniumKeywordDemolibselenium-java-client-driver.jar;C:projectscodecentricSeleniumKeywordDemolibSeleniumKeywordDemo.jar
C:Python26Scriptsjybot C:projectscodecentricSeleniumKeywordDemoSeleniumDemoTest.html

Der Test wird durch das Starten des Batch-Files gestartet und läuft dann problemlos durch. Das Firefox- und SeleniumRC-Fenster bleiben jedoch nach dem Test geöffnet und müssen von Hand geschlossen werden. Bei einem echten Test würde diese noch in der Java-Klasse hinzugefügt.

Das Robot Framework erzeugt eine XML Output-Datei aus der automatisch ein sehr ansehnlicher und umfangreicher HTML-Report erstellt wird und eine Log-Datei im HTML-Format, in der man ggf. Fehler analysieren kann.

FitNesse – Test einbinden und ausführen
Der normale Weg einen neuen Test in FitNesse hinzuzufügen ist über die Web-Oberfläche. Voraussetzung ist also, dass FitNesse gestartet wurde. Auf der Homepage dann Edit auswählen und im Textfeld einfach die neue Testseite als SeleniumDemoTest hinzufügen und speichern. Nun taucht ein „?“ als Link hinter SeleniumDemoTest auf. Durch Anklicken wird die neue Seite zum Editieren geöffnet. Auch hier ist der Test recht schnell geschrieben, wobei es allerdings eine Falle gibt. Die Java-Klasse muss von der FitNesse-Klasse DoFixture abgeleitet werden, ansonsten gibt es einen „Class de.codecentric.agiletesting.demo.MyDemo is not a fixture.“ Fehler. Das habe ich doch erst nach einigem Suchen herausgefunden. Damit ergibt sich der folgende Quelltext für den Test:

!path C:fitnessefitnesse.jar
!path C:fitnesselibfitlibrary.jar

!path C:projectscodecentricSeleniumKeywordDemolibjunit.jar
!path C:projectscodecentricSeleniumKeywordDemolibSeleniumKeywordDemo.jar
!path C:projectscodecentricSeleniumKeywordDemolibselenium-java-client-driver.jar

!|de.codecentric.agiletesting.demo.MyDemo|

|setUp|
|testKeyword|

Und in der Java Klasse muss noch fitlibrary.DoFixture importiert werden und MyDemo muss von DoFixture abgeleitet werden. Dann kann der Test direkt über die Weboberfläche ausgeführt werden und man erhält den folgenden Output:

FitNesse_2

Im allgemeinern werden die Tests natürlich als Teil einer CI-Umgebung (Continuous Integration) ausgeführt und müssen daher scriptgesteuert gestartet werden. Bei FitNesse kann dazu folgendes Kommando benutzt werden.

C:fitnesse>java -cp C:fitnessefitnesse.jar fitnesse.runner.TestRunner -xml report.xml localhost 8070 SeleniumDemoTest

Dabei wird auch ein – initial recht knapper – Report in XML erzeugt.

Wird vergessen das fitnesse.jar JAR-File einzubinden hat dies den unschönen Effekt, dass die Tests sowohl bei der interaktiven Ausführung aus dem Wiki als auch beim Start aus der Kommandozeile heraus einfach hängen bleiben, ohne jedoch eine Fehlermeldung auszugeben.

Zusammenfassung

Es ist meiner Meinung nach nicht wirklich möglich die Tools anhand eines „kurzen“ Blogartikels so ausführlich zu bewerten, dass eine generelle Empfehlung dabei heraus kommen kann. Aufgrund des Umfangs der Tools – und des gesamten Themas „Agiles Testen“ – könnte man vermutlich jeweils ein Buch pro Framework schreiben. Dazu habe ich persönlich bereits in einem früheren Projekt Erfahrungen mit dem Robot Framework gesammelt, was eine absolute Bewertung zusätzlich unfair machen würde. Aber ein paar Tendenzen, was aus meiner Erfahrung die Stärken und/oder Schwächen der einzelnen Tools sind, möchte ich hier zum Abschluss natürlich trotzdem geben.

Eine Stärke von FitNesse ist sicherlich die Möglichkeit Testdaten in tabellarischer Form anzugeben und Tests ein Stück weit umgangssprachlich zu formulieren. Das Robot Framework hat hier nicht ganz so viele Möglichkeiten, liegt aber auch nicht zu weit zurück. Die Möglichkeit Tests aus der Wiki-Oberfläche heraus zu starten ist auf den ersten Blick ein weiterer Pluspunkt für FitNesse. Allerdings müsste man hier noch weiter im Detail prüfen, ob dies in einem konkreten Anwendungsfall wirklich sinnvoll und möglich ist. Potentielle Stolpersteine sind hier Abhängigkeiten zwischen Tests und auch das Problem, dass gewisse Parameter im Testcase gesetzt werden müssen, um diesen lokal oder auf der CI-Umgebung auszuführen. Was das kollaborative Arbeiten an Testfällen angeht ist vermutlich das SCM-System von grösserer Bedeutung als die Frage Wiki oder grafischer Editor. In beiden Fällen gehören die erstellten Testpläne unter Versionskontrolle.

Das Schreiben von Tests mit dem Robot Framework ist dank des grafischen Editors sehr einfach, da der Editor die zugrundeliegenden Konzepte von Testsuites, Testcases und Keywords sehr gut abgebildet. Geht es darum dem Kunden Testpläne zu präsentieren sehe ich auch einen Vorteil in der Benutzung des HTML-Formats, da dieses überall in einem Browser problemlos angeschaut werden kann. Das Austauschen der FitNesse Test-Definitionen erfodert hier schon eher, dass auch der Wiki-Server läuft, da die Dateien als Quelltext schon etwas unverständlich sind. Auch die ausführlichen Reports und die Möglichkeit beliebige Java-Klassen (auch JUnit-Tests) direkt als Bibliotheken und Keywords einzubinden stehen beim Robot Framework auf der Habenseite. Gerade bei eingefleischten Java-Entwicklern gilt es aber zunächst ein gewisses Misstrauen zu überwinden, dass Java Testklassen mittels Jython wirklich problemlos eingebunden werden können.

FitNesse, Robot oder ein völlig anderes Testing-Framework? Es bleibt die Frage der konkreten Projektanforderungen, Erfahrungen im Team und persönlicher Vorlieben. Beide Tools sind es auf jeden Fall wert in Betracht gezogen zu werden auf der Suche nach einem Framework für agiles Testen.

Autor

Thomas Jaspers

Thomas Jaspers

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentare

  • August 24, 2009 von Rainer Foetzki

    Die Verwendung von Fit/Fitnesse fand ich in der Vergangenheit eher umständlich. Verwendet man statt Fitnesse allerdings Slim zusammen mit Trinidad fallen die genannten Nachteile weg.
    – Tests können ins VCS gelegt werden
    – Eigene Fixtures sind nicht mehr abgeleitet
    – Neue Fixtures erleichtern den Einsatz
    – Es wird kein wiki Server benötigt
    – Tests können als JUnit Test in der IDE gestartet werden

    Robot Framework verwende ich derzeit für den Test von Swing Applikationen und bin bisher sehr angetan.

    Für Kunden erstelle ich eine „ausführbare Dokumentation“ mit Concordion – sehr empfehlenswert!

  • Thomas Jaspers

    August 25, 2009 von Thomas Jaspers

    „Ausführbare Dokumentationen“ sind definitiv ein interessantes Thema und danke für den Tip mit Concordion, werde ich mir auf jeden Fall anschauen.

    Das Robot Framework hat laut Forum im neuesten Release auch besseren Support in diese Richtung bekommen: „… ease creating requirement-like test cases with sentence-like keywords such as `Given user selects book from list`. …“

    Das wäre ja dann auch noch mal einen Vergleich mit Concordion wert :).

  • Hi Thomas,

    Nice review, thanks.
    And good to see that you’ve found a good company to work with!

    Cheers,
    Petri

  • Thomas Jaspers

    September 8, 2009 von Thomas Jaspers

    Hi Petri,

    cool you found this one :) … and thanks for the positive feedback. In October I will be at the Agile Testing Days in Berlin and hope to get hold of Pekka to get latest news from Robot Framework :-). Have a good time.

    Cheers
    – Thomas

  • September 30, 2009 von Tuomas Kiviaho

    Fitnesse reminded me of a cool product called GreenPepper. The GUI is basically either JIRA, Confluence or Maven you like CLI. If I remember correctly selenium dialect was also supported.

  • Dezember 4, 2009 von Susana

    I tried to do the integration of selenium IDe and RIDE but I have a problem with the library import
    „ImportError:No module named “

    Do you have some idea about which is the problem?

    Thanks in advance

  • Thomas Jaspers

    Dezember 16, 2009 von Thomas Jaspers

    Sorry for the late reply, but I saw your comment only now. If the problem still exists you can try importing the Selenium Library as follows:

    Library | SeleniumLibrary | 10.0 | localhost | 4445

    The „10.0“ is a timeout value that can be adjusted and „localhost“ and „4445“ must be replaced with your server name and port.

    As Selenium Library is an external Robot Library you have to download and install it before taking it into use. You can download it from here: http://code.google.com/p/robotframework-seleniumlibrary/downloads/list

    If you have more problems please let me know and I can try to help :-).

  • You may also like to try out Tellurium for structured tests. For example,

    ui.Container(uid: "GoogleSearchModule", clocator: [tag: "td"], group: "true"){
       InputBox(uid: "Input", clocator: [title: "Google Search"])
       SubmitButton(uid: "Search", clocator: [name: "btnG", value: "Google Search"])
       SubmitButton(uid: "ImFeelingLucky", clocator: [value: "I'm Feeling Lucky"])
    }
    
    type "GoogleSearchModule.Input", "Tellurium test"
    click "GoogleSearchModule.Search"
    waitForPageToLoad 30000
    
  • In the 8 months since this review was posted, a lot of work has been done on FitNesse to make it even better.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *