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.
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
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
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
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