Slacktime: Robot Framework browst für Dich

Slacktime. Wie Robert bereits am 5. März berichtet hat, bietet Mayflower uns Angestellten alle zwei Wochen einen Tag zur freien Gestaltung von Workshops, eigenen Projekten oder Weiterbildungs-Experimenten. Intern nennen wir den Tag Mayday, für meinen aktuellen Projektkunden ist das unser „Sonntag“ (weil wir da nicht für ihn tätig sind). Einer der letzten solchen Tage stand unter dem Zeichen des Robot Framework.

Das Projekt liegt irgendwo zwischen Weiterbildung und praktisch anwendbarem Tool für die tägliche Projektarbeit. Die Tätigkeiten beim Kunden erfordern es, immer wieder nach Änderungen der Software auf einer Webseite ähnliche Schritte auszuführen. Da man die Seiten dann natürlich irgendwann auswendig kennt und sich eher über die träge, unterpowerte Developmentumgebung ärgert, liegt Automatisierung ja nahe. In der Vergangenheit hatte ich gute Erfahrungen mit Selenium IDE gemacht, das ist mittlerweile aber nicht nur angestaubt, unportabel und schlecht zu warten, es wird auch zunehmend schwieriger, das im Browser überhaupt zu integrieren. Was liegt näher, als sich nochmal intensiv mit dem Nachfolger Selenium 2 zu befassen?

Selenium 2 unterscheidet sich von der IDE durch ein Client-Server-Setup, das zwar Flexibilität mit sich bringt, vor allem in der Erschließung einer größeren Menge Browser, dadurch jedoch andererseits einiges schwieriger aufzusetzen ist. Darüber hinaus entfällt die einfache Standard-Programmierung in JavaScript. Daher lohnt ein Blick auf fertige Komplettlösungen — darunter das Robot Framework, da hier neben den Vorteilen von Selenium auch eine eigene Beschreibungssprache, inklusive komfortabler IDE (beides Python-basiert) geboten wird.

Installation

Die Installation lässt sich auf einem Linux-System im Prinzip in zwei Zeilen erledigen:

$ sudo apt-get install python python-pip python-wxgtk2.8 firefox
$ sudo pip install selenium robotframework robotframework-ride robotframework-selenium2library

Um allerdings das Basis-Betriebssystem auf der Grundlage von Ubuntu nicht durch zu viele Pakete aufzublasen, die von der Python-eigenen Paketverwaltung pip zur Verfügung gestellt werden, liegt es nahe, die Installation auf einer eigenen virtuellen Maschine vorzunehmen. Auf GitHub ist recht einfach eine Maschine zu finden, die sich gut an eigene Zwecke anpassen lässt, was in https://github.com/mayflower/vagrant-robot-framework resultiert. Das Provisioning ist ein wenig rustikal, so richtig unbeaufsichtigt läuft es auch noch nicht, aber es erfüllt schon mal seinen Zweck als Container für die Software.

Testprojekt in RIDE

RIDE visualisiert die Tests

Schnellstart für Eilige

  • Projektordner anlegen
  • vagrant ssh auf die virtuelle Maschine (X11-Weiterleitung ist voreingestellt)
  • In Projektordner wechseln
  • RIDE starten:
    $ ride.py .
  • In RIDE „New Test Suite“ anlegen
  • Bei der Suite unter Imports eine Library mit Name=“Selenium2Library“ eingeben, Args, Alias und Comment bleiben leer
  • In der Suite einen „Test Case“ anlegen
  • Im Test Case als erstes Keyword „Open Browser“ eingeben, als Parameter in die beiden folgenden Felder z.B. „http://google.de“ und „Firefox“ schreiben
  • Tools->Run (F8) wählen. Es öffnet sich der Browser

In etwas länger: Die IDE lässt sich wie beschrieben starten. Grundsätzlich unterstützt sie verschiedene Bibliotheken für Tests, aber das eigentliche Ziel ist es, Selenium 2 auszuprobieren. Da diese Libary intern ist, muss auch kein Pfad oder ähnliches angegeben werden. Je nach Bedarf können beliebige weitere Bibliotheken hinzugefügt werden. Im Portfolio sind hier etwa eine für den Aufbau von Verbindungen über SSH, eine dedizierte HTML-Validierungsbibliothek oder auch das obligatorische „Eval“ für beliebige Systemaufrufe.

