Testautomatisierung mit dem Robot Framework

1 Kommentar

Ein wenig Geschichte

Das Robot Framework ist ein umfangreiches Werkzeug für die Automatisierung von Tests. Das Robot Framework wurde ursprünglich bei Nokia Siemens Networks entwickelt. Eine erste Version wurde hier bereits im Jahr 2005 für Projekte genutzt. Seit dem Jahr 2008 ist das Projekt Open Source und steht unter der Apache License 2.0 allen Nutzern zur Verfügung.

Als Benutzer der ersten Stunde (zu dieser Zeit habe ich bei Nokia Siemens Networks gearbeitet) habe ich die Entwicklung des Robot Frameworks bis heute verfolgt. Dabei ist der Ansatz der Test-Entwicklung mit Schlüsselwörtern (im Folgenden nutzen wir hierfür den englischen Begriff Keywords) von Anfang an konsequent verfolgt worden und bildet die Stärke und das Rückgrat des Robot Frameworks.

Neben der kontinuierlichen Weiterentwicklung des eigentlichen Frameworks hat der Schritt in Richtung Open Source auch zu einem sehr lebendigen Eco-System rund um das Framework geführt. So gibt es ein sehr aktives Forum, in welchem auch die Core-Entwickler regelmäßig zu finden sind. Weitere wichtige Projekte sind eine grafische Oberfläche für die Entwicklung von Testfällen und eine Vielzahl an fertigen Test-Bibliotheken für die verschiedensten Test-Szenarien.

Testautomatisierung – Der Weg des Robot Frameworks

Das Prinzip der Automatisierung von Tests gab es schon lange bevor das Thema Test-Frameworks wirklich aktuell wurde. Oft wurden Skripte geschrieben, welche dann bestimmte Aspekte einer Anwendung – oft semi-automatisiert – getestet haben. Mit dem verstärkten Aufkommen Agiler Softwareentwicklung und den damit einhergehenden – oft relativ kurzen – Iterationen und häufigerem Testbedarf hat auch die Professionalisierung der Test-Frameworks noch einmal einen Schub bekommen. Im Open Source Umfeld gibt es heute eine Vielzahl an Test-Frameworks. Bekannte Vertreter neben dem Robot Framework sind hier insbesondere Cucumber und FitNesse.

“Checks Are Machine-Decidable; Tests Require Sapience“ – Michael Bolten

Das Robot Framework bietet mit seinem konsequenten Ansatz Tests keyword-driven zu entwickeln hier einen eigenständigen Weg an. Listing 1 zeigt ein einfaches Beispiel für einen mit dem Robot Framework geschriebenen Test.

*** Settings ***
Library           OperatingSystem

*** Test Cases ***
Windows Verzeichnis Nicht Leer
    [Documentation]    Windows-Verzeichnis darf nicht leer sein.
    [Tags]    windows    softwerker
    ${DATEIEN}=    Anzahl Dateien im Windows-Verzeichnis
    Should Not Be Equal As Numbers    0    ${DATEIEN}

*** Keywords ***
Anzahl Dateien im Windows-Verzeichnis
    ${ANZAHL}=    Count Files In Directory    C:\\WINDOWS
    Log    ${ANZAHL}
    [Return]    ${ANZAHL}

Listing 1 – Test-Implementierung mit dem Robot Framework

Dieser Beispiel-Test prüft, dass das Windows-Verzeichnis nicht leer ist. (Der Test kann leicht für ein Unix-Betriebssystem angepasst werden.)

