UOL Tech Day: Testes de Integração com OpenEJB

22
Testes de Integração com OpenEJB Gabriel Ozeas Janeiro de 2013

Transcript of UOL Tech Day: Testes de Integração com OpenEJB

Page 1: UOL Tech Day: Testes de Integração com OpenEJB

Testes  de  Integração    

com  OpenEJB  

Gabriel Ozeas Janeiro de 2013

Page 2: UOL Tech Day: Testes de Integração com OpenEJB

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  

Page 3: UOL Tech Day: Testes de Integração com OpenEJB

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  

Page 4: UOL Tech Day: Testes de Integração com OpenEJB

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  

Page 5: UOL Tech Day: Testes de Integração com OpenEJB

(des)MOTIVAÇÃO  

5  

DEBUG  REMOTO  

*  Quanto  menos  debug,  melhor  

Problemas  de  concorrência  no  ambiente  

Page 6: UOL Tech Day: Testes de Integração com OpenEJB

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  

Page 7: UOL Tech Day: Testes de Integração com OpenEJB

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  

Page 8: UOL Tech Day: Testes de Integração com 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  

Page 9: UOL Tech Day: Testes de Integração com OpenEJB

<?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  

Page 10: UOL Tech Day: Testes de Integração com 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");  

Page 11: UOL Tech Day: Testes de Integração com OpenEJB

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>  

Page 12: UOL Tech Day: Testes de Integração com 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();          }  

Page 13: UOL Tech Day: Testes de Integração com OpenEJB

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;          }  

Page 14: UOL Tech Day: Testes de Integração com OpenEJB

DOCUMENTAÇÃO  

PROBLEMAS  

14  

Page 15: UOL Tech Day: Testes de Integração com OpenEJB

Integração  com  outras  tecnologias  além  da  especificação  

PROBLEMAS  

15  

Page 16: UOL Tech Day: Testes de Integração com OpenEJB

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  

Page 17: UOL Tech Day: Testes de Integração com OpenEJB

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  

Page 18: UOL Tech Day: Testes de Integração com OpenEJB

Outra  opção  

18  

Extensões  para  Jboss  Tomcat  Glassfish  Resin  Weld  

OSGI  CloudBees  TomEE  Je�y  Google  AppEngine    Spring    

Page 19: UOL Tech Day: Testes de Integração com OpenEJB

Diferenças  

19  

Ope

nEJB  

APP+TESTES   Container  

Arqu

illian  

APP+TESTES  

embu(do  

Servidor  de  Aplicação    ou  Container  

copia  

Page 20: UOL Tech Day: Testes de Integração com OpenEJB

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  {                  ….          }  

Page 21: UOL Tech Day: Testes de Integração com OpenEJB

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  

Page 22: UOL Tech Day: Testes de Integração com OpenEJB

Obrigado!  

22