Das Robot Framework ist sehr flexibel einsetzbar und hat uns noch nie vor unlösbare Probleme gestellt. An manchen Enden jedoch muss noch etwas nachgebessert werden, um die Entwicklung und Wartung der automatisierten Tests effizienter gestalten zu können. Einer dieser Bereiche ist die Einbettung in die gewohnte Entwicklungsumgebung. Es gibt zwar die Robot IDE , diese deckt aber nur einen Bruchteil des Benötigten ab. Hier wird gezeigt, wie man das Robot Framework und selbstentwickelte Java Keywords bequem mit Eclipse und Maven nutzen kann.
Robot wird über ein Startskript gestartet, je nach Umgebung jybot.sh oder jybot.bat. (Wenn man auf Java Keywords verzichtet, reicht auch ein pybot). Über eine Vielzahl an Parametern wird gesteuert, welche Tests ausgeführt werden sollen. Vorher sollten auch noch die eigenen Keywords kompiliert und in den Classpath eingebunden werden. Da die Entwicklung häufig in Windows stattfindet, die CI-Umgebung aber unter Linux läuft, sind somit zwei nicht-triviale Skripte zu pflegen, um die Robot Tests aufzurufen. Das geht auch einfacher:
1. Maven
Statt das Startskript manuell zu pflegen, kann jybot direkt aus Maven gestartet werden. Die Beispiel pom.xml weiter unten zeigt die Details:
- Mit dem maven-dependency-plugin werden alle libraries in ein Verzeichnis kopiert, welches nachher in den Classpath eingebunden wird. So können auch Bibliotheken von Drittanbietern bequem genutzt werden.
- Das exec-maven-plugin ruft in dem Phase integration-test ‚jybot‘ auf. Dies erfordert natürlich, dass jybot auch im PATH der jeweiligen Umgebung eingebunden ist. Auf ein explizites .sh oder .bat kann hier zum Glück verzichtet werden.
- Der Classpath wird auf
${project.build.directory}${file.separator}classes${path.separator}
${project.build.directory}${file.separator}dependency${file.separator}*gesetzt. Das heißt er beinhaltet
- Die kompilierten Klassen der eigenen Java Keywords
- Alle jar-Dateien der in der pom.xml angegebenen dependencies. (Die Wildcard-Notation funktioniert nur mit Java 6!)
- Dann wird das jybot-Skript entsprechend parametrisiert:
- -C off stellt die farbige Ausgabe ab
- –variable … übergibt einige Variablen. Diese werden im properties-Element der pom.xml auf entwicklerfreundliche Defaultwerte gesetzt. Ist die Umgebungsvariable „env“ auf „ci“ gesetzt, d.h. läuft der Maven Build im Kontext des CI-Servers, wird das entsprechende Profil aktiviert, welches die Variablen auf die für das Testsystem relevanten Werte setzt.
- –variable RESOURCES:${project.basedir}/src/main/robot/resource Dadurch können Resources in den Testfällen einfach mit ${RESOURCES}/keyword-file.txt referenziert werden.
- –exclude inprogress Dies schließt alle Testfälle aus, die momentan in Bearbeitung sind. Dadurch kann ein Entwickler Zwischenstände commiten, ohne dass der CI-Server diese Tests schon ausführt. Sobald ein Test funktioniert, muss das Tag natürlich entfernt werden.
- –include author-* Alle Tests sollten meiner Meinung nach mit einem author versehen werden. Dieses include schließt somit alle tests ein, bietet aber dem Entwickler die Möglichkeit die Tests auf wenige einzuschränken, an denen er aktuell arbeitet. Dies ließe sich auch durch Maven Properties und Profiles weiter vereinfachen. Es gibt momentan noch einen Bug in Jython, der jeden Parameter versucht zu passenden Dateinamen zu expandieren (Jython Issue 1567 ) – es sollte also keine Datei geben, die auf author-* matched.
- ${ROBOT_TESTS} Dies gibt letztlich an, welche Tests ausgeführt werden sollen. Normalerweise sind das alle Tests in ${project.basedir}/src/main/robot/suite. Durch die Möglichkeit des Tagging und der Verzeichnishierarchie hat man somit zwei unanbhängige Möglichkeiten die Testfälle zu verwalten und zur Ausführung auszuwählen. Das sollte ausreichend Flexibilität bieten.
Langfristig wäre es natürlich schöner, gleich ein Plugin für maven zu schreiben, statt umständlich das Skript zu parametrisieren. Bis es soweit ist, sollte die hier vorgestellte Lösung aber hinreichend sein.
1<project> 2... 3 <build> 4 <plugins> 5 <plugin> 6 <groupId>org.apache.maven.plugins</groupId> 7 <artifactId>maven-dependency-plugin</artifactId> 8 <version>2.1</version> 9 <executions> 10 <execution> 11 <id>get dependencies</id> 12 <phase>pre-integration-test</phase> 13 <goals> 14 <goal>copy-dependencies</goal> 15 </goals> 16 </execution> 17 </executions> 18 </plugin> 19 <plugin> 20 <groupId>org.codehaus.mojo</groupId> 21 <artifactId>exec-maven-plugin</artifactId> 22 <version>1.1.1</version> 23 <executions> 24 <execution> 25 <id>robot</id> 26 <phase>integration-test</phase> 27 <goals> 28 <goal>exec</goal> 29 </goals> 30 </execution> 31 </executions> 32 <configuration> 33 <executable>jybot</executable> 34 <environmentVariables> 35 <CLASSPATH>${project.build.directory}${file.separator}classes${path.separator}${project.build.directory}${file.separator}dependency${file.separator}*</CLASSPATH> 36 </environmentVariables> 37 <arguments> 38 <argument>-C</argument> 39 <argument>off</argument> 40 <argument>--variable</argument> 41 <argument>SYSTEM_UNDER_TEST:${system-under-test}</argument> 42 <argument>--variable</argument> 43 <argument>DB_PORT:${db.port}</argument> 44 <argument>--variable</argument> 45 <argument>RESOURCES:${project.basedir}/src/main/robot/resource</argument> 46 <argument>--outputdir</argument> 47 <argument>${project.build.directory}/robot</argument> 48 <argument>--output</argument> 49 <argument>${project.groupId}-${project.artifactId}-${project.version}-output.xml</argument> 50 <argument>--log</argument> 51 <argument>${project.groupId}-${project.artifactId}-${project.version}-log.html</argument> 52 <argument>--report</argument> 53 <argument>${project.groupId}-${project.artifactId}-${project.version}-report.html</argument> 54 <argument>--exclude</argument> 55 <argument>inprogress</argument> 56 <argument>--include</argument> 57 <argument>author-*</argument> 58 <argument>${ROBOT_TESTS}</argument> 59 </arguments> 60 </configuration> 61 </plugin> 62 </plugins> 63 </build> 64 <profiles> 65 <profile> 66 <id>ci-common</id> 67 <activation> 68 <property> 69 <name>env</name> 70 <value>ci</value> 71 </property> 72 </activation> 73 <properties> 74 <db.port>1234</db.port> 75 <system-under-test>testservername</system-under-test> 76 </properties> 77 </build> 78 </profile> 79 </profiles> 80 <properties> 81 <ROBOT_TESTS>${project.basedir}/src/main/robot/suite</ROBOT_TESTS> 82 <db.port>4711</db.port> 83 <system-under-test>localhost</system-under-test> 84 </properties> 85</project>
2. Struktur des Projektes
Mit der oben angegebenen pom.xml ergibt sich in Eclipse die folgende Projektstruktur – entweder durch das m2eclipse-Plugin oder durch die Verwendung des eclipse:eclipse Goals des maven-eclipse-Plugins .
3. Robot Starten
Die Ausführung der automatisierten Fachtests ist dann nur noch eine Frage des Aufrufs des entsprechenden Maven-Lebenszyklus:
4. Selenium Server
Werden mit Robot auch Browser-Tests durchgeführt, bietet es sich an, den Seleniumserver als „External Tool“ in Eclipse zu integrieren:
5. Kompletter Workflow
Anhand des konkreten Beispiels soll in einem kleinen Screencast vermittelt werden, wie in Eclipse die Testfälle entwickelt und gestartet werden. Da man die Details bei dem eingebettetem Video schlecht erkennen kann, habe ich auch eine Fullscreen-Version bereitgestellt.
Weitere Beiträge
von Andreas Ebbert-Karroum
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Andreas Ebbert-Karroum
Agile Principal Consultant
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.