Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Feige sein

449 views

Published on

Vortrag auf der W-JAX München 2013

  • Be the first to comment

  • Be the first to like this

Feige sein

  1. 1. Dirk Weil | GEDOPLAN GmbH Feige sein! Testen im EE-Umfeld
  2. 2. Dirk Weil • GEDOPLAN GmbH, Bielefeld • Java EE seit 1998 • Konzeption und Realisierung • Vorträge • Seminare • Veröffentlichungen
  3. 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. 4. Testen Testen ist feige! … dann lassen Sie uns feige sein!
  5. 5. EE-Tests • Komplexe Komponenten-Landschaft • CDI / EJB – @Inject, @Produces, @Alternative … • Plattform – @PersistenceContext, @Transactional, … • Web – @Named, @XyzScoped, @Path
  6. 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. 7. Beispielprojekt ShopModel + Views Bestellung BestellPosition BestellungRepository Artikel ArtikelRepository WaehrungModel + Views WaehrungRestService Waehrung WaehrungService WaehrungRepository EntityManager / PU TX Manager
  8. 8. Unit Test • Test: Umrechnung in WaehrungService • Mock für WaehrungRepository • Toolset: JUnit, Mockito WaehrungService WaehrungRepository Waehrung
  9. 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. 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. 11. Testdaten-Bereitstellung • Bulk Load – Skript, DBUnit, … <waehrung id="USD"> … • Manuell – Prod Extract, … >import 2013-11-07.dump • Anwendungs-API – EntityManager, XyzRepository
  12. 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. 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. 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. 15. Arquillian Managed Mode Server starten Remote Mode Archiv erstellen und deployen Tests durchführen Archiv undeployen Server stoppen weitere Testklasse?
  16. 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. 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. 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. 19. Arquillian • White Box Test Waehrung WaehrungService WaehrungRepository EntityManager / PU TX Manager • Ausgenutzte Goodies – Passend erstelltes Deployment – angepasste PU-Definition
  20. 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. 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. 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. 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. 24. Drone WaehrungModel + Views WaehrungService Waehrung WaehrungRepository EntityManager / PU TX Manager
  25. 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. 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. 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. 28. Arquillian Experience • Mächtiges Werkzeug • Dokumentation je nach Extension sehr gut bis nicht vorhanden • Aufwändige Konfiguration – JAR-Hölle • Ausführungsgeschwindigkeit
  29. 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. 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. 31. Hrglymph
  32. 32. Schön, dass Sie da waren! dirk.weil@gedoplan.de

×