SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
Dirk Weil | GEDOPLAN GmbH

Feige sein!
Testen im EE-Umfeld
Dirk Weil
• GEDOPLAN GmbH, Bielefeld
• Java EE seit 1998
• Konzeption und
Realisierung
• Vorträge
• Seminare
• Veröffentlichungen
Testen
Bei mir läuft's!

EE-Tests sind
zu aufwändig.

Gestern ging‘s
noch (und ich
hab‘ nix
gemacht).
Wir haben
keinen
Testserver

Dafür haben
wir kein
Budget.
Testen
Testen ist
feige!

… dann lassen Sie uns feige sein!
EE-Tests
• Komplexe Komponenten-Landschaft
• CDI / EJB
– @Inject, @Produces, @Alternative …

• Plattform
– @PersistenceContext, @Transactional, …

• Web
– @Named, @XyzScoped, @Path
Ausführungszeit

Was und wie schnell?
SE-Test

In-Container-Test
embedded
real
Integration
Test

Unit
Test

Multi Unit
Test

Testtiefe
Einzelklasse

Service
(inkl. Umgebung)

Komponente
Subsystem
Anwendung
Beispielprojekt
ShopModel
+ Views

Bestellung
BestellPosition

BestellungRepository
Artikel

ArtikelRepository
WaehrungModel
+ Views
WaehrungRestService

Waehrung

WaehrungService
WaehrungRepository

EntityManager / PU

TX Manager
Unit Test
• Test: Umrechnung in WaehrungService
• Mock für WaehrungRepository
• Toolset: JUnit, Mockito
WaehrungService
WaehrungRepository

Waehrung
Multi Unit Test
• Test: Umrechnung in WaehrungService
• Test-DB statt Prod-DB
• Toolset: JUnit, CDI-Container
– alternativer Producer für EntityManager
– TX-Interceptor
Waehrung

WaehrungService
WaehrungRepository
EntityManager / PU

TX Manager
Multi Unit Test
• Ausgenutzte Goodies
– Apache Deltaspike
• Container-Start
• Context Start
• Injection

– CDI 1.1 / Java EE 7
• @Priority aktiviert Alternative / Interceptor
• Interceptor Binding @Transactional
Testdaten-Bereitstellung
• Bulk Load
– Skript, DBUnit, …

<waehrung
id="USD">
…

• Manuell
– Prod Extract, …

>import 2013-11-07.dump

• Anwendungs-API
– EntityManager, XyzRepository
Testdaten-Bereitstellung
• Daten vor dem Test löschen …
– höhere Komponenten zuerst

• … und neu laden
– niedere Komponenten zuerst

• Daten nach Test stehen lassen!

• Lässt sich gut mit CDI implementieren
Integration Tests
• Test in Java EE Server
• Test von Komponenten
inkl. der davon genutzten Schichten
• Zugriff auf alle Java-EE-Ressourcen
– „echte“ Persistence Unit (mit Test-DB)
– „echter“ Transaction Manager

• Toolset: JUnit, Arquillian, EE Server
Arquillian
•
•
•
•
•

Server Lifecycle (Start/Stop)
Erstellung von Deployment Archives
Deployment (+Undeployment)
Integration mit JUnit und TestNG
Testausführung
– Server: White Box Test
– Client: Black Box Test

• Diverse Erweiterungen
Arquillian
Managed Mode
Server starten

Remote Mode
Archiv erstellen und deployen

Tests durchführen

Archiv undeployen

Server stoppen

