cocktail d’expérience informatiques
             Genève 3 & 4 octobre 2011
                    Seconde édition
                      soft-shake.ch




Auteur    Alexis HASSLER
  Track   Java
Session   Test d'intégration
          avec Arquillian
Test d'intégration
       avec
    Arquillian




               Alexis Hassler
Arquillian




         Alexis Hassler
@AlexisHassler
Arquillian
Alexis
Hassler
JavaEE


JAX-WS     JAX-RS   JPA



Servlet
            EJB     JNDI

 JSP

            CDI     JMS
 JSF
Tests

Unitaire           Intégration
Test unitaire




       new


       mock
✔   EJB
Test d'intégration

Composant déployé dans son
conteneur
–   Mode embarqué
–   Déploiement distant
EJB

Mode embarqué



EJBContainer.createEJBContainer()

Context.lookup(...)
Spring Framework

Runner
–   Démarrer l'ApplicationContext



                 @RunWith

                 @Autowired
CDI

Weld SE
–   Runner maison
    cf. http://blog.alexis-hassler.com/2011/01/junit-runner-pour-cdi-weld.html




                           @RunWith

                           @Inject
JPA

   Conteneur JPA




Persistence.createEntityManagerFactory(...)
           .createEntityManager()
JMS

   Conteneur autonome




new ActiveMQConnectionFactory(
        "vm://localhost?broker.persistent=false");
HTTP / Servlet / JSP / ...

Conteneur autonome




      new ServletTester()

      new HttpTester()
✔   EJB / OpenEJB
Problème

1 conteneur par technologie
–   Pas de mode embarqué universel

Mode remote + Maven
–   pas dans le cycle de vie standard

Configurations spécifiques
JavaEE


JAX-WS     JAX-RS   JPA



Servlet
            EJB     JNDI

 JSP

            CDI     JMS
 JSF
JavaEE

                             JMS
       JAX-RS




                                    Transaction
                        EJB
Servlet
            CDI

                              JPA
 JSF
                  Bean
                Validation
Tester les composants,
  pas uniquement les classes,
     pas toute l'application
Mettre les

tests dans le conteneur
      plutôt que gérer le
    conteneur dans les tests
Structure d'un test


@RunWith(Arquillian.class)

@Deployment

@EJB, @Inject, @Resource

@Test
✔   EJB / OpenEJB
Conteneurs

JavaEE                 CDI
–   JBoss AS,           –   Weld SE,

–   GlassFish,          –   Weld EE,

–   Websphere AS        –   OpenWebBeans

Web                    EJB
–   Jetty,              –   Apache OpenEJB

–   Tomcat
Conteneurs




                                      DeployableContainer
ShrinkWrap

                     Arquillian
                                                            Conteneur
Test Case
                    junit-container



            JUnit
Conteneurs

Classpath

Profil maven
✔   EJB / Glassfish Embedded
✔   CDI / Glassfish Embedded
       ✔   CDI / Weld SE
Conteneurs

Remote



           Managed



                      Embedded
Conteneur embarqué
Démarrage du conteneur
     (in-process)


         Déploiement de l'archive




                            Exécution locale du test


                                         Retrait de l'archive


                                                   Arrêt du conteneur
Conteneur géré
Démarrage du conteneur
    (out-process)


         Déploiement de l'archive


                    Déploiement du service
                           Arquillian

                                Exécution du test
                                dans le conteneur


                                         Retrait de l'archive


                                                    Arrêt du conteneur
Conteneur distant
      Conteneur
préalablement démarré


        Déploiement de l'archive


                  Déploiement du service
                         Arquillian

                               Exécution du test
                               dans le conteneur


                                        Retrait de l'archive
Conteneurs



                     Remote                Managed                 Embedded
JBoss AS       4.2, 5.0, 5.1, 6.0, 7.0   4.2, 5.1, 6.0, 7.0                 5.1, 6.0
Glassfish                         3.1                                            3.1
Websphere AS                      7.0                                            8.0
Jetty                                                                       6.1, 7.0
Tomcat                            6.0                                            6.0
Weld                                                          SE 1.1, SE 1.0, EE 1.1
OpenWebBeans                                                                     1.0
OpenEJB                                                                          3.1
✔   EJB / JBoss AS 7 managed
    ✔   EJB / JBoss AS 7 remote
Architecture




                                      DeployableContainer
ShrinkWrap

                     Arquillian
                                                            Conteneur
Test Case
                    junit-container



            JUnit
Protocole Servlet


                 ShrinkWrap.create(WebArchive.class)
                           .addClasses(...);


                      Web Archive


  JUnit

Arquillian             Test case
                    Arquillian Servlet
Protocole Servlet 3.0


                   ShrinkWrap.create(JavaArchive.class)
                             .addClasses(...);


                        Web Archive


  JUnit

Arquillian               Test case
                      Arquillian Servlet
Protocole Servlet 2.5


                   ShrinkWrap.create(JavaArchive.class)
                             .addClasses(...);

                        Arquillian ear
                        Java Archive


  JUnit

Arquillian               Test case

                       Arquillian war
                      Arquillian Servlet
Protocole Servlet
              ShrinkWrap.create(EnterpriseArchive.class)
                        .addAsModule(jar);
                   ShrinkWrap.create(JavaArchive.class)
                             .addClasses(...);

                      Enterprise Archive
                        Java Archive


  JUnit

Arquillian                Test case

                        Arquillian war
                      Arquillian Servlet
Protocole JMX-AS7


                 ShrinkWrap.create(XxxArchive.class)
                           .addClasses(...);

                      JBoss AS 7

                      Any Archive


  JUnit

Arquillian
                        Test case

                    Arquillian Service
                    Arquillian MBean
✔   EJB / deploymentExportPath
as-client

Web, JAX-RS, JAX-WS,

RMI, EJB remote,...

                Web Archive


  JUnit

Arquillian
Test case
as-client



@ArquillianResource(MyServlet.class)
URL baseURL ;

@Deployment(testable=false)
public static Archive createDeployment() {
    ...
}

@Test
@RunAsClient
private void shouldDoX() {
    ...
}
as-client

Utilisable pour du test fonctionnel
– selenium,   htmlunit, httpunit,...
Drone

    Intégration sélénium

@RunWith(Arquillian.class)
public class BasicClientTest {

    @Drone DefaultSelenium browser;

    @Test
    public void testLoginAndLogout() {
      browser.open(deploymentUrl + "home.jsp");
      ...
    }
}
✔   JAX-RS / JBoss AS 7 managed
Arquillian

Test d'intégration

In-container

As-client

Multi-conteneurs
Références

http://jboss.org/arquillian
http://github.com/arquillian
http://github.com/hasalex/arquillian-demo
Lundi 3 octobre
    17h00

soft-shake.ch - Tests d'intégration JavaEE avec Arquillian