Das auf Groovy basierende Webframework Grails ermöglicht in der Java Welt eine schnelle Entwicklung von Webapplikationen. Die Schnelligkeit erkauft man sich aber nicht durch den Verzicht auf Tests. Im Gegenteil.
Mit dem Canoo – Webtest Plugin sind die Tests genauso schnell geschrieben, wie die Anwendung selbst (was aus meiner Sicht der einzige Weg ist dem Entwickler das Testen schmackhaft zu machen).
Für die Installation reicht ein simples:
> grails install-plugin webtest
Und mit:
> grails create-webtest WebTest name not specified. Please enter: [copy] Copying 1 file to [copy] Copying 1 file to /webtest/tests Web Test generated at webtest/tests/Test.groovy
erstellt man seinen ersten Test für eine Domainklasse von Grails. Alle Tests werden standardmäßig unter /webtest/tests
abgelegt. Ein generierter Test könnte so aussehen:
class GroupTest extends grails.util.WebTest { def testGroupListNewDelete() { invoke 'group' verifyText 'Home' verifyListSize 0 clickLink 'New Group' verifyText 'Create Group' clickButton 'Create' verifyText 'Show Group', description:'Detail page' clickLink 'List', description:'Back to list view' verifyListSize 1 group(description:'edit the one element') { showFirstElementDetails() clickButton 'Edit' verifyText 'Edit Group' clickButton 'Update' verifyText 'Show Group' clickLink 'List', description:'Back to list view' } verifyListSize 1 group(description:'delete the only element') { showFirstElementDetails() clickButton 'Delete' verifyXPath xpath: "//div[@class='message']", text: /.*Group.*deleted.*/, regex: true } verifyListSize 0 } String ROW_COUNT_XPATH = "count(//div[@class='list']//tbody/tr)" def verifyListSize(int size) { ant.group(description:"verify Group list view with $size row(s)") { verifyText 'Group List' verifyXPath xpath: ROW_COUNT_XPATH, text: size, description:"$size row(s) of data expected" } } def showFirstElementDetails() { clickLink '1', description:'go to detail view' } }
und sollte natürlich auf die eigene Anwendung vor dem ersten Testlauf angepasst werden. Tests startet man entweder für eine TestSuite, einen TestCase oder einer Methode aus einem TestCase.
# TestSuite > grails run-webtest # TestCase > grails run-webtest # Methode aus einem TestCase > grails run-webtest
Für den Test wird versucht den ServletContainer zu starten. Bei laufender Grails Applikation empfiehlt es sich daher mit der Option -nostart
zu arbeiten. Das Ergebnis wird detailliert in einer HTML Seite dargestellt, die nach dem Test sofort im Browser aufgerufen wird.

Gerade das Testen von Formularen ist ziemlich stupide. Canoo Webtest bringt für diese Aufgabe einen Webrecorder mit. Dabei handelt es sich um ein Firefox Plugin, mit dem die Bedienung der Webanwendung aufgezeichnet werden kann. Die einzelnen Testbefehle werden im Groovy, XML und Webdriver Formatabgespeichert. Zusätzlich können XPath Abfragen getestet werden.
Fazit:
Testen muss nicht langweilig und stupide sein. Das Canoo Webtest Plugin für Grails ermöglicht das schnelle Erstellen von Tests, was zu einer höheren Testabdeckung der eigenen Webanwendung führt.
Canoo Webtest lässt sich aber auch für Webanwendungen nutzen, die nicht auf Grails basieren. So könnte man es auch PHP oder Ruby Webanwendungen damit testen. Da Canoo Webtest auf dem Build Tool Ant basiert, ist es sehr einfach es in den Build Prozess einzubinden. Die Ergbenisse können dann auch im Continuous Integration Server Hudson angezeigt werden. Dies stellt sicher, dass die Tests dann auch zyklisch ausgeführt werden.
Somit kann eigentlich nichts mehr schief gehen. 🙂
Links:
Canoo Webtest Plugin
Firefox Plugin – Webtest Recorder
Testautomatisierung mit WebTest
Hudson Plugin
Update:
Mit Grails 1.2 wird Webtest nicht mehr im Bundle mit ausgeliefert. Von daher steht erst einmal ein Download des Plugins an, dass dann auch gleich in der Version 2 daherkommt und zahlreiche Änderungen mit sich bringt.
Unter anderem wechselt der Ort für das webtest Verzeichnis. Es liegt jetzt unterhalb des Test Verzeichnisses. Alte Tests bedürfen auch einer Änderung bevor sie wieder laufen. Die Testmethoden müssen jetzt mit void
und nicht mehr mit def
angelegt werden.
Gestartet werden die Tests jetzt mit:
> grails test-app -functional
Weitere Änderungen kann man unter diesem Link oder auf der Seite des Plugins nachlesen.