Webtests für Grails Anwendungen

canoo webtest Report

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.

webtest Recorder

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.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

%d Bloggern gefällt das: