Groovy kind of Test 
5PSTUFO.BOESZ
© 2014 OPITZ CONSULTING Deutschland GmbH 
 
Motivation 
4QPDL(FCJN3BINFOEFS(SBJMT-FSOHSVQQF(. 
JOGBDIFVOEVTESVDLTTUBSLF5FTUT 
,BOOJDI4QPDL(FCBVDIJOFJOFNLMBTTJTDIFO+BWB1SPKFLUFJOTFU[FO
Was euch erwartet 
8BTJTU(SPPWZ  
8BTJTU4QPDL  
8BTJTU(FC  
8JFLBOOJDI4QPDL(FCJOFJOFNLMBTTJTDIFO+BWB1SPKFLUFJOTFU[FO
Was ihr nicht erwarten dürft 
6NGBOHSFJDIFJOG»ISVOHJO(SPPWZ 
SGBISVOHTCFSJDIUBVTFJOFNFDIUFO1SPKFLU 
BCHFTDIMPTTFOFT'PSTDIVOHTUIFNB
Warnung 
%JFTF1S£TFOUBUJPOLBOOTQVSFOWPO2VFMMDPEFFOUIBMUFO
Groovy
Was ist Groovy? 
+7.1SPHSBNNJFSVOE4LSJQU4QSBDIF 
FOUXJDLFMUJOWPO+BNFT4USBDIBO 
BMT+43JOEFO+BWB$PNNVOJUZ1SPDFTTBVGHFOPNNFO 
	HFMFJUFUWPO(VJMMBVNF-BGPSHF
 
0QFO4PVSDF
QBDIF4PGUXBSF-JDFOTF 
LUVFMMF7FSTJPO 
)PNFQBHFIUUQHSPPWZDPEFIBVTPSH
Groovy Design-Ziel 
%BT%FTJHO;JFMEFTVSTQS»OHMJDIFOOUXJDLMFST+BNFT4USBDIBOCFTUBOEEBSJO
 
FJOFÖHFTDIMJGGFOFÔ'BTTVOHEFS+BWB4ZOUBYNJUEFO,PO[FQUFOWPO3VCZ[V 
WFSCJOEFO 
2VFMMF8JLJQFEJB
Wichtigste Features 
FSXFJUFSU+BWB	EIH»MUJHFS+BWB$PEFJTUH»MUJHFS(SPPWZ$PEF

 
PQUJNJFSU+BWB	SFEV[JFSUVOOµUJHFO$PEF
TJOOWPMMF%FGBVMUT
 
LPNQJMJFSU[V+BWB#ZUF$PEF
M£VGUJOFJOFS+7.
 
JOUFHSJFSUTJDIQSPCMFNMPTNJUBOEFSFO+BWB,PNQPOFOUFO 
PQUJPOBMF5ZQJTJFSVOH 
/BUJWF6OUFSTU»U[VOHWPO$MPTVSFT
.BQT
-JTUFO
SFHVM£SFOVTES»DLFO
 
#JH%FDJNBMT
#JH*OUFHFST
6OJU5FTUJOH
.PDLJOH
 
SXFJUFSUF6OUFSTU»U[VOHWPO%#DDFTTVOE9.-+40/1SPDFTTJOH 
 

HJMUOJDIUHFOFSFMM
BCFSJOEFONFJTUFO'£MMFO
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 }
Beispiel: Test 
class TrivialerTest { 
@Test 
def testet ein paar triviale Dinge() { 
assert 1 + 1 == 2 
assert 2 != 1 
} 
}
Spock
Was ist Spock? 
5FTUJOHVOE4QFDJGJDBUJPO'SBNFXPSLG»S+BWBVOE(SPPWZ 
*OUVJUJWFVOEBVTESVDLTTUBSLF%4- 
*OTQJSJFSUWPOWFSTDIJFEFOFO4QSBDIFOVOE'SBNFXPSLT 
	+6OJU
34QFD
K.PDL
.PDLJUP
(SPPWZ
4DBMB

 
)PNFQBHFIUUQTDPEFHPPHMFDPNQTQPDL
Specification 
5FTU,MBTTF
BCHFMFJUFUWPOspock.lang.Specification 
#FTUFIUBVT 
'JFMET	[#G»SEBT4ZTUFNVOEFS4QFDJGJDBUJPO
 
'JYUVSF.FUIPET	setup
cleanup
setupSpecVOEcleanupSpec
 
'FBUVSF.FUIPET	UFTUFOC[XCFTDISFJCFOEJF'FBUVSFT
 
)FMQFS.FUIPET
Phasen 
4FUVQ'JYUVSF 
4UJNVMVT 
7FSJGZ3FTQPOTF 
$MFBOVQ
Blocks 
%FGJOJFSFOEJF1IBTFO 
7FSXFOEVOHWPO+BWB 
7FSG»HCBSF#MµDLF 
setupPEFSgiven 
whenthenPEFSexpect 
cleanup 
where 
-BCFMFE4UBUFNFOUT
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 
} 
}
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 
} 
}
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 
} 
}
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] 
} 
}
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 
} 
}
Geb
Was ist Geb? 
VUPNBUJTJFSVOHTXFSL[FVHG»S8FC0CFSGM£DIFO 
	7FSZ(SPPWZ#SPXTFSBVUPNBUJPO
 
'PLVTBVGFJOGBDIFJOUVJUJWFOUXJDLMVOH 
)PNFQBHFIUUQXXXHFCJTIPSH
Best of breed 
Geb vereint... 
EJF4U£SLF.£DIUJHLFJUWPO8FC%SJWFS 
EJFMFHBO[JOGBDIIFJUWPO+2VFSZ$POUFOU4FMFDUJPO 
EJF3PCVTUIFJUEFT1BHF0CKFDU.PEFMMJOHT 
EJFVTESVDLTTU£SLFWPO(SPPWZ 
NQGPIMFO7FSXFOEVOHNJU4QPDL
Beispiel: Web 2.0 Taschenrechner 
IUUQXFCSFDIOFSEF
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 
}
Page-Object kapselt Seiten-Details 
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) } 
} 
} 
IUUQXXXHFCJTIPSHNBOVBMDVSSFOUQBHFTIUNMQBHFT
Beispiel - Page-Object Ansatz 
def Addition von zwei Zahlen() { 
given: 
to TaschenrechnerPage 
when: 
btn_1.click() 
btn_add.click() 
btn_2.click() 
btn_equals.click() 
then: 
display.value() == 3 
}
Page-Object kapselt Funktionalität 
class TaschenrechnerPage extends Page { 
... 
static content = { 
btn { char c - $(a# + ids[c.toString()]) } 
result { display.value() } 
} 
def ids = [ 
1 : num_1, 
... 
+ : A42, 
= : btn_equal 
] 
def calculate( String formula ) { 
formula.chars.each { 
type it 
} 
type('=' as char) 
} 
def type( char character ) { 
btn(character).click() 
} 
}
Beispiel - Funktionale Spezifikation 
def Addition von zwei Zahlen() { 
given: 
to TaschenrechnerPage 
when: 
calculate(1+2) 
then: 
result == 3 
}
Beispiel - Spock Data-Table 
@Unroll(#formula ergibt #expectedResult) 
def Addition von zwei Zahlen() { 
given: 
to 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 
}
Verwendung in einem 
Java Projekt
Beispiel Projekt 
*$0OMJOF	1PTUCBOL4ZTUFNT
 
.VMUJ.PEVM.BWFO1SPKFLU 
+BWB
4QSJOH
+1
+4'	3JDIGBDFT
 
TFQBSBUFT.BWFO.PEVMgroovy-functional-tests
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 
} 
}
Groovy  JUnit Dependency 
dependencies 
dependency 
groupidorg.codehaus.groovy/groupid 
artifactidgroovy-all/artifactid 
version2.2.1/version 
/dependency 
dependency 
groupidjunit/groupid 
artifactidjunit/artifactid 
version4.11/version 
/dependency 
/dependencies
Groovy Source Paths 
plugin 
groupidorg.codehaus.mojo/groupid 
artifactidbuild-helper-maven-plugin/artifactid 
version1.8/version 
executions 
execution 
idadd-source/id 
phasegenerate-sources/phase 
goalsgoaladd-source/goal/goals 
configuration 
sourcessourcesrc/main/groovy/sources 
/configuration 
/execution 
execution 
idadd-test-source/id 
phasegenerate-test-sources/phase 
goalsgoaladd-test-source/goal/goals 
configuration 
sourcessourcesrc/test/groovy/sources 
/configuration 
/execution 
/executions 
/plugin
Groovy Eclipse Compiler 
plugin 
artifactidmaven-compiler-plugin/artifactid 
version3.1/version 
configuration 
compileridgroovy-eclipse-compiler/compilerid 
/configuration 
dependencies 
dependency 
groupidorg.codehaus.groovy/groupid 
artifactidgroovy-eclipse-compiler/artifactid 
version2.8.0-01/version 
/dependency 
dependency 
groupidorg.codehaus.groovy/groupid 
artifactidgroovy-eclipse-batch/artifactid 
version2.1.8-01/version 
/dependency 
/dependencies 
/plugin 
IUUQEPDTDPEFIBVTPSHEJTQMBZ(3007:(SPPWZDMJQTF
DPNQJMFS
QMVHJO
GPS
.BWFO
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
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] ------------------------------------------------------------------------
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 
} 
}
LoginPage 
class LoginPage extends Page { 
static url = pages/login.xhtml 
static content = { 
username { $(#j_username) } 
password { $(#j_password) } 
loginButton { $(#loginButton) } 
} 
void loginWith(def credentials) { 
username = credentials.username 
password = credentials.password 
loginButton.click() 
} 
}
GebConfig.groovy 
baseUrl = http://localhost:8888/iconline/ 
reportsDir = target/surefire-reports/geb 
IUUQXXXHFCJTIPSHNBOVBMDVSSFOUDPOGJHVSBUJPOIUNMDPOGJHVSBUJPO
Spock  Geb Dependencies 
dependency 
groupidorg.spockframework/groupid 
artifactidspock-core/artifactid 
version0.7-groovy-2.0/version 
scopetest/scope 
/dependency 
dependency 
groupidorg.gebish/groupid 
artifactidgeb-spock/artifactid 
version0.9.2/version 
scopetest/scope 
/dependency 
dependency 
groupidorg.seleniumhq.selenium/groupid 
artifactidselenium-htmlunit-driver/artifactid 
version2.26.0/version 
scopetest/scope 
/dependency 
IUUQXXXHFCJTIPSHNBOVBMDVSSFOUJOUSPIUNMJOTUBMMBUJPO@@VTBHF
IC-Online Anwendung lokal starten 
*EFF%JFGVOLUJPOBMFO5FTUTUFTUFOEJFOXFOEVOHTP
XJFEFSOXFOEFSTJF 
BVDIWFSXFOEFOX»SEF
EIBVTTDIMJFžMJDI»CFSEJF0CFSGM£DIF 
7FSXFOEVOHEFT.BWFO$BSHP1MVHJOT 
4UBSUFOFJOFTMPLBMFO$POUBJOFST 
%FQMPZFOEFSOXFOEVOH
Ausführen von Specs mit Surefire 
plugin 
groupidorg.apache.maven.plugins/groupid 
artifactidmaven-surefire-plugin/artifactid 
version2.16/version 
executions 
execution 
idfunctional-tests/id 
phaseintegration-test/phase 
goals 
goaltest/goal 
/goals 
configuration 
includes 
include**/*Spec.class/include 
/includes 
/configuration 
/execution 
/executions 
/plugin 
IUUQNBWFOBQBDIFPSHTVSFGJSFNBWFOTVSFGJSFQMVHJOFYBNQMFTJODMVTJPOFYDMVTJPOIUNM

Groovy kind of test

  • 1.
    Groovy kind ofTest 5PSTUFO.BOESZ
  • 2.
    © 2014 OPITZCONSULTING Deutschland GmbH Motivation 4QPDL(FCJN3BINFOEFS(SBJMT-FSOHSVQQF(. JOGBDIFVOEVTESVDLTTUBSLF5FTUT ,BOOJDI4QPDL(FCBVDIJOFJOFNLMBTTJTDIFO+BWB1SPKFLUFJOTFU[FO
  • 3.
    Was euch erwartet 8BTJTU(SPPWZ 8BTJTU4QPDL 8BTJTU(FC 8JFLBOOJDI4QPDL(FCJOFJOFNLMBTTJTDIFO+BWB1SPKFLUFJOTFU[FO
  • 4.
    Was ihr nichterwarten dürft 6NGBOHSFJDIFJOG»ISVOHJO(SPPWZ SGBISVOHTCFSJDIUBVTFJOFNFDIUFO1SPKFLU BCHFTDIMPTTFOFT'PSTDIVOHTUIFNB
  • 5.
  • 6.
  • 7.
    Was ist Groovy? +7.1SPHSBNNJFSVOE4LSJQU4QSBDIF FOUXJDLFMUJOWPO+BNFT4USBDIBO BMT+43JOEFO+BWB$PNNVOJUZ1SPDFTTBVGHFOPNNFO HFMFJUFUWPO(VJMMBVNF-BGPSHF 0QFO4PVSDF QBDIF4PGUXBSF-JDFOTF LUVFMMF7FSTJPO )PNFQBHFIUUQHSPPWZDPEFIBVTPSH
  • 8.
    Groovy Design-Ziel %BT%FTJHO;JFMEFTVSTQS»OHMJDIFOOUXJDLMFST+BNFT4USBDIBOCFTUBOEEBSJO FJOFÖHFTDIMJGGFOFÔ'BTTVOHEFS+BWB4ZOUBYNJUEFO,PO[FQUFOWPO3VCZ[V WFSCJOEFO 2VFMMF8JLJQFEJB
  • 9.
    Wichtigste Features FSXFJUFSU+BWB EIH»MUJHFS+BWB$PEFJTUH»MUJHFS(SPPWZ$PEF PQUJNJFSU+BWB SFEV[JFSUVOOµUJHFO$PEF TJOOWPMMF%FGBVMUT LPNQJMJFSU[V+BWB#ZUF$PEF M£VGUJOFJOFS+7. JOUFHSJFSUTJDIQSPCMFNMPTNJUBOEFSFO+BWB,PNQPOFOUFO PQUJPOBMF5ZQJTJFSVOH /BUJWF6OUFSTU»U[VOHWPO$MPTVSFT .BQT -JTUFO SFHVM£SFOVTES»DLFO #JH%FDJNBMT #JH*OUFHFST 6OJU5FTUJOH .PDLJOH SXFJUFSUF6OUFSTU»U[VOHWPO%#DDFTTVOE9.-+40/1SPDFTTJOH HJMUOJDIUHFOFSFMM BCFSJOEFONFJTUFO'£MMFO
  • 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 classTrivialerTest { @Test def testet ein paar triviale Dinge() { assert 1 + 1 == 2 assert 2 != 1 } }
  • 12.
  • 13.
    Was ist Spock? 5FTUJOHVOE4QFDJGJDBUJPO'SBNFXPSLG»S+BWBVOE(SPPWZ *OUVJUJWFVOEBVTESVDLTTUBSLF%4- *OTQJSJFSUWPOWFSTDIJFEFOFO4QSBDIFOVOE'SBNFXPSLT +6OJU 34QFD K.PDL .PDLJUP (SPPWZ 4DBMB )PNFQBHFIUUQTDPEFHPPHMFDPNQTQPDL
  • 14.
    Specification 5FTU,MBTTF BCHFMFJUFUWPOspock.lang.Specification #FTUFIUBVT 'JFMET [#G»SEBT4ZTUFNVOEFS4QFDJGJDBUJPO 'JYUVSF.FUIPET setup cleanup setupSpecVOEcleanupSpec 'FBUVSF.FUIPET UFTUFOC[XCFTDISFJCFOEJF'FBUVSFT )FMQFS.FUIPET
  • 15.
    Phasen 4FUVQ'JYUVSF 4UJNVMVT 7FSJGZ3FTQPOTF $MFBOVQ
  • 16.
    Blocks %FGJOJFSFOEJF1IBTFO 7FSXFOEVOHWPO+BWB 7FSG»HCBSF#MµDLF setupPEFSgiven whenthenPEFSexpect cleanup where -BCFMFE4UBUFNFOUT
  • 17.
    Beispiel: given whenthen 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 classMathSpec extends spock.lang.Specification { def Maximum von zwei nummerischen Werten() { expect: Math.max(1, 5) == 5 Math.max(2, 3) == 3 } }
  • 19.
    Beispiel: exception classMathSpec 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 classMathSpec 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 classMathSpec 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 } }
  • 22.
  • 23.
    Was ist Geb? VUPNBUJTJFSVOHTXFSL[FVHG»S8FC0CFSGM£DIFO 7FSZ(SPPWZ#SPXTFSBVUPNBUJPO 'PLVTBVGFJOGBDIFJOUVJUJWFOUXJDLMVOH )PNFQBHFIUUQXXXHFCJTIPSH
  • 24.
    Best of breed Geb vereint... EJF4U£SLF.£DIUJHLFJUWPO8FC%SJWFS EJFMFHBO[JOGBDIIFJUWPO+2VFSZ$POUFOU4FMFDUJPO EJF3PCVTUIFJUEFT1BHF0CKFDU.PEFMMJOHT EJFVTESVDLTTU£SLFWPO(SPPWZ NQGPIMFO7FSXFOEVOHNJU4QPDL
  • 25.
    Beispiel: Web 2.0Taschenrechner IUUQXFCSFDIOFSEF
  • 26.
    Beispiel - ScriptingAnsatz 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 }
  • 27.
    Page-Object kapselt Seiten-Details 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) } } } IUUQXXXHFCJTIPSHNBOVBMDVSSFOUQBHFTIUNMQBHFT
  • 28.
    Beispiel - Page-ObjectAnsatz def Addition von zwei Zahlen() { given: to TaschenrechnerPage when: btn_1.click() btn_add.click() btn_2.click() btn_equals.click() then: display.value() == 3 }
  • 29.
    Page-Object kapselt Funktionalität class TaschenrechnerPage extends Page { ... static content = { btn { char c - $(a# + ids[c.toString()]) } result { display.value() } } def ids = [ 1 : num_1, ... + : A42, = : btn_equal ] def calculate( String formula ) { formula.chars.each { type it } type('=' as char) } def type( char character ) { btn(character).click() } }
  • 30.
    Beispiel - FunktionaleSpezifikation def Addition von zwei Zahlen() { given: to TaschenrechnerPage when: calculate(1+2) then: result == 3 }
  • 31.
    Beispiel - SpockData-Table @Unroll(#formula ergibt #expectedResult) def Addition von zwei Zahlen() { given: to 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 }
  • 32.
    Verwendung in einem Java Projekt
  • 33.
    Beispiel Projekt *$0OMJOF 1PTUCBOL4ZTUFNT .VMUJ.PEVM.BWFO1SPKFLU +BWB 4QSJOH +1 +4' 3JDIGBDFT TFQBSBUFT.BWFO.PEVMgroovy-functional-tests
  • 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 } }
  • 35.
    Groovy JUnitDependency dependencies dependency groupidorg.codehaus.groovy/groupid artifactidgroovy-all/artifactid version2.2.1/version /dependency dependency groupidjunit/groupid artifactidjunit/artifactid version4.11/version /dependency /dependencies
  • 36.
    Groovy Source Paths plugin groupidorg.codehaus.mojo/groupid artifactidbuild-helper-maven-plugin/artifactid version1.8/version executions execution idadd-source/id phasegenerate-sources/phase goalsgoaladd-source/goal/goals configuration sourcessourcesrc/main/groovy/sources /configuration /execution execution idadd-test-source/id phasegenerate-test-sources/phase goalsgoaladd-test-source/goal/goals configuration sourcessourcesrc/test/groovy/sources /configuration /execution /executions /plugin
  • 37.
    Groovy Eclipse Compiler plugin artifactidmaven-compiler-plugin/artifactid version3.1/version configuration compileridgroovy-eclipse-compiler/compilerid /configuration dependencies dependency groupidorg.codehaus.groovy/groupid artifactidgroovy-eclipse-compiler/artifactid version2.8.0-01/version /dependency dependency groupidorg.codehaus.groovy/groupid artifactidgroovy-eclipse-batch/artifactid version2.1.8-01/version /dependency /dependencies /plugin IUUQEPDTDPEFIBVTPSHEJTQMBZ(3007:(SPPWZDMJQTF
  • 38.
  • 39.
  • 40.
  • 41.
  • 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 } }
  • 45.
    LoginPage class LoginPageextends Page { static url = pages/login.xhtml static content = { username { $(#j_username) } password { $(#j_password) } loginButton { $(#loginButton) } } void loginWith(def credentials) { username = credentials.username password = credentials.password loginButton.click() } }
  • 46.
    GebConfig.groovy baseUrl =http://localhost:8888/iconline/ reportsDir = target/surefire-reports/geb IUUQXXXHFCJTIPSHNBOVBMDVSSFOUDPOGJHVSBUJPOIUNMDPOGJHVSBUJPO
  • 47.
    Spock GebDependencies dependency groupidorg.spockframework/groupid artifactidspock-core/artifactid version0.7-groovy-2.0/version scopetest/scope /dependency dependency groupidorg.gebish/groupid artifactidgeb-spock/artifactid version0.9.2/version scopetest/scope /dependency dependency groupidorg.seleniumhq.selenium/groupid artifactidselenium-htmlunit-driver/artifactid version2.26.0/version scopetest/scope /dependency IUUQXXXHFCJTIPSHNBOVBMDVSSFOUJOUSPIUNMJOTUBMMBUJPO@@VTBHF
  • 48.
    IC-Online Anwendung lokalstarten *EFF%JFGVOLUJPOBMFO5FTUTUFTUFOEJFOXFOEVOHTP XJFEFSOXFOEFSTJF BVDIWFSXFOEFOX»SEF EIBVTTDIMJFžMJDI»CFSEJF0CFSGM£DIF 7FSXFOEVOHEFT.BWFO$BSHP1MVHJOT 4UBSUFOFJOFTMPLBMFO$POUBJOFST %FQMPZFOEFSOXFOEVOH
  • 49.
    Ausführen von Specsmit Surefire plugin groupidorg.apache.maven.plugins/groupid artifactidmaven-surefire-plugin/artifactid version2.16/version executions execution idfunctional-tests/id phaseintegration-test/phase goals goaltest/goal /goals configuration includes include**/*Spec.class/include /includes /configuration /execution /executions /plugin IUUQNBWFOBQBDIFPSHTVSFGJSFNBWFOTVSFGJSFQMVHJOFYBNQMFTJODMVTJPOFYDMVTJPOIUNM