Es geht hier weniger um den Test an sich, als vielmehr um ein einfaches Beispiel, welches den Aufbau der Tests zeigt. Einzelne Testfälle werden im Robot Framework in sogenannten Test Suites zusammengefasst. Hierbei handelt es sich um eine Datei, welche Testfälle beinhaltet. In unserem Beispiel gibt es einen Testfall „Windows Verzeichnis Nicht Leer“ und ein eigenes Keyword „Anzahl Dateien im Windows-Verzeichnis“. In größeren Projekten werden eigene Keywords in sogenannte Resource-Dateien zusammengefasst und ausgelagert. Diese werden dann – analog zu den Test-Libraries im Settings-Bereich einer Test Suite eingebunden. Im Beispiel wird die Operating System Bibliothek des Robot Frameworks genutzt, um Tests auf dem lokalen Dateisystem zu ermöglichen. Auch wird bereits an diesem einfachen Beispiel die Möglichkeit gezeigt Wertzuweisungen zu nutzen. In diesem Fall wird die Variable ${DATEIEN} erzeugt, welche dann wieder als Parameter für weitere Keywords genutzt werden kann. Es gibt verschiedene Formate für die Eingabe der Tests. Das im Beispiel genutzte Text-Format stellt dabei so eine Art Standard da, der auch in der Robot IDE genutzt wird. Daneben gibt es noch ein HTML-Format und auch die Möglichkeit Tests im BDD-Stil zu schreiben. Dies würde jedoch den Rahmen dieses Artikels sprengen.

“If you don’t care about quality, you can meet any other requirement.” – Gerald M. Weinberg

Abbildung 1 Das Beispiel aus Listing 1 in der Robot IDE

Abbildung 1 Das Beispiel aus Listing 1 in der Robot IDE

Das Beispiel zeigt die Verwendung eigener Keywords und wie diese wiederum in Testfällen zusammen mit weiteren Keywords kombiniert werden können. Ein Testfall ist dann erfolgreich, wenn jedes aufgerufene Keyword fehlerfrei durchgelaufen ist. Durch die Möglichkeit in Keywords wieder weitere Keywords aufzurufen ergibt sich ein einfaches und gleichzeitig mächtiges Konzept für das Schreiben von Tests und Test-Bibliotheken. Mit Hilfe der Robot IDE ist es so auch weniger technisch orientierten Projektmitgliedern möglich Test-Funktionalitäten zu schreiben und zu erweitern. Abbildung 1 zeigt das Beispiel aus Listing 1 in der Robot IDE.

Eine weitere Stärke des Robot Frameworks ist das Reporting. Für jeden Testlauf wird ein Report erzeugt, der die Ergebnisse übersichtlich auflistet und anhand der Hintergrundfarbe (grün oder rot) auch direkt den Erfolg (oder eben Misserfolg) dokumentiert. Aus dem Report, welcher als HTML-Seite vorliegt, ist es direkt möglich in eine Log-Seite (ebenfalls im HTML-Format) zu springen. Hier werden alle einzelnen Keyword-Aufrufe protokolliert. Dies erleichtert eine Fehlersuche bei der Erstellung der Tests und kann ggf. auch genutzt werden um weitere Testinformationen auszugeben in einer Art Debug-Ausgabe.

Abbildung 2 Beispiel-Reports

Abbildung 2 Beispiel-Reports

Die obige Abbildung zeigt Beispiele für Reports die vom Robot Framework erzeugt werden.

Das Robot Framework im Überblick

Nach dem Einstieg anhand eines einfachen Beispiels im vorherigen Kapitel gibt dieses Kapitel einen Überblick über die wichtigsten Aspekte des Robot Frameworks. Abbildung 3 skizziert diese Zusammenhänge .

Abbildung 3 Robot Framework im Überblick

Abbildung 3 Robot Framework im Überblick

Neben der Möglichkeit frei verfügbare Test-Bibliotheken zu nutzen oder eigene Keywords in Resource Files zu bündeln ist es natürlich auch möglich eigene Test-Bibliotheken zu programmieren. Auch wenn andere Programmiersprachen hier möglich sind passiert dies doch im Allgemeinen in Python oder Java.

Hiermit kommen wir dann auch direkt zum Installation Stack des Robot Frameworks (siehe Abbildung 3). Ursprünglich in Python programmiert ist die Unterstützung für Java im Laufe der Zeit immer besser geworden.

Abbildung 4 Robot Framework Installation Stacks

Abbildung 4 Robot Framework Installation Stacks

