SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
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
2Feige sein!
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.
Testen
4Feige sein!
Testen ist feige!
… dann lassen Sie uns feige sein!
EE-Tests
Komplexe Komponenten-Landschaft
CDI / EJB
@Inject, @Produces, @Alternative …
Plattform
@PersistenceContext, @Transactional, …
Web
@Named, @XyzScoped, @Path
5Feige sein!
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
Beispielprojekt
7Feige sein!
WaehrungRepository
WaehrungService
WaehrungModel
+ Views
WaehrungRestService
BestellungRepository
ArtikelRepository
ShopModel
+ Views
Artikel
Bestellung
Waehrung
Bestell-
Position
EntityManager / PU TX Manager
Unit Test
Test: Umrechnung in WaehrungService
Mock für WaehrungRepository
Toolset: JUnit, Mockito
8Feige sein!
WaehrungRepository
WaehrungService
Waehrung
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“
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
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;
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
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
Testdaten-Bereitstellung
Bulk Load
Skript, DBUnit, …
Manuell
Prod Extract, …
Anwendungs-API
EntityManager, XyzRepository
14Feige sein!
<waehrung
id="USD">
…
>import 2013-11-07.dump
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!
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!
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!
18Feige sein!
Arquillian
Server starten Archiv erstellen und deployen
Tests durchführen
Archiv undeployen
Server stoppen
weitere
Testklasse?
Remote ModeManaged Mode
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>
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(…);
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);
Arquillian
White Box Test
Passend erstelltes Deployment
angepasste PU-Definition
22Feige sein!
WaehrungRepository
WaehrungService
Waehrung
EntityManager / PU TX Manager
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
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()
{
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
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!
Drone
27Feige sein!
WaehrungRepository
WaehrungService
WaehrungModel
+ Views
EntityManager / PU TX Manager
Waehrung
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);
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));
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
…
Arquillian Experience
Mächtiges Werkzeug
Dokumentation je nach Extension sehr gut bis nicht vorhanden
Aufwändige Konfiguration
JAR-Hölle
Ausführungsgeschwindigkeit
31Feige sein!
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!
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

Weitere ähnliche Inhalte

Was ist angesagt?

Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Thorsten Kamann
 
Last- und Performancetesting
Last- und PerformancetestingLast- und Performancetesting
Last- und PerformancetestingJürg Stuker
 
Java Batch: Der neue Standard für‘s Stapeln
Java Batch: Der neue Standard für‘s StapelnJava Batch: Der neue Standard für‘s Stapeln
Java Batch: Der neue Standard für‘s Stapelngedoplan
 
Was ist neu in Java 6, 7, 8, ...
Was ist neu in Java 6, 7, 8, ...Was ist neu in Java 6, 7, 8, ...
Was ist neu in Java 6, 7, 8, ...Andreas Schreiber
 
Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Chris Michael Klinger
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTddjlink
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
Fix & fertig: Best Practises für "XPages-Migranten"
Fix & fertig: Best Practises für "XPages-Migranten"Fix & fertig: Best Practises für "XPages-Migranten"
Fix & fertig: Best Practises für "XPages-Migranten"Oliver Busse
 
Drohnen und WARP-Antriebe
Drohnen und WARP-AntriebeDrohnen und WARP-Antriebe
Drohnen und WARP-Antriebeberndmueller
 
C++ Dependency Management 2.0
C++ Dependency Management 2.0C++ Dependency Management 2.0
C++ Dependency Management 2.0Patrick Charrier
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascriptjoergreichert
 
Continuous Delivery - Aber Sicher?!
Continuous Delivery - Aber Sicher?!Continuous Delivery - Aber Sicher?!
Continuous Delivery - Aber Sicher?!Jan Dittberner
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101gueste4be40
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistencegedoplan
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtOPITZ CONSULTING Deutschland
 

Was ist angesagt? (20)

Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 
Last- und Performancetesting
Last- und PerformancetestingLast- und Performancetesting
Last- und Performancetesting
 
Java Batch: Der neue Standard für‘s Stapeln
Java Batch: Der neue Standard für‘s StapelnJava Batch: Der neue Standard für‘s Stapeln
Java Batch: Der neue Standard für‘s Stapeln
 
Was ist neu in Java 6, 7, 8, ...
Was ist neu in Java 6, 7, 8, ...Was ist neu in Java 6, 7, 8, ...
Was ist neu in Java 6, 7, 8, ...
 
Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Fix & fertig: Best Practises für "XPages-Migranten"
Fix & fertig: Best Practises für "XPages-Migranten"Fix & fertig: Best Practises für "XPages-Migranten"
Fix & fertig: Best Practises für "XPages-Migranten"
 
Drohnen und WARP-Antriebe
Drohnen und WARP-AntriebeDrohnen und WARP-Antriebe
Drohnen und WARP-Antriebe
 
C++ Dependency Management 2.0
C++ Dependency Management 2.0C++ Dependency Management 2.0
C++ Dependency Management 2.0
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascript
 
Automatisierungmit NANT
Automatisierungmit NANTAutomatisierungmit NANT
Automatisierungmit NANT
 
