jsf anwendungen testen mit acceptit

54
JSF-Anwendungen testen mit AcceptIT interner Vortrag in der akquinet tech@spree

Upload: torsten-fink

Post on 26-Jun-2015

183 views

Category:

Software


2 download

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

Page 1: JSF Anwendungen testen mit AcceptIt

JSF-Anwendungen testen mit AcceptITinterner Vortrag in der akquinet tech@spree

Page 2: JSF Anwendungen testen mit AcceptIt

Schreibt mehr gute !End-to-End Tests!

Page 3: JSF Anwendungen testen mit AcceptIt

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

Page 4: JSF Anwendungen testen mit AcceptIt

Wissensarbeit• d.h.:

Problem und Lösungsind noch unklar!

• ständiger Wechsel zwischen Problem- und Lösungsraum!

• End-To-End =>Konzentration aufWas und Warum

Page 5: JSF Anwendungen testen mit AcceptIt

Beispiel: WSDL, SOAP & Exceptions

Page 6: JSF Anwendungen testen mit AcceptIt

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

Page 7: JSF Anwendungen testen mit AcceptIt

Weboberflächen und ihre Logikanteile

Page 8: JSF Anwendungen testen mit AcceptIt

Testabdeckung eines JSF-Projekts

• größtes Modul hat geringste Testabdeckung mit Unit-Tests!

• Grund: JSF-Integration erschwert Isolation für Unit-Test

15,4%

Page 9: JSF Anwendungen testen mit AcceptIt

XHTML: 20k LOC :=

20kLOC GUI-Logik

Page 10: JSF Anwendungen testen mit AcceptIt

XHTML: 20k LOCCoverage?

Page 11: JSF Anwendungen testen mit AcceptIt

Unit Test

Object Under TestPro:!- schnell!- validiert API-Entwurf

Contra:!- wenig Aussage über Systems!- robuste Testssuite kann schwierig sein

Page 12: JSF Anwendungen testen mit AcceptIt

Unit Under Test + 3rd party Code

Integrations Test

Pro:!- validiert Teilsysteme

Contra:!- herausfordernder Schnitt der Teilsysteme

Page 13: JSF Anwendungen testen mit AcceptIt

System Under Test

End to End Test

Pro:!- Hohe Aussage über System!- Entkopplung von Test und Systemcode

Contra:!- Aufwand!!=> Notwendigkeit einer guten Testarchitektur

Page 14: JSF Anwendungen testen mit AcceptIt

Nutze die Macht der Tests, Luke!

Page 15: JSF Anwendungen testen mit AcceptIt

Willkommen in der ersten Klasse!

Page 16: JSF Anwendungen testen mit AcceptIt

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

Page 17: JSF Anwendungen testen mit AcceptIt

AcceptIt Ein Vorgeschmack

Page 18: JSF Anwendungen testen mit AcceptIt

public!class!SampleTest!{!!

!!!!@Rule!!!!!public!final!AcceptItRule!acceptItRule!=!!

!!!new!AcceptItRule();!!

!!!!@Inject!!!!!TestBean!testBean;6!

!!!!@Test!!!!!public!void!canInjectSimpleBean()!{!!!!!!!!!assertThat(testBean).isNotNull();!!!!!}6}

Page 19: JSF Anwendungen testen mit AcceptIt

Guiceberry vs. AcceptIt

• Injection mit Guice!

• TestScope

• Injection mit CDI!

• TestScope!

• InjectionPoint

Page 20: JSF Anwendungen testen mit AcceptIt

Herausforderungen beim Testen von Webanwendungen

Page 21: JSF Anwendungen testen mit AcceptIt

    driver.findElement(By.id("q")).sendKeys(text);

Page 22: JSF Anwendungen testen mit AcceptIt

    driver.findElement(By.id("q")).sendKeys(text);

Finden

Page 23: JSF Anwendungen testen mit AcceptIt

Finden

wait.until(ExpectedConditions.titleIs("Google"));

    driver.findElement(By.id("q")).sendKeys(text);

Page 24: JSF Anwendungen testen mit AcceptIt

Finden

wait.until(ExpectedConditions.titleIs("Google"));

    driver.findElement(By.id("q")).sendKeys(text);

