Arquillian
Ippevent 19/01/2012




                Alexis Hassler
Arquillian
@AlexisHassler
JavaEE


JAX-WS     JAX-RS   JPA



Servlet
            EJB     JNDI

 JSP

            CDI     JMS
 JSF
Tests

Unitaire           Intégration
Test unitaire




 ClassToBeTested
Test unitaire




       new


       mock
✔   EJB
Test d'intégration




              EjbToBeTested
                 Sécurité
Transaction                   Intercepteurs
                       ...
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èmes

1 conteneur par technologie
–   Pas de mode embarqué universel

Configurations spécifiques

Mode remote + Maven
–   pas dans le cycle de vie standard
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 les classes isolées
    pas toute l'application
Mettre les

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


@RunWith(Arquillian.class)

@Deployment

@EJB, @Inject, @Resource

@Test
✔   EJB / OpenEJB
addAsManifestResource
Conteneurs

         Websphere
WebLogic      JBoss AS   Cloudbees
 Resin     Glassfish         OpenShift

                              Weld
           Jetty              OpenWebBeans
           Tomcat
                            OpenEJB
Conteneurs




             DeployableContainer
Arquillian                         Conteneur
Conteneurs

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
✔   EJB / JBoss AS 7 managed
    ✔   EJB / JBoss AS 7 remote
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 servletURL ;

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

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

Utilisable pour du test fonctionnel
– Selenium

– HtmlUnit

– HttpUnit

– ...
✔   JAX-RS / JBoss AS 7 managed
Extensions


                 Seam 2

  Performance               Persistence

Selenium                         Byteman

 JBehave                          Jacoco

     JSFUnit    JUnit   TestNG   Spock
Extensions

    Intégration sélénium

@RunWith(Arquillian.class)
public class BasicClientTest {

    @Drone DefaultSelenium browser;

    @Test
    public void testLoginAndLogout() {
      browser.open(deploymentUrl + "home.jsp");
      ...
    }
}
Extensions


                  Deployable Container

                      Test Enricher

                Auxilliary Archive Appender
                                    Application
                Archive Processor     Auxiliary
                                      Protocol

                  Deployment Packager

container
Extensions maison




        FW
         +
        NAT
Extensions maison


ProtocolMetaData

               HTTPContext

                             Server Address




                              FW Address
✔   NATExtension
Arquillian

Test d'intégration

In-container / As-client

Multi-conteneurs

Extensible
Références

http://jboss.org/arquillian
http://github.com/arquillian


http://github.com/hasalex/arquillian-demo
http://slideshare.com/sewatech

Arquillian - Ippevent 01/2012