jsf anwendungen testen mit acceptit
DESCRIPTION
Das Testen von JSF Anwendungen ist notwendig, aber nicht einfach. In diesem Vortrag motivieren wir zunächst, warum unserer Meinung nach Tests unerlässlich sind. Dann zeigen wir ein einfaches kleines CDI-basiertes Framework, namens AcceptIt, welches uns bei der Erstellung von Integrationstests für JSF-Anwendungen hilft.TRANSCRIPT
JSF-Anwendungen testen mit AcceptITinterner Vortrag in der akquinet tech@spree
Schreibt mehr gute !End-to-End Tests!
Routinearbeit• d.h.:
gutes Verständnis der Anforderung!
• Top Down Entwurf => bessere Architektur!
• End-To-End = Top Down
s. http://www.sigs.de/download/oop_09/Dirbach%20NEU.pdf
Wissensarbeit• d.h.:
Problem und Lösungsind noch unklar!
• ständiger Wechsel zwischen Problem- und Lösungsraum!
• End-To-End =>Konzentration aufWas und Warum
Beispiel: WSDL, SOAP & Exceptions
Erfahrungswerte aus einem Integrationsprojekt• Aufgabe:
Integration eines SOAP-basierten Webdienst!
• Erkenntnisse!
• Standardverhalten war einfach!
• korrektes Verhalten in Randfällen nicht!
• End-To-End als effizientes Entwicklungsinstrument
Weboberflächen und ihre Logikanteile
Testabdeckung eines JSF-Projekts
• größtes Modul hat geringste Testabdeckung mit Unit-Tests!
• Grund: JSF-Integration erschwert Isolation für Unit-Test
15,4%
XHTML: 20k LOC :=
20kLOC GUI-Logik
XHTML: 20k LOCCoverage?
Unit Test
Object Under TestPro:!- schnell!- validiert API-Entwurf
Contra:!- wenig Aussage über Systems!- robuste Testssuite kann schwierig sein
Unit Under Test + 3rd party Code
Integrations Test
Pro:!- validiert Teilsysteme
Contra:!- herausfordernder Schnitt der Teilsysteme
System Under Test
End to End Test
Pro:!- Hohe Aussage über System!- Entkopplung von Test und Systemcode
Contra:!- Aufwand!!=> Notwendigkeit einer guten Testarchitektur
Nutze die Macht der Tests, Luke!
Willkommen in der ersten Klasse!
Tests als1st Class Citizen
• gleiche Anforderungen an Testcode wie an Produktivcode, insb. bzgl.!
• Wartbarkeit!
• Verständlichkeit!
• Tests => Aufwand => Investition!
• Abwesenheit von Tests := Wette, dass Software fehlerfrei ist und nicht weiterentwickelt wird… => mutig
AcceptIt Ein Vorgeschmack
public!class!SampleTest!{!!
!!!!@Rule!!!!!public!final!AcceptItRule!acceptItRule!=!!
!!!new!AcceptItRule();!!
!!!!@Inject!!!!!TestBean!testBean;6!
!!!!@Test!!!!!public!void!canInjectSimpleBean()!{!!!!!!!!!assertThat(testBean).isNotNull();!!!!!}6}
Guiceberry vs. AcceptIt
• Injection mit Guice!
• TestScope
• Injection mit CDI!
• TestScope!
• InjectionPoint
Herausforderungen beim Testen von Webanwendungen
driver.findElement(By.id("q")).sendKeys(text);
driver.findElement(By.id("q")).sendKeys(text);
Finden
Finden
wait.until(ExpectedConditions.titleIs("Google"));
driver.findElement(By.id("q")).sendKeys(text);
Finden
wait.until(ExpectedConditions.titleIs("Google"));
driver.findElement(By.id("q")).sendKeys(text);
Wartenund
Das war …. Spagetthi-Code
Anwendung
Page Object
Test
WebDriver
Browser
Anwendung
Page Object
Test
WebDriver
Browser
Anwendung
Page Object
Test
WebDriver
Browser
Fernsteuern des Browser
Anwendung
Page Object
Test
WebDriver
Browser
alle fachlichen Operationen einer Seite
@PageObject!public!class!GooglePage!{!!!!!!@Inject!!!!!private!WebDriver!driver;!!!!!!@FindBy(name!=!"q")!!!!!private!WebElement!searchField;6!
public6void6search(String6in)6{}6}
Anwendung
Page Object
Test
WebDriver
Browser
fachliche Tests.
!!!!@Inject!!!!!GooglePage!googlePage;!!!!!!!!@Test!!!!!public!void!canSearchForAkquinet()!{!!!!!!!!!googlePage.get();!!!!!!!!!googlePage.search("akquinet.de");!!!!!!!!!!assertThat(googlePage.getSearchResults())6
66.contains("akquinet!AG");!!!!!}
=> Fokus auf Fachlichkeit, keine direkte Interaktion mit WebDriver
Ein Beispielprojekt
Chuck
Nor
ris
Appro
ved
90%
Try!
Als Dessert: Der Mehrwert zu Guiceberry
Anwendung
Page Object
Test
WebDriver
BrowserWiederverwendung!
Page Atom
@PageObjectAtom!public!class!SearchFieldUsingWebElement!{!!!!!!@Inject!!!!!WebElement!searchField;!!!!!!public!void!search(String!query)!{!!!!!!!!!searchField.sendKeys(query);!!!!!!!!!searchField.submit();!!!!!}!}
@PageObjectAtom!public!class!SearchFieldUsingWebElement!{!!!!!!@Inject!!!!!WebElement!searchField;!!!!!!public!void!search(String!query)!{!!!!!!!!!searchField.sendKeys(query);!!!!!!!!!searchField.submit();!!!!!}!}
!@Inject!!@FindBy(name!=!"q")!!private!SearchFieldUsingWebElement!search;!
@PageObjectAtom!public!class!SearchFieldUsingWebElement!{!!!!!!@Inject!!!!!WebElement!searchField;!!!!!!public!void!search(String!query)!{!!!!!!!!!searchField.sendKeys(query);!!!!!!!!!searchField.submit();!!!!!}!}
!@Inject!!@FindBy(name!=!"q")!!private!SearchFieldUsingWebElement!search;!
Conversion!
Aus der Praxis
Die Situation
Das Ziel
Wie verspeist man einen Elefanten?
Stück für Stück
Die Charakeristik der Pferde
@Test6public6void6navigiereZurNiederlassung()6{6666homePage.get();6!666ClientAgenciesListPage6ger6=66666666homePage.niederlassung("Deutschland");666666assertThat(ger.getNiederlassungen())666666666.hasSize(22)666666666.haveExactly(1,6sc("KUNDE!GmbH!Sylt"))666666666.haveExactly(1,6sc("KUNDE!xyz"))666666666;6}6
http://www.sigs.de/download/oop_09/Dirbach%20NEU.pdf