Continuous Delivery - Aber Sicher?!
Continuous Delivery - Aber Sicher?!Continuous Delivery - Aber Sicher?!
Continuous Delivery - Aber Sicher?!
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 
Entity framework
Entity frameworkEntity framework
Entity framework
 
Arquillian
ArquillianArquillian
Arquillian
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
 
Einführung Maven
Einführung MavenEinführung Maven
Einführung Maven
 

Andere mochten auch

Photo talk
Photo talkPhoto talk
Photo talkJAMAATON
 
Sonas Housing Annual Review 2011
Sonas Housing Annual Review 2011Sonas Housing Annual Review 2011
Sonas Housing Annual Review 2011Sonas_Housing
 
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-AnwendungenJava Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungengedoplan
 
Neuerungen in JavaServer Faces 2.0
Neuerungen in JavaServer Faces 2.0Neuerungen in JavaServer Faces 2.0
Neuerungen in JavaServer Faces 2.0gedoplan
 
Spring Boot
Spring BootSpring Boot
Spring Bootgedoplan
 
What's new in Java EE 7
What's new in Java EE 7What's new in Java EE 7
What's new in Java EE 7gedoplan
 
Java Persistence 2.0
Java Persistence 2.0Java Persistence 2.0
Java Persistence 2.0gedoplan
 
Java in the Cloud - am Beispiel der Google App Engineg
Java in the Cloud - am Beispiel der Google App EnginegJava in the Cloud - am Beispiel der Google App Engineg
Java in the Cloud - am Beispiel der Google App Engineggedoplan
 
Infinispan - NoSQL für den Enterprise Java Alltag
Infinispan - NoSQL für den Enterprise Java AlltagInfinispan - NoSQL für den Enterprise Java Alltag
Infinispan - NoSQL für den Enterprise Java Alltaggedoplan
 
Jpa queries
Jpa queriesJpa queries
Jpa queriesgedoplan
 
Leichtgewichtige Microservices mit Java EE 7
Leichtgewichtige Microservices mit Java EE 7Leichtgewichtige Microservices mit Java EE 7
Leichtgewichtige Microservices mit Java EE 7gedoplan
 
Kernel Masters inauguration slideshare
Kernel Masters inauguration slideshareKernel Masters inauguration slideshare
Kernel Masters inauguration slideshareKernel Masters
 
Java Batch – Der Standard für's Stapeln
Java Batch – Der Standard für's StapelnJava Batch – Der Standard für's Stapeln
Java Batch – Der Standard für's Stapelngedoplan
 
KM Placement Assistance Program
KM Placement Assistance ProgramKM Placement Assistance Program
KM Placement Assistance ProgramKernel Masters
 
Java EE 7 - Enterprise-Anwendungen ohne Ballast
Java EE 7 - Enterprise-Anwendungen ohne BallastJava EE 7 - Enterprise-Anwendungen ohne Ballast
Java EE 7 - Enterprise-Anwendungen ohne Ballastgedoplan
 

Andere mochten auch (16)

Photo talk
Photo talkPhoto talk
Photo talk
 
Sonas Housing Annual Review 2011
Sonas Housing Annual Review 2011Sonas Housing Annual Review 2011
Sonas Housing Annual Review 2011
 
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-AnwendungenJava Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
 
Neuerungen in JavaServer Faces 2.0
Neuerungen in JavaServer Faces 2.0Neuerungen in JavaServer Faces 2.0
Neuerungen in JavaServer Faces 2.0
 
CDI
CDICDI
CDI
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
What's new in Java EE 7
What's new in Java EE 7What's new in Java EE 7
What's new in Java EE 7
 
Java Persistence 2.0
Java Persistence 2.0Java Persistence 2.0
Java Persistence 2.0
 
Java in the Cloud - am Beispiel der Google App Engineg
Java in the Cloud - am Beispiel der Google App EnginegJava in the Cloud - am Beispiel der Google App Engineg
Java in the Cloud - am Beispiel der Google App Engineg
 
Infinispan - NoSQL für den Enterprise Java Alltag
Infinispan - NoSQL für den Enterprise Java AlltagInfinispan - NoSQL für den Enterprise Java Alltag
Infinispan - NoSQL für den Enterprise Java Alltag
 
Jpa queries
Jpa queriesJpa queries
Jpa queries
 
Leichtgewichtige Microservices mit Java EE 7
Leichtgewichtige Microservices mit Java EE 7Leichtgewichtige Microservices mit Java EE 7
Leichtgewichtige Microservices mit Java EE 7
 
Kernel Masters inauguration slideshare
Kernel Masters inauguration slideshareKernel Masters inauguration slideshare
Kernel Masters inauguration slideshare
 
Java Batch – Der Standard für's Stapeln
Java Batch – Der Standard für's StapelnJava Batch – Der Standard für's Stapeln
Java Batch – Der Standard für's Stapeln
 
KM Placement Assistance Program
KM Placement Assistance ProgramKM Placement Assistance Program
KM Placement Assistance Program
 