Wartenund

Page 25: JSF Anwendungen testen mit AcceptIt

Das war …. Spagetthi-Code

Page 26: JSF Anwendungen testen mit AcceptIt

Anwendung

Page Object

Test

WebDriver

Browser

Page 27: JSF Anwendungen testen mit AcceptIt

Anwendung

Page Object

Test

WebDriver

Browser

Page 28: JSF Anwendungen testen mit AcceptIt

Anwendung

Page Object

Test

WebDriver

Browser

Fernsteuern des Browser

Page 29: JSF Anwendungen testen mit AcceptIt

Anwendung

Page Object

Test

WebDriver

Browser

alle fachlichen Operationen einer Seite

Page 30: JSF Anwendungen testen mit AcceptIt

@PageObject!public!class!GooglePage!{!!!!!!@Inject!!!!!private!WebDriver!driver;!!!!!!@FindBy(name!=!"q")!!!!!private!WebElement!searchField;6!

public6void6search(String6in)6{}6}

Page 31: JSF Anwendungen testen mit AcceptIt

Anwendung

Page Object

Test

WebDriver

Browser

fachliche Tests.

Page 32: JSF Anwendungen testen mit AcceptIt

!!!!@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

Page 33: JSF Anwendungen testen mit AcceptIt

Ein Beispielprojekt

Chuck

Nor

ris

Appro

ved

90%

Page 34: JSF Anwendungen testen mit AcceptIt

Try!

Page 35: JSF Anwendungen testen mit AcceptIt

Als Dessert: Der Mehrwert zu Guiceberry

Page 36: JSF Anwendungen testen mit AcceptIt

Anwendung

Page Object

Test

WebDriver

BrowserWiederverwendung!

Page Atom

Page 37: JSF Anwendungen testen mit AcceptIt

@PageObjectAtom!public!class!SearchFieldUsingWebElement!{!!!!!!@Inject!!!!!WebElement!searchField;!!!!!!public!void!search(String!query)!{!!!!!!!!!searchField.sendKeys(query);!!!!!!!!!searchField.submit();!!!!!}!}

Page 38: JSF Anwendungen testen mit AcceptIt

@PageObjectAtom!public!class!SearchFieldUsingWebElement!{!!!!!!@Inject!!!!!WebElement!searchField;!!!!!!public!void!search(String!query)!{!!!!!!!!!searchField.sendKeys(query);!!!!!!!!!searchField.submit();!!!!!}!}

!@Inject!!@FindBy(name!=!"q")!!private!SearchFieldUsingWebElement!search;!

Page 39: JSF Anwendungen testen mit AcceptIt

@PageObjectAtom!public!class!SearchFieldUsingWebElement!{!!!!!!@Inject!!!!!WebElement!searchField;!!!!!!public!void!search(String!query)!{!!!!!!!!!searchField.sendKeys(query);!!!!!!!!!searchField.submit();!!!!!}!}

!@Inject!!@FindBy(name!=!"q")!!private!SearchFieldUsingWebElement!search;!

Page 40: JSF Anwendungen testen mit AcceptIt

Conversion!

Page 41: JSF Anwendungen testen mit AcceptIt

Aus der Praxis

Page 42: JSF Anwendungen testen mit AcceptIt

Die Situation

Page 43: JSF Anwendungen testen mit AcceptIt

Das Ziel

Page 44: JSF Anwendungen testen mit AcceptIt

Wie verspeist man einen Elefanten?

Page 45: JSF Anwendungen testen mit AcceptIt

Stück für Stück

Page 46: JSF Anwendungen testen mit AcceptIt

Die Charakeristik der Pferde

Page 47: JSF Anwendungen testen mit AcceptIt

@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

Page 48: JSF Anwendungen testen mit AcceptIt
Page 49: JSF Anwendungen testen mit AcceptIt
Page 50: JSF Anwendungen testen mit AcceptIt
Page 51: JSF Anwendungen testen mit AcceptIt
Page 52: JSF Anwendungen testen mit AcceptIt

http://www.sigs.de/download/oop_09/Dirbach%20NEU.pdf

Page 53: JSF Anwendungen testen mit AcceptIt
Page 54: JSF Anwendungen testen mit AcceptIt