Testes de Integração
com OpenEJB
Gabriel Ozeas Janeiro de 2013
2
MOTIVAÇÃO
Permi(r execução dos app+testes (funcionais, integração e de unidade)
localmente.
JBOSS
Jenkins
localhost
rmi,webservice
FUNCIONAIS
Concorrência entre versões do sistema em QA
Base de dados
MOTIVAÇÃO
3
Focar a execução dos testes em parte do sistema.
Cache Core Config Service Offer
Persistence WebServices Web Admin
Testes
APLICAÇÃO
Código
Deploy
Teste
4
Testes de Integração Focados na comunicação entre componentes e recursos Específicos de um cenário
base de dados
fila de mensagens
A
Teste • Tempo de execução maior que
testes de unidade, entre segundos.
• Usam mesmos mocks, mas mocks de maior tamanho.
Sistema B
(des)MOTIVAÇÃO
5
DEBUG REMOTO
* Quanto menos debug, melhor
Problemas de concorrência no ambiente
OpenEJB
6
§ Desde 1999 § Container EJB leve § Em baixo do guarda-‐chuva da Apache desde 2007 § Suporte a várias versões da especificação EJB
§ 1.1, 2.0, 2.1, 3.0 e parcialmente 3.1 § Suporte a outras especificações como:
§ JAX-‐WS § JMS § JCA
7
OpenEJB Implementação da especificação EJB
presente no Apache Gerônimo
Ajudaram as versões da especificação EJB evoluirem
O Sucesso veio após a especificação 3.0
Possibilitar incluir EJBs em WARs na especificação 3.1
API de container embu(do na versão 3.1
EJBContainer container =javax.ejb.embeddable.EJBContainer.createEJBContainer();
Algumas contribuições Do OpenEJB
Adicionando o OpenEJB
8
<repository> <id>apache.repo</id> <url>hMps://repository.apache.org/content/repositories/releases/</url> </repository>
<dependency> <groupId>org.apache.openejb</groupId> <ar(factId>openejb-‐core-‐hibernate</ar(factId> <type>pom</type> <scope>test</scope> </dependency>
@Test public void askTicketPriceShouldReturn90Cents() throws Excep(on { Context context = new Ini(alContext(); TicketManager ScketManager = (TicketManager) context.lookup(”TicketManagerBeanLocal"); Money money = (cketManager.getPriceForTicket(”uol.(ckets.cloud"); assertEquals("R$ 0.900000", money.toString()); }
Realizando lookup no contexto
<?xml version="1.0" encoding="UTF-‐8"?> <ejb-‐jar />
Injetando componentes
9
@LocalClient public class SimpleTestWithInjec(on { @EJB private TicketManager (cketManager; @Test public void askTicketPriceShouldReturn90Cents() throws Excep(on { Proper(es p = new Proper(es(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.openejb.client.LocalIniHalContextFactory"); Context context = new Ini(alContext(p); context.bind("inject", this); Money money = (cketManager.getPriceForTicket("uol.(ckets.cloud"); assertEquals("R$ 0.900000", money.toString()); } }
src/tests/resources/META-‐INF/ejb-‐jar.xml
Habilita Full-‐Scan no OpenEJB
Permite a criação de qualquer componente dentro do testes: Recursos mais interessantes:
– DataSources – Connec(onFactory – Queue, Topic – Mail Session
Criando recursos dentro dos testes
10
Proper(es p = new Proper(es(); p.put("TechDayJTADataSource", "new://Resource?type=DataSource"); p.put("TechDayJTADataSource.JdbcDriver", "com.mysql.jdbc.Driver"); p.put("TechDayJTADataSource.JdbcUrl", "jdbc:mysql://localhost:3306/techday"); p.put("TechDayJTADataSource.UserName", "root"); p.put("TechDayJTADataSource.JtaManaged", "true");
Proper(es p = new Proper(es(); p.put(”TicketPriceQueue", "new://Resource?type=javax.jms.Queue"); p.put(”TicketPriceQueueResponse", "new://Resource?type=javax.jms.Queue");
O descritor openejb.xml permi(r configurar recursos iniciados junto com o container.
Adicionando recursos via descritor
11
<?xml version="1.0" encoding="UTF-‐8"?> <openejb> <Resource id="TechDayJTADataSource" type="DataSource"> JdbcDriver com.mysql.jdbc.Driver JdbcUrl jdbc:mysql://localhost:3306/techday UserName root JtaManaged true </Resource> </openejb>
Sempre interagir com recursos que possuem estado conhecido.
Persistência dentro dos testes
12
@Before public void setUp() throws Excep(on { Proper(es p = new Proper(es(); p.put("openejb.conf.file", "src/test/resources/openejb.xml"); Context context = new Ini(alContext(p); context.bind("inject", this); transacSonManager.begin(); } @A{er public void tearDown() throws Excep(on { transacSonManager.rollback(); }
Ajuda a focar os testes somente nas classes que importam. Era u(lizado internamente para testes no OpenEJB.
ApplicaSon Composer
13
@LocalClient @RunWith(ApplicaSonComposer.class) public class TicketEn(tyIntegra(onTest { …. @Module public EjbJar modulo() { EjbJar Scket = new EjbJar(”ScketManager"); Scket.addEnterpriseBean(new StatelessBean(TicketManagerBean.class)); return Scket; } @ConfiguraSon public Proper(es config() { Proper(es p = new Proper(es(); p.put("TechDayJTADataSource", "new://Resource?type=DataSource"); p.put("TechDayJTADataSource.JdbcDriver", "com.mysql.jdbc.Driver"); p.put("TechDayJTADataSource.JdbcUrl", "jdbc:mysql://localhost:3306/techday"); p.put("TechDayJTADataSource.UserName", "root"); p.put("TechDayJTADataSource.JtaManaged", "true"); return p; }
DOCUMENTAÇÃO
PROBLEMAS
14
Integração com outras tecnologias além da especificação
PROBLEMAS
15
16
TomEE: CDI, EJB, JPA, JSF, JSP, JSTL, JTA, Servlet, JavaMail, Bean Valida(on TomEE+: TomEE + JAX-‐RS, JAX-‐WS, JMS, Connector (JCA)
JelasSc: primeira empresa de PAAS que uSliza o TomEE
Outras projetos adicionados ao tomcat: AcSveMQ, CXF, MyFaces, OpenJPA, OpenWebBeans
RESULTADO
17
Suite com centenas de testes de integração roda em 1 minuto,
interagindo com DAS e banco.
Permite rodar todos os testes de regressão várias vezes por dia E não somente na fase final da história.
Podemos debugar localmente, interagindo com ambientes de stage e qa
Outra opção
18
Extensões para Jboss Tomcat Glassfish Resin Weld
OSGI CloudBees TomEE Je�y Google AppEngine Spring
Diferenças
19
Ope
nEJB
APP+TESTES Container
Arqu
illian
APP+TESTES
embu(do
Servidor de Aplicação ou Container
copia
20
@RunWith(Arquillian.class) public class GerenciadorReservasTest { @EJB private GerenciadorReservas reservas; @Deployment public sta(c JavaArchive gerandoArquivoDeploy() { JavaArchive arquivo = ShrinkWrap.create(JavaArchive.class); arquivo.addPackages(true, “uol.techday.(cketmanager”); arquivo.addAsManifestResource(EmptyAsset.INSTANCE, ”ejb-‐jar.xml"); return arquivo; } @Test public void reservaDeveGerarCobranca() throws Excep(on { …. }
21
O Arquillian é mais flexível que o OpenEJB
Mas por quê não usamos os Arquillian?
Projeto recente, depedências em ALPHA
Fácil trocar um pelo outro, pois o OpenEJB te obriga a seguir especificação
Obrigado!
22