Im Prinzip kann man die Installation Stacks aus Abbildung 4 als eine Art Evolution betrachten. Nach der Anfangs reinen Python-Installation kam später mit der Integration von Jython die Möglichkeit hinzu, Keyword-Bibliotheken auch in Java zu programmieren. Mittlerweile ist es möglich das Robot Framework inkl. aller benötigten Bibliotheken (Python und Java) in JAR-Dateien zu installieren und zu nutzen. Dies hat oft den großen Vorteil, dass nicht alle Team-Mitglieder lokale Python- und Jython-Installationen benötigen. Java ist meist auf jedem Rechner installiert. Desweiteren lässt sich das Robot Framework in dieser Form auch schneller und einfacher für verschiedene Benutzer installieren.

Entwicklung eigener Keyword-Bibliotheken

Früher oder später reicht die Kombination bestehender Keywords zu neuen Keywords in den Resource Dateien nicht mehr aus und es müssen projekt-spezifische Keyword-Bibliotheken her. Die Anwendungsfälle hierfür sind vielfältig. Oft macht es Sinn z.B. eine Test-Möglichkeit für die Service-Schicht der zu testenden Anwendung zu schaffen. In einem Projekt haben wir eine Bibliothek für die Ansteuerung von Java JMX-Methoden geschrieben. Wobei diese im Prinzip schon wieder eine generische Test-Bibliothek sein könnte.

public class DatabaseLibrary {
	public static final String ROBOT_LIBRARY_SCOPE = "GLOBAL";
 
	private Connection connection = null;
 
	public void connectToDatabase(String driverClassName, 
            String connectString, 
            String dbUser, 
            String dbPassword) throws SQLException,
                                      InstantiationException,   
                                      IllegalAccessException, 
                                      ClassNotFoundException {
 
		Class.forName(driverClassName).newInstance();
		setConnection(DriverManager.getConnection(connectString, 
                                                         dbUser,
                                                         dbPassword));
	}
 
	public void disconnectFromDatabase() throws SQLException {
		getConnection().close();
	}
 
	public void tableMustExist(String tableName) throws 
            SQLException,
            DatabaseLibraryException {
 
		DatabaseMetaData dbm = getConnection().getMetaData();
		ResultSet rs = dbm.getTables(null, null, tableName, null);
		try {
			if (!rs.next()) {
				throw new DatabaseLibraryException("Table: " 
                                              + tableName
						+ " was not found");
			}
		} finally {
			rs.close();
		}
	}
 
…

Listing 2 – Ausschnitt aus der Datenbank Keyword-Bibliothek

Wie bereits erwähnt können Keyword-Bibliotheken für das Robot Framework in verschiedenen Programmiersprachen geschrieben werden. Listing 2 zeigt einen Ausschnitt aus der Datenbank-Bibliothek.

Im Prinzip ist die Vorgehensweise sehr einfach. Die öffentlichen Methoden einer Java-Klasse werden zu Keywords der entsprechenden Keyword-Bibliothek. Idealerwiese baut man daraus ein JAR, welches dann beim Starten des Robot Frameworks mit eingebunden wird. Für eine bessere Lesbarkeit erlaubt das Robot Framework das Einfügen von Leerzeichen und beliebige Groß- und Kleinschreibung beim Aufruf von Keywords (=Methoden) aus einer Java Bibliothek.

*** Setting ***
Suite Setup       Connect To Database    com.mysql.jdbc.Driver    
                  jdbc:mysql://localhost:3333/databaselibrarydemo    dblib    dblib
Suite Teardown    Disconnect From Database
Library           org.robot.database.keywords.DatabaseLibrary

*** Test Case ***
Basic Checks
    Table Must Exist    DemoTable

Listing 3 – Einbindung eigener Java Keyword-Bibliotheken

Einbinden von Remote Bibliotheken

Eine oft sehr hilfreiche Funktion ist die Möglichkeit Test-Bibliotheken als sogenannte Remote Bibliotheken einzubinden. Bezogen auf unser Beispiel aus Listing 3 würde sich lediglich das Einbinden der Bibliothek mittels

Library org.robot.database.keywords.DatabaseLibrary

ädern. Der Aufruf würde dann wie folgt aussehen:

Library Remote http://localhost:8271

Dabei gehen wir davon aus, dass der Server für die Test-Bibliothek lokal unter dem Port 8271 läuft.

Remote Library Usage

Abbildung 5 Test Bibliotheken remote nutzen

Nicht jede verfügbare Test-Bibliothek unterstützt den Remote-Ansatz. Dies wird in der Beschreibung der entsprechenden Bibliothek dokumentiert.

“Testing is an infinite process of comparing the invisible to the ambiguous in order to avoid the unthinkable happening to the anonymous.” – James Bach

Die Remote-Unterstützung bietet einige Vorteile und sollte auch für Eigenentwicklung in Erwägung gezogen werden:

