Geb

Was ist Geb?

Geb ist ein Automatisierungswerkzeug für Web-Oberflächen (Very Groovy Browser automation) mit einem Fokus auf einfache/intuitive Entwicklung.

Es vereinigt:

Geb ist nicht ausschließlich ausgelegt auf Oberflächen-Tests, wird jedoch überwiegend dafür eingesetzt. Es lässt sich mit unterschiedlichen Test-Frameworks integrieren (z.B. JUnit, TestNG), die Autoren empfehlen jedoch Geb zusammen mit Spock zu verwenden.

Ressourcen

Code Beispiele

Alle Beispiele testen den Web 2.0 Taschenrechner

Der vollständige Source-Code liegt auf github.

Einfacher Test ohne Verwendung eines Page-Objects

def "Addition von 1 und 2 ergibt 3 - ohne Page Object"() {
    given:
    go "http://web2.0rechner.de/"
 
    expect:
    title == "Web 2.0 Taschenrechner"
 
    when:
    $("a#num_1").click()
    $("a#A42").click()
    $("a#num_2").click()
    $("a#btn_equal").click()
 
    then:
    $("input#input").value() == "3"
}

Ablauf:

Der Test liest sich wie ein typisches Automatisierungsskript. Sehr viele Details (URL, Seitentitel, CSS-IDs von Seitenelementen) stehen im Test.

Der selbe Test mit Verwendung eines Page-Objects

def "Addition von 1 und 2 ergibt 3 - mit Page Object"() {
    given:
    to TaschenrechnerPage
 
    expect:
    at TaschenrechnerPage
 
    when:
    btn_1.click()
    btn_add.click()
    btn_2.click()
    btn_equals.click()
 
    then:
    display.value() == "3"
}

class TaschenrechnerPage extends Page {
 
    static url = "http://web2.0rechner.de/"
 
    static at = { title == "Web 2.0 Taschenrechner" }
 
    static content = {
        btn_1 { $("a#num_1") }
        btn_2 { $("a#num_2") }
        btn_add { $("a#A42") }
        btn_equals { $("a#btn_equal") }
        display { $("input#input") }
    }
}

Das Page-Object kapselt die Details (URL, Seitentitel, Lookup von Seitenelementen). Der Test beschreibt Ablauf und erwartetes Ergebnis.

Weitere Verfeinerung hin zur funktionalen Spezifikation

def "Addition von 1 und 2 ergibt 3 - funktional"() {
    given:
    to TaschenrechnerPage
 
    expect:
    at TaschenrechnerPage
 
    when:
    calculate("1+2")
 
    then:
    result == "3"
}

class TaschenrechnerPage extends Page {
 
    static url = "http://web2.0rechner.de/"
 
    static at = { title == "Web 2.0 Taschenrechner" }
 
    static content = {
        btn { char c -> $("a#" + ids[c.toString()]) }
        result { display.value() }
    }
 
    def ids = [
            "1" : "num_1",
            "2" : "num_2",
            "3" : "num_3",
            "4" : "num_4",
            "5" : "num_5",
            "6" : "num_6",
            "7" : "num_7",
            "8" : "num_8",
            "9" : "num_9",
            "+" : "A42",
            "=" : "btn_equal"
    ]
 
    def calculate( String formula ) {
        formula.chars.each {
            type it
        }
        type('=' as char)
    }
     
    def type( char character ) {
        btn(character).click()
    }
}

Auch Details zur Verwendung der Seite (wie wird eine Addition ausgeführt) werden im Page-Object gekapselt. Der Test wird zur ausführbaren Spezifikation.

Verallgemeinerung mit Hilfe von Spock Data Tables

@Unroll("#formula ergibt #expectedResult")
def "Addition von zwei Zahlen"() {
    given:
    to TaschenrechnerPage
 
    expect:
    at TaschenrechnerPage
 
    when:
    calculate(formula)
 
    then:
    result == expectedResult
 
    where:
    formula | expectedResult
    "1+2"   | "3"
    "2+3"   | "6"
    "3+4"   | "7"
    "4+5"   | "9"
    "5+6"   | "11"
}
Torsten Mandry

Torsten Mandry

Software Craftsman, Architekt, Clean Coder, API-Fetischist, Politik-Allergiker

rss facebook twitter github youtube mail spotify instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora