Testen im EE-Umfeld – Seien Sie feige!

401 views
348 views

Published on

Vortrag auf dem Expertenkreis Java am 21.11.2013

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

  • Be the first to like this

No Downloads
Views
Total views
401
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Testen im EE-Umfeld – Seien Sie feige!

  1. 1. Feige sein! Testen im EE-Umfeld Expertenkreis Java 21.11.2013, GEDOPLAN Dirk Weil, GEDOPLAN GmbH
  2. 2. 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 Feige sein! Dafür haben wir kein Budget. 2
  3. 3. Testen Testen ist feige! … dann lassen Sie uns feige sein! Feige sein! 3
  4. 4. EE-Tests Komplexe Komponenten-Landschaft CDI / EJB @Inject, @Produces, @Alternative … Plattform @PersistenceContext, @Transactional, … Web @Named, @XyzScoped, @Path Feige sein! 4
  5. 5. Ausführungszeit Was und wie schnell? SE-Test Integration Test Unit Test Einzelklasse Feige sein! In-Container-Test embedded real Multi Unit Test Service (inkl. Umgebung) Komponente Subsystem Anwendung Testtiefe 5
  6. 6. Beispielprojekt ShopModel + Views Bestellung BestellPosition BestellungRepository Artikel ArtikelRepository WaehrungModel + Views WaehrungRestService Waehrung WaehrungService WaehrungRepository EntityManager / PU Feige sein! TX Manager 6
  7. 7. Unit Test Test: Umrechnung in WaehrungService Mock für WaehrungRepository Toolset: JUnit, Mockito WaehrungService Waehrung WaehrungRepository Feige sein! 7
  8. 8. 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 Feige sein! TX Manager 8
  9. 9. 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 Feige sein! 9
  10. 10. Testdaten-Bereitstellung Bulk Load Skript, DBUnit, … <waehrung id="USD"> … Manuell Prod Extract, … >import 2013-11-07.dump Anwendungs-API EntityManager, XyzRepository Feige sein! 10
  11. 11. 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 Feige sein! 11
  12. 12. 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 Feige sein! 12
  13. 13. 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 Feige sein! 13
  14. 14. Arquillian Managed Mode Server starten Remote Mode Archiv erstellen und deployen Tests durchführen Archiv undeployen Server stoppen Feige sein! weitere Testklasse? 14
  15. 15. 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> Feige sein! 15
  16. 16. 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(…); Feige sein! 16
  17. 17. 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); Feige sein! 17
  18. 18. Arquillian White Box Test WaehrungService Waehrung WaehrungRepository TX Manager Ausgenutzte Goodies Passend erstelltes Deployment angepasste PU-Definition EntityManager / PU Feige sein! 18
  19. 19. 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() { Feige sein! 19
  20. 20. 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); Feige sein! 20
  21. 21. 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); Feige sein! 21
  22. 22. 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 Feige sein! 22
  23. 23. Drone WaehrungModel + Views WaehrungService Waehrung WaehrungRepository EntityManager / PU Feige sein! TX Manager 23
  24. 24. 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); Feige sein! 24
  25. 25. 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)); Feige sein! 25
  26. 26. Arquillian Extensions Persistence JaCoCo Performance Warp Graphene Initialisierung, Validierung und Cleanup der Datenbank Code Coverage Monitoring Prüfung der Ausführungszeit Grey Box Testing mit Drone Selenium-Erweiterung u. a. mit AJAXUnterstützung und JQuery-Selektion … Feige sein! 26
  27. 27. Arquillian Experience Mächtiges Werkzeug Dokumentation je nach Extension sehr gut bis nicht vorhanden Aufwändige Konfiguration JAR-Hölle Ausführungsgeschwindigkeit Feige sein! 27
  28. 28. Links Beispielprojekt https://github.com/dirkweil/feige-sein Arquillian http://arquillian.org/ Arquillian Testing Guide http://www.packtpub.com/arquillian-testing-guide/book Feige sein! 28
  29. 29. Mehr Infos Java-EE-Blog http://javaeeblog.wordpress.com/ Expertenkreis Java http://expertenkreisjava.blogspot.de Schulung, Projektunterstützung etc. dirk.weil@gedoplan.de Feige sein! 29
  30. 30. Hrglymph Feige sein! 30
  31. 31. Schön, dass Sie da waren! Feige sein! 31 dirk.weil@gedoplan.de

×