  • Gerade bei Java-Bibliotheken ermöglicht die Remote-Unterstützung, dass die eigentliche Robot-Installation allein mit Python (ohne Jython) lauffähig bleibt.
  • Es ist sehr einfach möglich testhalber Bibliotheken einzubinden auch ohne eine bestehende Installation sofort – ggf. auf mehreren Rechnern – erweitern zu müssen.
  • Abhängig vom Umfang der Tests kann dies auch der Lastverteilung dienen.

Der Einsatz von Remote Bibliotheken ist jedoch völlig optional und kann auch leicht zu einem späteren Zeitpunkt im Projekt erfolgen, falls notwendig. Die Auswirkungen auf bereits implementierte Tests sind – wie oben gesehen – minimal.

Architektur zum Testen von Web-Anwendungen

Ein häufiger Anwendungsfall für die Nutzung von Test-Frameworks ist sicherlich der automatisierte Test von Web-Anwendungen. Hier kommt es typischerweise zu einer Kombination aus der automatischen Ansteuerung eines Browsers, sowie dem Prüfen von Inhalten auf einer Datenbank (und ggf. weiteren angebundenen Systemen).

Abbildung 6 zeigt wie die Test-Architektur in einem solchen Fall mit dem Robot Framework aussehen könnte. Natürlich ist es jederzeit möglich, dass noch weitere Test-Bibliotheken genutzt werden.

Abbildung 6 Architektur zum Testen von Web-Anwendungen

Abbildung 6 Architektur zum Testen von Web-Anwendungen

Und auch wenn direkte Oberflächen-Tests oft notwendig sind, so sollte man deren Anzahl doch nach Möglichkeit begrenzen, denn oft laufen diese Tests nicht besonders stabil und müssen oft angepasst werden. Besser ist es hier nur einen Grundstock an Tests zu erstellen und nach Möglichkeit weitere Tests direkt gegen die Service-Schicht der Anwendung zu fahren.

Das Thema „Testen von Webanwendungen“ könnte problemlos einen kompletten eigenen Artikel füllen. Es soll hier daher nur ein sehr grober Überblick gegeben werden.

Fazit

Das Robot Framework ist ein leistungsstarkes und umfangreiches Test-Framework mit einer aktiven Community und einer Vielzahl zusätzlicher Tools. Auch gibt es für viele Technologien bereits fertige frei verfügbare Test-Bibliotheken.

Der Einstieg in die Test-Entwicklung mit dem Robot Framework ist nicht wirklich schwierig, erfordert aber eine gewisse Einarbeitungszeit um die verschiedenen Konzepte zu verstehen und sinnvoll einsetzen zu können. Hierbei helfen die wirklich sehr gute und umfangreiche Dokumentation, sowie das aktive Forum.

Letzen Endes macht es immer Sinn verschiedene Tools für den eigenen Anwendungsfall zu evaluieren. Dabei lohnt sich ein Blick auf das Robot Framework meiner Meinung nach auf jeden Fall.

Thomas Jaspers

Langjährige Erfahrung in agilen Softwareprojekten unter Einsatz von Java-Enterprise-Technologien. Schwerpunkt im Bereich der Testautomatisierung (Konzepte und Open-Source Werkzeuge).

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

Kommentare

  • Niklas

    Hi Thomas! Klasse Artikel. Vielleicht hast Du ja mal Zeit das auf der Community vorzustellen. Würde uns sehr freuen! VG Niklas

Kommentieren

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