Feige sein!
Testen im EE-Umfeld
Dirk Weil, GEDOPLAN GmbH
Dirk Weil
GEDOPLAN GmbH, Bielefeld
Java EE seit 1998
Konzeption und
Realisierung
Vorträge
Seminare
Veröffentlichungen
2Fei...
Testen
3Feige sein!
Bei mir läuft's!
Dafür haben wir
kein Budget.
Gestern ging‘s
noch (und ich hab‘
nix gemacht).
Wir habe...
Testen
4Feige sein!
Testen ist feige!
… dann lassen Sie uns feige sein!
EE-Tests
Komplexe Komponenten-Landschaft
CDI / EJB
@Inject, @Produces, @Alternative …
Plattform
@PersistenceContext, @Tran...
realembedded
SE-Test
Was und wie schnell?
6Feige sein!
Ausführungszeit
Testtiefe
Unit
Test
Multi Unit
Test
Integration
Tes...
Beispielprojekt
7Feige sein!
WaehrungRepository
WaehrungService
WaehrungModel
+ Views
WaehrungRestService
BestellungReposi...
Unit Test
Test: Umrechnung in WaehrungService
Mock für WaehrungRepository
Toolset: JUnit, Mockito
8Feige sein!
WaehrungRep...
Unit Test
9Feige sein!
@Stateless @LocalBean
public class WaehrungService implements WaehrungServiceRemote
{
@Inject
Waehr...
Multi Unit Test
Test: Umrechnung in WaehrungService
Test-DB statt Prod-DB
Toolset: JUnit, CDI-Container
alternativer Produ...
Multi Unit Test
Apache
DeltaSpike
Container-
Start
Kontext-
Start
Injektion
in unmanaged
Objects
public class WaehrungServ...
Multi Unit Test
Mocking – the CDI way
(1: Alternative)
12Feige sein!
public class EntityManagerProducer
{
@PersistenceCont...
Multi Unit Test
Mocking – the CDI way
(2: Interceptor)
13Feige sein!
@Transactional
public class WaehrungRepository
{
publ...
Testdaten-Bereitstellung
Bulk Load
Skript, DBUnit, …
Manuell
Prod Extract, …
Anwendungs-API
EntityManager, XyzRepository
1...
Testdaten-Bereitstellung
Daten vor dem Test löschen …
höhere Komponenten zuerst
… und neu laden
niedere Komponenten zuerst...
Integration Tests
Test in Java EE Server
Test von Komponenten
inkl. der davon genutzten Schichten
Zugriff auf alle Java-EE...
Arquillian
Server Lifecycle (Start/Stop)
Erstellung von Deployment Archives
Deployment (+Undeployment)
Integration mit JUn...
18Feige sein!
Arquillian
Server starten Archiv erstellen und deployen
Tests durchführen
Archiv undeployen
Server stoppen
w...
Arquillian
Container-Wahl durch Classpath
verfügbare Container:
https://docs.jboss.org/author/display/ARQ/Container+adapte...
Arquillian
JUnit Testrunner
Deployment mit ShrinkWrap erstellen
neuen Archivnamen nutzen (z. B. UUID)
richtige Endung!
20F...
Arquillian
White Box Test
@Deployment(testable=true) (Default)
Testklasse wird mit deployt
@Inject etc. nutzbar
21Feige se...
Arquillian
White Box Test
Passend erstelltes Deployment
angepasste PU-Definition
22Feige sein!
WaehrungRepository
Waehrung...
Arquillian
White Box Test
23Feige sein!
Archiv erstellen
- Benötigte Anwendungsdateien
- ggf. spezielle Testartefakte
(z.B...
Arquillian
Black Box Test
@Deployment(testable=false)
Test läuft im Client
(IDE, Jenkins, etc.)
Zugriff nur Remote
z. B. E...
Arquillian
Black Box Test
25Feige sein!
Archiv erstellen
- Benötigte Anwendungsdateien
- ggf. spezielle Testartefakte
(z.B...
Drone
Arquillian-Erweiterung für Selenium
Browser-Fernsteuerung
Drone übernimmt Lifecycle-Steuerung des ggf. nötigen Brows...
Drone
27Feige sein!
WaehrungRepository
WaehrungService
WaehrungModel
+ Views
EntityManager / PU TX Manager
Waehrung
28Feige sein!
Drone
@RunWith(Arquillian.class)
public class WaehrungGuiIntegrationTest
{
…
@Drone WebDriver webDriver;
@Te...
Drone
Grey Box Test
Web GUI Fernbedienung wie zuvor
Abfrage des serverseitigen Zustands
z. B. mittels Remote EJB
29Feige s...
Arquillian Extensions
30Feige sein!
Persistence Initialisierung, Validierung und Cleanup
der Datenbank
JaCoCo Code Coverag...
Arquillian Experience
Mächtiges Werkzeug
Dokumentation je nach Extension sehr gut bis nicht vorhanden
Aufwändige Konfigura...
Links
Beispielprojekt
https://github.com/dirkweil/feige-sein
Arquillian
http://arquillian.org/
Arquillian Testing Guide
ht...
More
Seminare zum Thema, z. B.
Java Software Testing
http://www.gedoplan-it-training.de
http://www.gedoplan-it-consulting....
Upcoming SlideShare
Loading in …5
×

Feige sein! Testen im Java-EE-Umfeld

245 views

Published on

GEDOPLAN-Vortrag zum Thema Unit Tests, Multi Unit Tests und Integration Tests insbesondere für Anwendungen auf Basis der Java EE. (www.gedoplan.de)

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Feige sein! Testen im Java-EE-Umfeld

  1. 1. Feige sein! Testen im EE-Umfeld Dirk Weil, GEDOPLAN GmbH
  2. 2. Dirk Weil GEDOPLAN GmbH, Bielefeld Java EE seit 1998 Konzeption und Realisierung Vorträge Seminare Veröffentlichungen 2Feige sein!
  3. 3. Testen 3Feige sein! Bei mir läuft's! Dafür haben wir kein Budget. Gestern ging‘s noch (und ich hab‘ nix gemacht). Wir haben keinen Testserver EE-Tests sind zu aufwändig.
  4. 4. Testen 4Feige sein! 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 5Feige sein!
  6. 6. realembedded SE-Test Was und wie schnell? 6Feige sein! Ausführungszeit Testtiefe Unit Test Multi Unit Test Integration Test Einzelklasse Komponente Subsystem Anwendung Service (inkl. Umgebung) In-Container-Test
  7. 7. Beispielprojekt 7Feige sein! WaehrungRepository WaehrungService WaehrungModel + Views WaehrungRestService BestellungRepository ArtikelRepository ShopModel + Views Artikel Bestellung Waehrung Bestell- Position EntityManager / PU TX Manager
  8. 8. Unit Test Test: Umrechnung in WaehrungService Mock für WaehrungRepository Toolset: JUnit, Mockito 8Feige sein! WaehrungRepository WaehrungService Waehrung
  9. 9. Unit Test 9Feige sein! @Stateless @LocalBean public class WaehrungService implements WaehrungServiceRemote { @Inject WaehrungRepository waehrungRepository; public BigDecimal getTauschkurs(String waehrungId) { Waehrung waehrung = waehrungRepository.findById(waehrungId); public class WaehrungServiceUnitTest { @BeforeClass public static void beforeClass() { repository = Mockito.mock(WaehrungRepository.class); Mockito.when(repository.findById("USD")).thenReturn(USD); service = new WaehrungService(); service.waehrungRepository = repository; } Mock-Objekt vorbereiten „Injektion“
  10. 10. Multi Unit Test Test: Umrechnung in WaehrungService Test-DB statt Prod-DB Toolset: JUnit, CDI-Container alternativer Producer für EntityManager TX-Interceptor 10Feige sein! WaehrungRepository WaehrungService Waehrung EntityManager / PU TX Manager
  11. 11. Multi Unit Test Apache DeltaSpike Container- Start Kontext- Start Injektion in unmanaged Objects public class WaehrungServiceMultiTest { private static CdiContainer cdiContainer; @BeforeClass public static void beforeClass() { cdiContainer = CdiContainerLoader.getCdiContainer(); cdiContainer.boot(); cdiContainer.getContextControl().startContexts(); } @Before public void before() { BeanProvider.injectFields(this); } @Inject WaehrungService waehrungService;
  12. 12. Multi Unit Test Mocking – the CDI way (1: Alternative) 12Feige sein! public class EntityManagerProducer { @PersistenceContext(unitName = "seminar") @Produces private EntityManager entityManager; } @Alternative @Priority(1) public class TestEntityManagerProducer { EntityManagerFactory emf; @PostConstruct private void postConstruct() { emf= Persistence.createEntityManagerFactory("test"); } @Produces EntityManager createEntityManager() { return emf.createEntityManager(); Mock-Objekt nur im Test-Classpath
  13. 13. Multi Unit Test Mocking – the CDI way (2: Interceptor) 13Feige sein! @Transactional public class WaehrungRepository { public void persist(Waehrung entity) { this.entityManager.persist(entity); @Interceptor @Priority(Interceptor.Priority.APPLICATION + 1) @Transactional public class TestTransactionInterceptor { @Inject EntityManager entityManager; @AroundInvoke Object manageTX(InvocationContext invocationContext) throws Exception { this.entityManager.getTransaction().begin(); Mock-Objekt nur im Test-Classpath
  14. 14. Testdaten-Bereitstellung Bulk Load Skript, DBUnit, … Manuell Prod Extract, … Anwendungs-API EntityManager, XyzRepository 14Feige sein! <waehrung id="USD"> … >import 2013-11-07.dump
  15. 15. 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 (Testdaten-Lader wiederum nur im Test-Classpath) 15Feige sein!
  16. 16. 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 16Feige sein!
  17. 17. 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 17Feige sein!
  18. 18. 18Feige sein! Arquillian Server starten Archiv erstellen und deployen Tests durchführen Archiv undeployen Server stoppen weitere Testklasse? Remote ModeManaged Mode
  19. 19. Arquillian Container-Wahl durch Classpath verfügbare Container: https://docs.jboss.org/author/display/ARQ/Container+adapters 19Feige sein! <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>
  20. 20. Arquillian JUnit Testrunner Deployment mit ShrinkWrap erstellen neuen Archivnamen nutzen (z. B. UUID) richtige Endung! 20Feige sein! @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(…);
  21. 21. Arquillian White Box Test @Deployment(testable=true) (Default) Testklasse wird mit deployt @Inject etc. nutzbar 21Feige sein! @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);
  22. 22. Arquillian White Box Test Passend erstelltes Deployment angepasste PU-Definition 22Feige sein! WaehrungRepository WaehrungService Waehrung EntityManager / PU TX Manager
  23. 23. Arquillian White Box Test 23Feige sein! Archiv erstellen - Benötigte Anwendungsdateien - ggf. spezielle Testartefakte (z.B. persistence.xml) - Testklasse inkl. Dependencies (automatisch per testable=true) Testergebnisse einsammeln Testlauf abschließen Archiv deployen Tests ausführen Archiv undeployen Client Server
  24. 24. Arquillian Black Box Test @Deployment(testable=false) Test läuft im Client (IDE, Jenkins, etc.) Zugriff nur Remote z. B. EJB per Remoting z. B. RESTful Service via JAX-RS Client 24Feige sein! @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() {
  25. 25. Arquillian Black Box Test 25Feige sein! Archiv erstellen - Benötigte Anwendungsdateien - ggf. spezielle Testartefakte (z.B. persistence.xml) Tests ausführen Testlauf abschließen Archiv deployen Archiv undeployen Client Server remote
  26. 26. Drone Arquillian-Erweiterung für Selenium Browser-Fernsteuerung Drone übernimmt Lifecycle-Steuerung des ggf. nötigen Browsers @Drone injiziert WebDriver (=Fernsteuerung) Browser wählbar via arquillian.xml Firefox, Crome, IE, HtmlUnit, PhantomJS, … häufig per Maven-Profil 26Feige sein!
  27. 27. Drone 27Feige sein! WaehrungRepository WaehrungService WaehrungModel + Views EntityManager / PU TX Manager Waehrung
  28. 28. 28Feige sein! 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);
  29. 29. Drone Grey Box Test Web GUI Fernbedienung wie zuvor Abfrage des serverseitigen Zustands z. B. mittels Remote EJB 29Feige sein! @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));
  30. 30. Arquillian Extensions 30Feige sein! 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 AJAX- Unterstützung und JQuery-Selektion …
  31. 31. Arquillian Experience Mächtiges Werkzeug Dokumentation je nach Extension sehr gut bis nicht vorhanden Aufwändige Konfiguration JAR-Hölle Ausführungsgeschwindigkeit 31Feige sein!
  32. 32. Links Beispielprojekt https://github.com/dirkweil/feige-sein Arquillian http://arquillian.org/ Arquillian Testing Guide http://www.packtpub.com/arquillian-testing-guide/book 32Feige sein!
  33. 33. More Seminare zum Thema, z. B. Java Software Testing http://www.gedoplan-it-training.de http://www.gedoplan-it-consulting.de http://javaeeblog.wordpress.com/ http://expertenkreisjava.blogspot.de/  dirk.weil@gedoplan.de @dirkweil 34Feige sein! dirk.weil@gedoplan.de

×