Groovy erfreut sich immer größerer Beliebtheit. Viele "grüne Wiese Projekte" werden damit und vor allem mit dem darauf aufsetzenden Grails Framework realisiert. Will man Groovy in einem bereits existierenden Java-Projekt verwenden bedeutet das nicht automatisch, dass das Projekt dazu grundlegend umgestellt werden muss. Insbesondere im Bereich der funktionalen Tests kann Groovy relativ problemlos integriert werden. Der Vortrag zeigt am Beispiel einer existierenden JSF-Anwendung wie diese mit Hilfe von Groovy und den Frameworks Spock und Geb automatisiert getestet werden kann.
10. Beispiel: Array- bzw. List-Handling
*O+BWB
for (String it : new String [] { Rod, Carlos, Chris })
System.out.println(it);
*O(SPPWZ
[Rod, Carlos, Chris].each { println it }
11. Beispiel: Test
class TrivialerTest {
@Test
def testet ein paar triviale Dinge() {
assert 1 + 1 == 2
assert 2 != 1
}
}
17. Beispiel: given when then
class MathSpec extends spock.lang.Specification {
def Maximum von zwei nummerischen Werten() {
given:
def a = 1
def b = 5
def c = 5
when:
def r = Math.max(a, b)
then:
r == c
}
}
18. Beispiel: expect
class MathSpec extends spock.lang.Specification {
def Maximum von zwei nummerischen Werten() {
expect:
Math.max(1, 5) == 5
Math.max(2, 3) == 3
}
}
19. Beispiel: exception
class MathSpec extends spock.lang.Specification {
def Division durch 0 löst ArithmeticException aus() {
when:
1.0 / 0
then:
ArithmeticException e = thrown()
e.message =~ Division
}
}
20. Beispiel: data-driven
class MathSpec extends spock.lang.Specification {
def Maximum von zwei nummerischen Werten() {
expect:
Math.max(value1, value2) == result
where:
value1 [1, 2, 3]
value2 [5, 3, 7]
result [5, 3, 7]
}
}
21. Beispiel: data-table
class MathSpec extends spock.lang.Specification {
@Unroll(Maximum von #value1 und #value2 ist #result)
def Maximum von zwei nummerischen Werten() {
expect:
Math.max(value1, value2) == result
where:
value1 | value2 | result
1 | 5 | 5
2 | 3 | 3
7 | 3 | 7
}
}
26. Beispiel - Scripting Ansatz
def Addition von zwei Zahlen() {
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
}
34. Schritt 1 - trivialer Groovy Test
Ziel: Maven Modul erweitern,
so dass der folgende Groovy Test ausgeführt wird
class TrivialerTest {
@Test
void testet ein paar triviale Dinge() {
assert 1 + 1 == 2
assert 2 != 1
}
}
42. Test Classes vs. Test Sources
.BWFOTVDIUTUBOEBSEN£žJHJOEFO5FTU4PVSDFTOBDIKBWB5FTU%BUFJFO
(SPPWZ%BUFJFO NJU%BUFJFOEVOHHSPPWZ
XFSEFOEBIFSOJDIUHFGVOEFO
.BWFOTPMMJOEFODPNQJMJFSUFO,MBTTFOOBDI5FTUTTVDIFO
properties
maven.test.search.classdirtrue/maven.test.search.classdir
/properties
43. mvn verify
...
[INFO] --- maven-surefire-plugin:2.10:test (default-test) @ groovy-functional-tests ---
[INFO] Surefire report directory: D:ProjekteGroovy_kind_of_TestSourcesgroovy-functional-tests
targetsurefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running de.javandry.groovyfunctionaltests.TrivialTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.314 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
44. Schritt 2 - erste einfache Geb Spec
Ziel: Maven Modul erweitern, so dass
die folgende Geb Specification ausgeführt wird
class LoginSpec extends GebReportingSpec {
static final validCredentials = [username: 'pl2', password: '2lp']
def login with valid credentials() {
given:
to LoginPage
when:
loginWith validCredentials
then:
at IcUebersichtPage
}
}