Your SlideShare is downloading. ×
Feige sein
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Feige sein

249
views

Published on

Vortrag auf der W-JAX München 2013

Vortrag auf der W-JAX München 2013


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
249
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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
  • 7. Beispielprojekt ShopModel + Views Bestellung BestellPosition BestellungRepository Artikel ArtikelRepository WaehrungModel + Views WaehrungRestService Waehrung WaehrungService WaehrungRepository EntityManager / PU TX Manager
  • 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
  • 24. Drone WaehrungModel + Views WaehrungService Waehrung WaehrungRepository EntityManager / PU TX Manager
  • 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
  • 31. Hrglymph
  • 32. Schön, dass Sie da waren! dirk.weil@gedoplan.de