Testes integrados com Arquillian e Java
Tags: ptbr, braziliandevs, java, tutorial
Published: 2021-06-16 12:21:53

---
title: Testes integrados com Arquillian e Java
published: true
description: Testes integrados com Arquillian e Java
tags: ptbr, braziliandevs, java, tutorial
cover_image: https://itexto.com.br/wp-content/uploads/2020/05/arquillian.jpg
---
<!-- wp:heading -->
<h2>As Ferramentas da itexto</h2>
<!-- /wp:heading -->

<!-- wp:image {"id":1747,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://www.itexto.com.br/site/wp-content/uploads/2020/05/ferramental.jpg" alt="" class="wp-image-1747"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Este post inicia uma nova série de posts aqui em nosso blog: "As Ferramentas da itexto", na qual iremos esporadicamente apresentar aqui ferramentas que podem fazer <strong>toda</strong> a diferença no dia a dia do desenvolvedor e que muitas vezes são ignoradas pelo público. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Todas as ferramentas aqui listadas são usadas em nosso dia a dia: sendo assim podemos contar a vocês as principais vantagens e, principalmente, desvantagens de cada uma delas.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Naturalmente estes posts irão gerar mais <a href="https://www.itexto.com.br/site/receitas-da-itexto/" class="rank-math-link">receitas</a> para que vocês possam tirar máximo proveito das mesmas. Sendo assim vamos lá!</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>O problema: testar aplicações Java EE ou Servlet based - especialmente projetos pré-existentes</h2>
<!-- /wp:heading -->

<!-- wp:image {"align":"center","id":1748,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.itexto.com.br/site/wp-content/uploads/2020/05/javaee.jpg" alt="" class="wp-image-1748"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Se você desenvolve aplicações Java que são <strong>implantadas em servidores de aplicação ou servlet containers</strong> você tem um problema: como realizar seus testes de integração de uma forma que seja o mais próxima possível do ambiente no qual seu projeto será executado?</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>A solução mais comum consiste na implementação de mocks ou tirando máximo proveito das ferramentas oferecidas pelo seu framework (o Spring, por exemplo, oferece um suporte a testes que é <strong>muito </strong>rico). Outra alternativa interessante é o uso de bibliotecas como <a href="https://site.mockito.org/" class="rank-math-link">Mockito</a>. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>O problema das duas soluções é que elas se <strong>aproximam</strong> do ambiente no qual a aplicação será executada, <strong>mas não são este ambiente</strong>. Não raro em diversas aplicações o servidor de aplicações contém uma série de configurações que influenciam na execução do projeto:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Datasources configurados por JNDI.</li><li>Filas JMS.</li><li>Bibliotecas compartilhadas.</li><li>A configuração dos próprios.</li><li>Mecanismos de autenticação configurados por JAAS.</li><li>Configuração de clusters</li><li>E todos os recursos que seu servidor de aplicações pode oferecer.</li><li>Bundles no caso de containers OSGi.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Pra complicar um pouco mais a vida, talvez você tenha um produto que precise ser implantado em diferentes servidores de aplicação e containers e precise validar todas estas variações. Mocks ajudam, mas não testam a coisa em si ainda. Aliás, olha que interessante o que tá escrito no <a href="http://arquillian.org" class="rank-math-link">site oficial</a> do Arquillian:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1749,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://www.itexto.com.br/site/wp-content/uploads/2020/05/image.png" alt="" class="wp-image-1749"/></figure>
<!-- /wp:image -->

<!-- wp:heading {"level":3} -->
<h3>Projetos legados</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Talvez você tenha pego um projeto pré-existente para evoluir. Não são raros os casos nos quais a execução encontra-se intrinsecamente dependente do servidor de aplicações nos quais o projeto é executado. Pra estes casos Arquillian é uma solução <strong>bem</strong> interessante a ser levada em consideração.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>O Arquillian</h2>
<!-- /wp:heading -->

<!-- wp:image {"align":"center","width":355,"height":132} -->
<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="http://arquillian.org/images/arquillian_logo_200px.png" alt="" width="355" height="132"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Uma solução para os problemas que mencionei acima é o Arquillian: um projeto inicialmente desenvolvido pela JBoss (agora Red Hat). No <a href="http://arquillian.org" class="rank-math-link">site do projeto</a> deixam bem claro seu objetivo: <strong>escrever testes integrados</strong>. E é exatamente isto que ele consegue fazer.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>No caso do Arquillian os testes integrados necessariamente envolvem o carregamento do servidor de aplicações (daqui pra frente quando usar o termo <em>servidor de aplicações</em> entenda que ele embarca também <em>servlet containers</em>). Ele automatiza a execução dos seus testes usando <strong>toda</strong> (ou quase) a infraestrutura do servidor que executará seu projeto:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Os mesmos datasources.</li><li>As filas pré-configuradas.</li><li>Usará as mesmas bibliotecas compartilhadas.</li><li>Se quiser, pode executar inclusive a mesma versão da JVM.</li><li>Enfim: <strong>o mesmo ambiente</strong>.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>O Arquillian cuidará das seguintes ações para você:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Inicialização e finalização do servidor de aplicações.</li><li>Inicialização dos frameworks necessários.</li><li>Enriquecer os testes permitindo a injeção de beans nos mesmos.</li><li>Execução do seu código como cliente (excelente pra testar endpoints JAX-RS, por exemplo)</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Sua execução é bastante simples e pode ser resumida nos passos a seguir:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Inicie o container.</li><li>Empacote o código que será testado e, na sequência, implante-o no container.</li><li>Injete o que for necessário nos testes (os beans) e execute-os.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Pra melhor entender o Arquillian você precisa de alguns conceitos.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Conceitos essenciais</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>O conceito fundamental do Arquillian é que você escreva seus testes contra o ambiente no qual a aplicação é executada, ou seja, com a aplicação já implantada no container.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Sendo assim o que o Arquillian faz essencialmente é empacotar nosso projeto, implantá-lo neste servidor e, na sequência, executar nossos testes contra este ambiente.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>ShrinkWrap</h3>
<!-- /wp:heading -->

<!-- wp:image {"align":"center","width":279,"height":419} -->
<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://images.pexels.com/photos/3927238/pexels-photo-3927238.jpeg?auto=compress&amp;cs=tinysrgb&amp;h=750&amp;w=1260" alt="apresentar, arca, arco" width="279" height="419"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Este é o processo de empacotamento do nosso código. Um dos componentes do Arquillian é o ShrinkWrap, que é o módulo responsável por gerar o pacote que contém o código a ser verificado e o implanta no servidor. Todos os formatos padrão do Java EE são suportados: WAR, EAR e JAR.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>O ShrinkWrap é <strong>muito rápido</strong>: a velocidade na geração deste pacote chega a ser surpreendente. Em nossos testes com sistemas legados costumamos gerar o pacote completo (todas as libs, classes, recursos) para os testes integrados e este processo não costuma levar mais que alguns (realmente alguns) segundos.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>No entanto ele não é feito para que você crie um pacote completo, mas sim um que contenha apenas o que realmente é necessário para a execução dos seus testes. É possível gerar um pacote JAR, por exemplo, contendo um único bean (um único arquivo).</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Container</h3>
<!-- /wp:heading -->

<!-- wp:image {"id":1751,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://www.itexto.com.br/site/wp-content/uploads/2020/05/container.jpg" alt="" class="wp-image-1751"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Consiste no servidor de aplicações ou Servlet Container responsável por executar nossa aplicação. Por padrão o Arquillian não virá com um container pré-definido (ele não tem). Você terá de incluir o container necessário como uma dependência de testes em seu projeto. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Esta "dependência" tem um nome: "<a href="http://arquillian.org/modules/">container adapter</a>". Você pode ver a lista completa de adaptadores neste <a href="http://arquillian.org/modules/" class="rank-math-link">link</a>: mas já adiantando, há adaptadores para o Tomcat, Jetty, Websphere, Wildfly, Weblogic, JBoss, Glassfish e mais alguns outros.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>O container no Arquillian se divide em três categorias:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Embarcado.</li><li>Gerenciado (managed).</li><li>Remoto.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Quando embarcado, o container será iniciado na mesma JVM que nossos testes. É o ideal para ambientes de integração contínua.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>O gerenciado requer que a distribuição do container esteja no mesmo computador que o nosso código fonte. Será criado um novo processo para a JVM que será responsável por iniciar o container, implantar nosso código e, finalmente, executar nossos testes.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Externo ou remoto implica no container em execução em outra máquina (ou na mesma máquina, porém em um processo diferente). Todo o acesso a este container será feito a partir de chamadas de rede.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>A diferença entre o gerenciado e o externo é sutil: o gerenciado é aquele que pode ser iniciado ou finalizado pelo nosso código de teste.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Executor</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>O Arquillian não é dependente de um framework de teste específico. Atualmente oferece suporte a JUnit e TestNG. Sendo assim você mantém todo o seu conhecimento na escrita dos seus testes usando seu framework favorito.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Requisitos para usar o Arquillian</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Ok, você agora tem uma ideia sobre o que o Arquillian pode fazer e quais problemas ele resolve. Do que você precisa para adotá-lo em seus projetos?</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Ferramenta de build</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>O Arquillian pode ser usado com qualquer ferramenta de build <strong>que tenha gestão de dependências</strong>. A documentação oficial está focada em Maven, mas você pode usar o Gradle também se quiser.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Se você estiver na situação em que precise testar sua aplicação contra diferentes containers, recomendo uma ferramenta de build que possua o recurso de perfis (profiles), tal como o Maven. Isto lhe permitirá carregar as dependências necessárias para cada situação de acordo com a configuração desejada.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>JDK</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Há suporte para a versão 1.6 ou posterior do Java. Lembra quando disse que é uma ferramenta excelente para se aplicar a sistemas legados? Na página de módulos do Arquillian que lista os container adapters você verá alguns containers bem antigos (Tomcat 5, por exemplo).</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Framework de testes</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Tal como mencionado acima, você pode usar tanto JUnit quanto TestNG.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>O Container a ser gerenciado</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Finalmente, você precisará ter acesso ao container que será o responsável pela execução dos seus testes. Caso não tenha acesso ao container em si, verifique as opções de container embarcados disponíveis no site oficial do projeto neste <a href="http://arquillian.org/modules/" class="rank-math-link">link</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Vantagens e desvantagens</h2>
<!-- /wp:heading -->

<!-- wp:image {"align":"center","id":1754,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.itexto.com.br/site/wp-content/uploads/2020/05/balanca.jpg" alt="" class="wp-image-1754"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Será que o Arquillian se aplica ao seu projeto? É importante primeiro entender a natureza do mesmo.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Vantagens</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>A principal vantagem do Arquillian é o fato de termos nossos testes executados contra o ambiente <strong>real</strong> no qual o sistema será implantado. Isto permite à equipe compreender muito melhor as entranhas destes ambientes de execução.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Outra vantagem muito interessante é o fato de não haver mudanças significativas no seu fluxo de trabalho: você continuará usando sua IDE de preferência tal como faz hoje. É possível depurar seus testes tal como faz hoje: não muda coisa alguma, a não ser algumas anotações que você aprenderá em posts futuros.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>A velocidade na execução também é surpreendente: a primeira coisa que você pensa ao ser apresentado ao Arquillian é que consiste em uma ferramenta lenta pelo trabalho que realiza. Não é o caso.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>No caso de projetos legados baseados em Java eu diria que seu uso no primeiro momento pode ser essencial, dado que o tempo que você gastaria levantando mocks pode ser proibitivo. Especialmente em casos nos quais exista o uso pesado de JNDI para obter recursos do sistema, tal como datasources e fontes externas de autenticação baseada em JAAS.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Desvantagens</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Servidores de aplicação e Servlet Containers pouco a pouco estão perdendo a relevância no desenvolvimento de novos projetos. Cada vez usa-se menos os recursos disponibilizados por estas ferramentas, tais como os datasources obtidos por JNDI, por exemplo.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Sendo assim, se for para pensar em adotar o Arquillian, deve-se ter a <strong>certeza</strong> de que seu projeto será aplicado neste tipo de ambiente. Sinceramente não vemos muito sentido em sua adoção em projetos que fujam deste perfil neste momento.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Outro fator a ser levado em consideração é o fato do projeto ter perdido o gás nos últimos anos. No momento da escrita deste post o último post em seu blog é de junho de 2018 (estamos em maio de 2020). </p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1753,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://www.itexto.com.br/site/wp-content/uploads/2020/05/image-1.png" alt="" class="wp-image-1753"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Isto não quer dizer que o projeto esteja morto, apenas que não é mais tão vibrante quanto antes. Os últimos commits até a escrita deste blog no módulo Core, do projeto, por exemplo, são de <a href="https://github.com/arquillian/arquillian-core/commits/master" class="rank-math-link">20 de abril</a> no GitHub.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Sua aplicação em projetos também pode ser um pouco mais trabalhosa que o esperado. Isto em parte se deve à própria documentação do Arquillian. </p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Para saber mais</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Este é o nosso primeiro post sobre o Arquillian aqui no site da itexto. Em breve publicaremos também algumas receitas ensinando a aplicá-lo em seus projetos e a como executar tarefas importantes com ele. Esperamos que este conhecimento lhes seja útil.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Mas enquanto isto, você pode aprender mais sobre o projeto nestes links:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Site oficial - <a href="http://arquillian.org" class="rank-math-link">http://arquillian.org</a>  (notou que não é HTTPS?)</li><li>Os guias oficiais - siga do início ao fim para aprender direito seu uso - <a href="http://arquillian.org/guides/">http://arquillian.org/guides/</a> </li><li>A lista de módulos que contém extensões ao Arquillian e também a lista de container adapters - <a href="http://arquillian.org/modules/">http://arquillian.org/modules/</a> </li><li>A nova documentação oficial - <a href="http://arquillian.org/arquillian-core/">http://arquillian.org/arquillian-core/</a> </li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Até os próximos posts!</p>
<!-- /wp:paragraph -->