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
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
7. Unit Test
Test: Umrechnung in WaehrungService
Mock für WaehrungRepository
Toolset: JUnit, Mockito
WaehrungService
Waehrung
WaehrungRepository
Feige sein!
7
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. 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
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. 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. 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
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. 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
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. 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. 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. 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
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