Java EE 7 - Enterprise-Anwendungen ohne Ballast
Java EE 7 - Enterprise-Anwendungen ohne BallastJava EE 7 - Enterprise-Anwendungen ohne Ballast
Java EE 7 - Enterprise-Anwendungen ohne Ballast
 

Ähnlich wie Feige sein! Testen im Java-EE-Umfeld

Mögen die Tests mit dir sein
Mögen die Tests mit dir seinMögen die Tests mit dir sein
Mögen die Tests mit dir seincodepitbull
 
JSF Testing - Tools und Technics
JSF Testing - Tools und TechnicsJSF Testing - Tools und Technics
JSF Testing - Tools und Technicsadesso AG
 
2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit Arquillian2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit ArquillianMatthias Reining
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistencegedoplan
 
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...Marc Müller
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsGFU Cyrus AG
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...GFU Cyrus AG
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6GFU Cyrus AG
 
JEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine EinführungJEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine Einführunggedoplan
 
MicroProfile-Anwendungen mit Quarkus
MicroProfile-Anwendungen mit QuarkusMicroProfile-Anwendungen mit Quarkus
MicroProfile-Anwendungen mit Quarkusgedoplan
 
Der Application Server ist tot (?) - es lebe Jakarta EE!
Der Application Server ist tot (?) - es lebe Jakarta EE!Der Application Server ist tot (?) - es lebe Jakarta EE!
Der Application Server ist tot (?) - es lebe Jakarta EE!gedoplan
 
Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"schellsoft
 
Robustes Testen mit Selenium
Robustes Testen mit SeleniumRobustes Testen mit Selenium
Robustes Testen mit Seleniumx-celerate
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenOPITZ CONSULTING Deutschland
 

Ähnlich wie Feige sein! Testen im Java-EE-Umfeld (20)

Mögen die Tests mit dir sein
Mögen die Tests mit dir seinMögen die Tests mit dir sein
Mögen die Tests mit dir sein
 
JSF Testing - Tools und Technics
JSF Testing - Tools und TechnicsJSF Testing - Tools und Technics
JSF Testing - Tools und Technics
 
2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit Arquillian2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit Arquillian
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration Tools
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6
 
Testing tools
Testing toolsTesting tools
Testing tools
 
JEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine EinführungJEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine Einführung
 
MicroProfile-Anwendungen mit Quarkus
MicroProfile-Anwendungen mit QuarkusMicroProfile-Anwendungen mit Quarkus
MicroProfile-Anwendungen mit Quarkus
 
Der Application Server ist tot (?) - es lebe Jakarta EE!
Der Application Server ist tot (?) - es lebe Jakarta EE!Der Application Server ist tot (?) - es lebe Jakarta EE!
Der Application Server ist tot (?) - es lebe Jakarta EE!
 
Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"
 
.NET zu .NET Core
.NET zu .NET Core.NET zu .NET Core
.NET zu .NET Core
 
Robustes Testen mit Selenium
Robustes Testen mit SeleniumRobustes Testen mit Selenium
Robustes Testen mit Selenium
 
Feature Flags mit Togglz
Feature Flags mit TogglzFeature Flags mit Togglz
Feature Flags mit Togglz
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und Architekten
 
Testen mit Arquillian
Testen mit ArquillianTesten mit Arquillian
Testen mit Arquillian
 

Feige sein! Testen im Java-EE-Umfeld

  • 1. Feige sein! Testen im EE-Umfeld Dirk Weil, GEDOPLAN GmbH
  • 2. Dirk Weil GEDOPLAN GmbH, Bielefeld Java EE seit 1998 Konzeption und Realisierung Vorträge Seminare Veröffentlichungen 2Feige sein!
  • 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. Testen 4Feige sein! Testen ist feige! … dann lassen Sie uns feige sein!
  • 5. EE-Tests Komplexe Komponenten-Landschaft CDI / EJB @Inject, @Produces, @Alternative … Plattform @PersistenceContext, @Transactional, … Web @Named, @XyzScoped, @Path 5Feige sein!
  • 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
  • 8. Unit Test Test: Umrechnung in WaehrungService Mock für WaehrungRepository Toolset: JUnit, Mockito 8Feige sein! WaehrungRepository WaehrungService Waehrung
  • 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. 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. 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. 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. 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. Testdaten-Bereitstellung Bulk Load Skript, DBUnit, … Manuell Prod Extract, … Anwendungs-API EntityManager, XyzRepository 14Feige sein! <waehrung id="USD"> … >import 2013-11-07.dump
  • 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. 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. 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. 18Feige sein! Arquillian Server starten Archiv erstellen und deployen Tests durchführen Archiv undeployen Server stoppen weitere Testklasse? Remote ModeManaged Mode
  • 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. 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. 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. Arquillian White Box Test Passend erstelltes Deployment angepasste PU-Definition 22Feige sein! WaehrungRepository WaehrungService Waehrung EntityManager / PU TX Manager
  • 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. 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. 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. 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!
  • 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. 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. 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. Arquillian Experience Mächtiges Werkzeug Dokumentation je nach Extension sehr gut bis nicht vorhanden Aufwändige Konfiguration JAR-Hölle Ausführungsgeschwindigkeit 31Feige sein!
  • 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