weitere
Testklasse?
Arquillian
• Container-Wahl durch Classpath
– verfügbare Container:
https://docs.jboss.org/author/display/ARQ/Container+adapters
<dependency>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
<scope>test</scope>
</dependency>
<profiles>
<profile>
<id>astest_wildfly-8.0-managed</id>
<dependencies>
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-arquillian-container-managed</artifactId>
<scope>test</scope>
</dependency>
Arquillian
• JUnit Testrunner
• Deployment mit ShrinkWrap erstellen
– neuen Archivnamen nutzen (z. B. UUID)
– richtige Endung!
@RunWith(Arquillian.class)
public class WaehrungServiceIntegrationTest
{
@Deployment
public static WebArchive createDeployment()
{
WebArchive archive = ShrinkWrap.create(WebArchive.class, deploymentUnitName + ".war");
archive.addClasses(…);
archive.addAsWebInfResource(…);
archive.addAsResource(…);
archive.addAsLibraries(…);
Arquillian
• White Box Test
– @Deployment(testable=true) (Default)
– Testklasse wird mit deployt
– @Inject etc. nutzbar
@RunWith(Arquillian.class)
public class WaehrungServiceIntegrationTest
{
…
@Inject WaehrungService waehrungService;
@Test
public void testUmrechnenUSD()
{
…
BigDecimal actual = this.waehrungService.umrechnen(fremdBetrag, fremdWaehrungId);
Assert.assertEquals("Euro-Betrag", expected, actual);
Arquillian
• White Box Test
Waehrung

WaehrungService
WaehrungRepository

EntityManager / PU

TX Manager

• Ausgenutzte Goodies
– Passend erstelltes Deployment
– angepasste PU-Definition
Arquillian
• Black Box Test
– @Deployment(testable=false)
– Test läuft im Client (IDE, Maven, etc.)
– Zugriff nur Remote
@RunWith(Arquillian.class)
public class WaehrungServiceRemoteIntegrationTest
{
@Deployment(testable = false)
public static WebArchive createDeployment()
{
@RunWith(Arquillian.class)
public class WaehrungRestServiceIntegrationTest
{
@Deployment(testable = false)
public static WebArchive createDeployment()
{
Arquillian
• Black Box Test
– Remote EJB
• Benötigt Client Lib des Servers
• Service Locator
@RunWith(Arquillian.class)
public class WaehrungServiceRemoteIntegrationTest
{
…
@Test
public void testUmrechnenUSD()
{
…
WaehrungServiceRemote waehrungService ‚
= ServiceLocator.getEjb(WaehrungServiceRemote.class, …);
BigDecimal actual = waehrungService.umrechnen(fremdBetrag, fremdWaehrungId);
Assert.assertEquals("Euro-Betrag", expected, actual);
Arquillian
• Black Box Test
– REST Service
• JAX-RS 2.0 / Java EE 7: Client API
@RunWith(Arquillian.class)
public class WaehrungServiceRemoteIntegrationTest
{
…
@Test
public void testUmrechnenUSD()
{
…
Client client = ClientBuilder.newClient();
WebTarget target = client.target(serverUrlWebContext + …);
BigDecimal actual = target.request(MediaType.TEXT_PLAIN).get(BigDecimal.class);
Assert.assertEquals("Euro-Betrag", expected, actual);
Drone
• Arquillian-Erweiterung für Selenium
• Browser-Fernsteuerung
– Drone übernimmt Lifecycle-Steuerung des
dazu nötigen Selenium-Servers
– @Drone injiziert WebDriver
(=Fernsteuerung)
– Browser wählbar via arquillian.xml
• Firefox, Crome, IE, HtmlUnit, PhantomJS, …
• häufig per Maven-Profil
Drone
WaehrungModel
+ Views

WaehrungService

Waehrung

WaehrungRepository
EntityManager / PU

TX Manager
Drone
@RunWith(Arquillian.class)
public class WaehrungGuiIntegrationTest
{
…
@Drone WebDriver webDriver;
@Test
public void testUmrechnenUSD()
{
…
this.webDriver.get(serverUrlWebContext + "/demo/waehrungsrechner.xhtml");
WebElement fremdBetragField = this.webDriver.findElement(By.id("form:fremdBetrag"));
fremdBetragField.clear();
fremdBetragField.sendKeys(fremdBetrag.toString());
…
WebElement umrechnenButton = this.webDriver.findElement(By.id("form:umrechnen"));
umrechnenButton.click();
WebElement euroBetragField = this.webDriver.findElement(By.id("form:euroBetrag"));
String actual = euroBetragField.getText();
Assert.assertEquals("Eurowert", expected, actual);
Drone
• Grey Box Test
– Web GUI Fernbedienung wie zuvor
– Abfrage des serverseitigen Zustands
• z. B. mittels Remote EJB
@RunWith(Arquillian.class)
public class ShopGuiIntegrationTest
{
@Test
public void testCreateBestellung()
{
…
this.webDriver.get(serverUrlWebContext + "/demo/waehrungsrechner.xhtml");
…
ShopGuiIntegrationTestInspectorRemote inspector
= ServiceLocator.getEjb(ShopGuiIntegrationTestInspectorRemote.class, …);
Assert.assertTrue("Bestellung nicht gespeichert",
inspector.checkBestellungExists(expected));
Arquillian Extensions
Persistence

Initialisierung, Validierung und
Cleanup der Datenbank
JaCoCo
Code Coverage Monitoring
Performance Prüfung der Ausführungszeit
Warp
Grey Box Testing mit Drone
Graphene
…

Selenium-Erweiterung u. a. mit AJAXUnterstützung und JQuery-Selektion
Arquillian Experience
• Mächtiges Werkzeug
• Dokumentation je nach Extension sehr
gut bis nicht vorhanden
• Aufwändige Konfiguration
– JAR-Hölle

• Ausführungsgeschwindigkeit
Links
• Beispielprojekt
https://github.com/dirkweil/feige-sein

• Arquillian
http://arquillian.org/

• Arquillian Testing Guide
http://www.packtpub.com/arquillian-testing-guide/book
Mehr Infos
• Java-EE-Blog
http://javaeeblog.wordpress.com/

• Expertenkreis Java
http://expertenkreisjava.blogspot.de

• Schulung, Projektunterstützung etc.
dirk.weil@gedoplan.de
Hrglymph
Schön, dass Sie da waren!

dirk.weil@gedoplan.de

Weitere ähnliche Inhalte

Ähnlich wie Feige sein

Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Joachim Baumann
 
Mögen die Tests mit dir sein
Mögen die Tests mit dir seinMögen die Tests mit dir sein
Mögen die Tests mit dir seincodepitbull
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardOPEN KNOWLEDGE GmbH
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
Metadatenbasierte Validierung
Metadatenbasierte ValidierungMetadatenbasierte Validierung
Metadatenbasierte Validierungos890
 
2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit Arquillian2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit ArquillianMatthias Reining
 
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...Marc Müller
 
Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungChristian Baranowski
 
Test-driven Development mit TYPO3
Test-driven Development mit TYPO3Test-driven Development mit TYPO3
Test-driven Development mit TYPO3Oliver Klee
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
iOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deiOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deHolger Hammel
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
JSF Testing - Tools und Technics
JSF Testing - Tools und TechnicsJSF Testing - Tools und Technics
JSF Testing - Tools und Technicsadesso AG
 
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“hpaustria
 
Integration von Security-Checks in die CI-Pipeline
Integration von Security-Checks in die CI-PipelineIntegration von Security-Checks in die CI-Pipeline
Integration von Security-Checks in die CI-PipelineOPEN KNOWLEDGE GmbH
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...GFU Cyrus AG
 
Drohnen und WARP-Antriebe
Drohnen und WARP-AntriebeDrohnen und WARP-Antriebe
Drohnen und WARP-Antriebeberndmueller
 
Automatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumAutomatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumBenjamin Schmid
 
Bi testing media_factory_0.10
Bi testing media_factory_0.10Bi testing media_factory_0.10
Bi testing media_factory_0.10inovex GmbH
 

Ähnlich wie Feige sein (20)

Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)
 
Mögen die Tests mit dir sein
Mögen die Tests mit dir seinMögen die Tests mit dir sein
Mögen die Tests mit dir sein
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative Standard
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Metadatenbasierte Validierung
Metadatenbasierte ValidierungMetadatenbasierte Validierung
Metadatenbasierte Validierung
 
2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit Arquillian2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit Arquillian
 
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
 
Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software Entwicklung
 
Test-driven Development mit TYPO3
Test-driven Development mit TYPO3Test-driven Development mit TYPO3
Test-driven Development mit TYPO3
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
iOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deiOS Testautomation bei mobile.de
iOS Testautomation bei mobile.de
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
JSF Testing - Tools und Technics
JSF Testing - Tools und TechnicsJSF Testing - Tools und Technics
JSF Testing - Tools und Technics
 
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
 
TDD für Testmuffel
TDD für TestmuffelTDD für Testmuffel
TDD für Testmuffel
 
Integration von Security-Checks in die CI-Pipeline
Integration von Security-Checks in die CI-PipelineIntegration von Security-Checks in die CI-Pipeline
Integration von Security-Checks in die CI-Pipeline
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
 
Drohnen und WARP-Antriebe
Drohnen und WARP-AntriebeDrohnen und WARP-Antriebe
Drohnen und WARP-Antriebe
 
Automatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumAutomatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit Selenium
 
Bi testing media_factory_0.10
Bi testing media_factory_0.10Bi testing media_factory_0.10
Bi testing media_factory_0.10
 

Feige sein

  • 1. Dirk Weil | GEDOPLAN GmbH Feige sein! Testen im EE-Umfeld
  • 2. Dirk Weil • GEDOPLAN GmbH, Bielefeld • Java EE seit 1998 • Konzeption und Realisierung • Vorträge • Seminare • Veröffentlichungen
  • 3. Testen Bei mir läuft's! EE-Tests sind zu aufwändig. Gestern ging‘s noch (und ich hab‘ nix gemacht). Wir haben keinen Testserver Dafür haben wir kein Budget.
  • 4. Testen Testen ist feige! … dann lassen Sie uns feige sein!
  • 5. EE-Tests • Komplexe Komponenten-Landschaft • CDI / EJB – @Inject, @Produces, @Alternative … • Plattform – @PersistenceContext, @Transactional, … • Web – @Named, @XyzScoped, @Path
  • 6. Ausführungszeit Was und wie schnell? SE-Test In-Container-Test embedded real Integration Test Unit Test Multi Unit Test Testtiefe Einzelklasse Service (inkl. Umgebung) Komponente Subsystem Anwendung
  • 8. Unit Test • Test: Umrechnung in WaehrungService • Mock für WaehrungRepository • Toolset: JUnit, Mockito WaehrungService WaehrungRepository Waehrung
  • 9. Multi Unit Test • Test: Umrechnung in WaehrungService • Test-DB statt Prod-DB • Toolset: JUnit, CDI-Container – alternativer Producer für EntityManager – TX-Interceptor Waehrung WaehrungService WaehrungRepository EntityManager / PU TX Manager
  • 10. Multi Unit Test • Ausgenutzte Goodies – Apache Deltaspike • Container-Start • Context Start • Injection – CDI 1.1 / Java EE 7 • @Priority aktiviert Alternative / Interceptor • Interceptor Binding @Transactional
  • 11. Testdaten-Bereitstellung • Bulk Load – Skript, DBUnit, … <waehrung id="USD"> … • Manuell – Prod Extract, … >import 2013-11-07.dump • Anwendungs-API – EntityManager, XyzRepository
  • 12. Testdaten-Bereitstellung • Daten vor dem Test löschen … – höhere Komponenten zuerst • … und neu laden – niedere Komponenten zuerst • Daten nach Test stehen lassen! • Lässt sich gut mit CDI implementieren
  • 13. Integration Tests • Test in Java EE Server • Test von Komponenten inkl. der davon genutzten Schichten • Zugriff auf alle Java-EE-Ressourcen – „echte“ Persistence Unit (mit Test-DB) – „echter“ Transaction Manager • Toolset: JUnit, Arquillian, EE Server
  • 14. Arquillian • • • • • Server Lifecycle (Start/Stop) Erstellung von Deployment Archives Deployment (+Undeployment) Integration mit JUnit und TestNG Testausführung – Server: White Box Test – Client: Black Box Test • Diverse Erweiterungen
  • 15. Arquillian Managed Mode Server starten Remote Mode Archiv erstellen und deployen Tests durchführen Archiv undeployen Server stoppen weitere Testklasse?
  • 16. Arquillian • Container-Wahl durch Classpath – verfügbare Container: https://docs.jboss.org/author/display/ARQ/Container+adapters <dependency> <groupId>org.jboss.arquillian.junit</groupId> <artifactId>arquillian-junit-container</artifactId> <scope>test</scope> </dependency> <profiles> <profile> <id>astest_wildfly-8.0-managed</id> <dependencies> <dependency> <groupId>org.wildfly</groupId> <artifactId>wildfly-arquillian-container-managed</artifactId> <scope>test</scope> </dependency>
  • 17. Arquillian • JUnit Testrunner • Deployment mit ShrinkWrap erstellen – neuen Archivnamen nutzen (z. B. UUID) – richtige Endung! @RunWith(Arquillian.class) public class WaehrungServiceIntegrationTest { @Deployment public static WebArchive createDeployment() { WebArchive archive = ShrinkWrap.create(WebArchive.class, deploymentUnitName + ".war"); archive.addClasses(…); archive.addAsWebInfResource(…); archive.addAsResource(…); archive.addAsLibraries(…);
  • 18. Arquillian • White Box Test – @Deployment(testable=true) (Default) – Testklasse wird mit deployt – @Inject etc. nutzbar @RunWith(Arquillian.class) public class WaehrungServiceIntegrationTest { … @Inject WaehrungService waehrungService; @Test public void testUmrechnenUSD() { … BigDecimal actual = this.waehrungService.umrechnen(fremdBetrag, fremdWaehrungId); Assert.assertEquals("Euro-Betrag", expected, actual);
  • 19. Arquillian • White Box Test Waehrung WaehrungService WaehrungRepository EntityManager / PU TX Manager • Ausgenutzte Goodies – Passend erstelltes Deployment – angepasste PU-Definition
  • 20. Arquillian • Black Box Test – @Deployment(testable=false) – Test läuft im Client (IDE, Maven, etc.) – Zugriff nur Remote @RunWith(Arquillian.class) public class WaehrungServiceRemoteIntegrationTest { @Deployment(testable = false) public static WebArchive createDeployment() { @RunWith(Arquillian.class) public class WaehrungRestServiceIntegrationTest { @Deployment(testable = false) public static WebArchive createDeployment() {
  • 21. Arquillian • Black Box Test – Remote EJB • Benötigt Client Lib des Servers • Service Locator @RunWith(Arquillian.class) public class WaehrungServiceRemoteIntegrationTest { … @Test public void testUmrechnenUSD() { … WaehrungServiceRemote waehrungService ‚ = ServiceLocator.getEjb(WaehrungServiceRemote.class, …); BigDecimal actual = waehrungService.umrechnen(fremdBetrag, fremdWaehrungId); Assert.assertEquals("Euro-Betrag", expected, actual);
  • 22. Arquillian • Black Box Test – REST Service • JAX-RS 2.0 / Java EE 7: Client API @RunWith(Arquillian.class) public class WaehrungServiceRemoteIntegrationTest { … @Test public void testUmrechnenUSD() { … Client client = ClientBuilder.newClient(); WebTarget target = client.target(serverUrlWebContext + …); BigDecimal actual = target.request(MediaType.TEXT_PLAIN).get(BigDecimal.class); Assert.assertEquals("Euro-Betrag", expected, actual);
  • 23. Drone • Arquillian-Erweiterung für Selenium • Browser-Fernsteuerung – Drone übernimmt Lifecycle-Steuerung des dazu nötigen Selenium-Servers – @Drone injiziert WebDriver (=Fernsteuerung) – Browser wählbar via arquillian.xml • Firefox, Crome, IE, HtmlUnit, PhantomJS, … • häufig per Maven-Profil
  • 25. Drone @RunWith(Arquillian.class) public class WaehrungGuiIntegrationTest { … @Drone WebDriver webDriver; @Test public void testUmrechnenUSD() { … this.webDriver.get(serverUrlWebContext + "/demo/waehrungsrechner.xhtml"); WebElement fremdBetragField = this.webDriver.findElement(By.id("form:fremdBetrag")); fremdBetragField.clear(); fremdBetragField.sendKeys(fremdBetrag.toString()); … WebElement umrechnenButton = this.webDriver.findElement(By.id("form:umrechnen")); umrechnenButton.click(); WebElement euroBetragField = this.webDriver.findElement(By.id("form:euroBetrag")); String actual = euroBetragField.getText(); Assert.assertEquals("Eurowert", expected, actual);
  • 26. Drone • Grey Box Test – Web GUI Fernbedienung wie zuvor – Abfrage des serverseitigen Zustands • z. B. mittels Remote EJB @RunWith(Arquillian.class) public class ShopGuiIntegrationTest { @Test public void testCreateBestellung() { … this.webDriver.get(serverUrlWebContext + "/demo/waehrungsrechner.xhtml"); … ShopGuiIntegrationTestInspectorRemote inspector = ServiceLocator.getEjb(ShopGuiIntegrationTestInspectorRemote.class, …); Assert.assertTrue("Bestellung nicht gespeichert", inspector.checkBestellungExists(expected));
  • 27. Arquillian Extensions Persistence Initialisierung, Validierung und Cleanup der Datenbank JaCoCo Code Coverage Monitoring Performance Prüfung der Ausführungszeit Warp Grey Box Testing mit Drone Graphene … Selenium-Erweiterung u. a. mit AJAXUnterstützung und JQuery-Selektion
  • 28. Arquillian Experience • Mächtiges Werkzeug • Dokumentation je nach Extension sehr gut bis nicht vorhanden • Aufwändige Konfiguration – JAR-Hölle • Ausführungsgeschwindigkeit
  • 29. Links • Beispielprojekt https://github.com/dirkweil/feige-sein • Arquillian http://arquillian.org/ • Arquillian Testing Guide http://www.packtpub.com/arquillian-testing-guide/book
  • 30. Mehr Infos • Java-EE-Blog http://javaeeblog.wordpress.com/ • Expertenkreis Java http://expertenkreisjava.blogspot.de • Schulung, Projektunterstützung etc. dirk.weil@gedoplan.de
  • 32. Schön, dass Sie da waren! dirk.weil@gedoplan.de