31
Feige sein! Testen im EE-Umfeld Expertenkreis Java 21.11.2013, GEDOPLAN Dirk Weil, GEDOPLAN GmbH

Testen im EE-Umfeld – Seien Sie feige!

Embed Size (px)

DESCRIPTION

Vortrag auf dem Expertenkreis Java am 21.11.2013

Citation preview

Page 1: Testen im EE-Umfeld – Seien Sie feige!

Feige sein!

Testen im EE-Umfeld

Expertenkreis Java

21.11.2013, GEDOPLAN

Dirk Weil, GEDOPLAN GmbH

Page 2: Testen im EE-Umfeld – Seien Sie feige!

Testen

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

Page 3: Testen im EE-Umfeld – Seien Sie feige!

Testen

3 Feige sein!

Testen ist feige!

… dann lassen Sie uns feige sein!

Page 4: Testen im EE-Umfeld – Seien Sie feige!

EE-Tests

Komplexe Komponenten-Landschaft

CDI / EJB

@Inject, @Produces, @Alternative …

Plattform

@PersistenceContext, @Transactional, …

Web

@Named, @XyzScoped, @Path

Feige sein! 4

Page 5: Testen im EE-Umfeld – Seien Sie feige!

real

embedded

SE-Test

Was und wie schnell?

5 Feige sein!

Ausf

ühru

ngsz

eit

Testtiefe

Unit

Test

Multi Unit

Test

Integration

Test

Einzelklasse Komponente

Subsystem

Anwendung

Service

(inkl. Umgebung)

In-Container-Test

Page 6: Testen im EE-Umfeld – Seien Sie feige!

Beispielprojekt

WaehrungRepository

WaehrungService

WaehrungModel

+ Views

WaehrungRestService

BestellungRepository

ArtikelRepository

ShopModel

+ Views

Artikel

Bestellung

Waehrung

Bestell-

Position

EntityManager / PU TX Manager

Feige sein! 6

Page 7: Testen im EE-Umfeld – Seien Sie feige!

Unit Test

Test: Umrechnung in WaehrungService

Mock für WaehrungRepository

Toolset: JUnit, Mockito

7 Feige sein!

WaehrungRepository

WaehrungService Waehrung

Page 8: Testen im EE-Umfeld – Seien Sie feige!

Multi Unit Test

Test: Umrechnung in WaehrungService

Test-DB statt Prod-DB

Toolset: JUnit, CDI-Container

alternativer Producer für EntityManager

TX-Interceptor

8 Feige sein!

WaehrungRepository

WaehrungService Waehrung

EntityManager / PU TX Manager

Page 9: Testen im EE-Umfeld – Seien Sie feige!

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

9 Feige sein!

Page 10: Testen im EE-Umfeld – Seien Sie feige!

Testdaten-Bereitstellung

Bulk Load

Skript, DBUnit, …

Manuell

Prod Extract, …

Anwendungs-API

EntityManager, XyzRepository

10 Feige sein!

<waehrung

id="USD">

>import 2013-11-07.dump

Page 11: Testen im EE-Umfeld – Seien Sie feige!

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

11 Feige sein!

Page 12: Testen im EE-Umfeld – Seien Sie feige!

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

12 Feige sein!

Page 13: Testen im EE-Umfeld – Seien Sie feige!

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

13 Feige sein!

Page 14: Testen im EE-Umfeld – Seien Sie feige!

14 Feige sein!

Arquillian

Server starten Archiv erstellen und deployen

Tests durchführen

Archiv undeployen

Server stoppen weitere

Testklasse?

Remote Mode Managed Mode

Page 15: Testen im EE-Umfeld – Seien Sie feige!

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

Page 16: Testen im EE-Umfeld – Seien Sie feige!

Arquillian

JUnit Testrunner

Deployment mit ShrinkWrap erstellen

neuen Archivnamen nutzen (z. B. UUID)

richtige Endung!

16 Feige 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(…);

Page 17: Testen im EE-Umfeld – Seien Sie feige!

Arquillian

White Box Test

@Deployment(testable=true) (Default)

Testklasse wird mit deployt

@Inject etc. nutzbar

17 Feige 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);

Page 18: Testen im EE-Umfeld – Seien Sie feige!

Arquillian

White Box Test

Ausgenutzte Goodies

Passend erstelltes Deployment

angepasste PU-Definition

18 Feige sein!

WaehrungRepository

WaehrungService Waehrung

EntityManager / PU TX Manager

Page 19: Testen im EE-Umfeld – Seien Sie feige!

Arquillian

Black Box Test

@Deployment(testable=false)

Test läuft im Client (IDE, Maven, etc.)

Zugriff nur Remote

19 Feige 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()

{

Page 20: Testen im EE-Umfeld – Seien Sie feige!

Arquillian

Black Box Test

Remote EJB

Benötigt Client Lib des Servers

Service Locator

20 Feige sein!

@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);

Page 21: Testen im EE-Umfeld – Seien Sie feige!

Arquillian

Black Box Test

REST Service

JAX-RS 2.0 / Java EE 7: Client API

21 Feige sein!

@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);

Page 22: Testen im EE-Umfeld – Seien Sie feige!

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

22 Feige sein!

Page 23: Testen im EE-Umfeld – Seien Sie feige!

Drone

23 Feige sein!

WaehrungRepository

WaehrungService

WaehrungModel

+ Views

EntityManager / PU TX Manager

Waehrung

Page 24: Testen im EE-Umfeld – Seien Sie feige!

24 Feige 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);

Page 25: Testen im EE-Umfeld – Seien Sie feige!

Drone

Grey Box Test

Web GUI Fernbedienung wie zuvor

Abfrage des serverseitigen Zustands

z. B. mittels Remote EJB

25 Feige 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));

Page 26: Testen im EE-Umfeld – Seien Sie feige!

Arquillian Extensions

26 Feige 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

Page 27: Testen im EE-Umfeld – Seien Sie feige!

Arquillian Experience

Mächtiges Werkzeug

Dokumentation je nach Extension sehr gut bis nicht vorhanden

Aufwändige Konfiguration

JAR-Hölle

Ausführungsgeschwindigkeit

27 Feige sein!

Page 29: Testen im EE-Umfeld – Seien Sie feige!

Mehr Infos

Java-EE-Blog

http://javaeeblog.wordpress.com/

Expertenkreis Java

http://expertenkreisjava.blogspot.de

Schulung, Projektunterstützung etc.

[email protected]

29 Feige sein!

Page 30: Testen im EE-Umfeld – Seien Sie feige!

Hrglymph

30 Feige sein!

Page 31: Testen im EE-Umfeld – Seien Sie feige!

Schön, dass Sie da waren!

[email protected] Feige sein! 31