Darüber hinaus gliedern sich die Test Suites im Robot Framework in Settings (wie verwendete Bibliotheken), Variablen (globale Parameter), Test Cases (einzelne Tests, die unabhängig oder nacheinander getestet werden) und Keywords (Subroutinen für wiederkehrende Tasks).

Auch dort vorhandenen Test Cases sind vergleichbar mit Selenium IDE. Was jedoch besser funktioniert, ist wiederkehrende Tasks in sogenannte Keywords auszugliedern. So kann der Teil einer Webseite, für den ein Nutzer-Login nötig ist, getestet werden, ohne dass die Anmeldung in jeden Test zu kopieren ist. Die Keywords verhalten sich vielmehr wie ein Bestandteil einer eigenen Bibliothek, und können auch parametrisiert werden. Für mehr Performance und Flexibilität können auch Keywords direkt in Python umgesetzt werden, entsprechende Kenntnisse vorausgesetzt.

Beispiel

*** Settings ***
Library           Selenium2Library

*** Variables ***
${SUCHE}          Mayflower GmbH
${ENGINE}         http://duckduckgo.com

*** Test Cases ***
Oans
    Open Browser    ${ENGINE}    Firefox
    Sind Wir Agil

*** Keywords ***
Sind Wir Agil
    Input Text    id=search_form_input_homepage    ${SUCHE} Agile
    Wait Until Element Is Visible    id=search_button_homepage
    Click Button    id=search_button_homepage
    Element Should Be Visible    //div[contains(@class,'result')]/a[contains(@href,'mayflower.de')]    "Oh noes!"

Dieser Code kann auch als Datei gespeichert und mit der IDE als Projekt geöffnet werden, die einzelnen Sektionen zur Visualisierung werden automatisch aufgetrennt. Klickt man auf den „Run Tests“-Button, bzw. drückt F8, startet die IDE den Firefox aus der VM durch die ssh-Verbindung und spielt den Test ab. Beim Editieren im Text-Modus muss dabei zwischen einzelnen Leerzeichen unterschieden werden, wie im Namen des Keywords und mehrfachen Leerzeichen als Trenner für Argumente. Im visuellen Modus der IDE gibt man dazu die Keywords und Argumente in einzelne Felder ein, zur Unterstützung wird hier noch angezeigt, wie viele Argumente für ein Keyword vorgesehen sind.

Eine Integration in bestehende CI-Umgebungen ist dabei denkbar einfach: Im „Run“-Tab der IDE kann die Befehlszeile ausgelesen werden, über die das erstellte Skript einfach auf der Kommandozeile ausgeführt werden kann:

vagrant@robot-framework:~/proj$ pybot --argumentfile /tmp/RIDEN5iQYx.d/argfile.txt --listener /usr/local/lib/python2.7/dist-packages/robotide/contrib/testrunner/TestRunnerAgent.py:42244:False /home/vagrant/proj/aewfq.robot
======================================================================================================
Aewfq                                                                                                 
======================================================================================================
Oans                                                                                          | PASS |
------------------------------------------------------------------------------------------------------
Aewfq                                                                                         | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
======================================================================================================
Output:  /tmp/RIDEN5iQYx.d/output.xml
Log:     /tmp/RIDEN5iQYx.d/log.html
Report:  /tmp/RIDEN5iQYx.d/report.html

Damit lässt sich der Code in Textform natürlich auch recht einfach über ein Versionskontrollsystem verwalten, um als Basis für Sichtprüfungen zu dienen. Beispielsweise könnten im Rahmen eines Releases eines Shopsystems beispielhaft eine oder mehrere Bestellungen getätigt werden, um sich neben Unit- und Integrationstests des Codes auch der tatsächlichen Ende-zu-Ende-Funktionalität des Shops zu versichern. Logins und andere wiederkehrende Vorgänge können über die Keywords bequem abstrahiert und über externe Bibliotheken sogar per Dialogfenster abfragbar parametrisiert werden.

Fürs Erste ist die angepasste VM Teil des Baukastens. Konkrete Skripte entstehen im Rahmen der täglichen Arbeit. Empfehlungen für flottere oder noch einfachere Alternativen nehme ich gern entgegen. Wer mehr über das Robot Framework wissen will, findet reichlich Dokumentation auf der Homepage

Für neue Blogupdates anmelden:


2 Gedanken zu “Slacktime: Robot Framework browst für Dich

Schreibe einen Kommentar

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