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

  • 205 views
Uploaded on

Apresentação sobre testes de integração com o OpenEJB

Apresentação sobre testes de integração com o OpenEJB

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
205
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
3
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Testes  de  Integração    com  OpenEJB  Gabriel OzeasJaneiro de 2013
  • 2. MOTIVAÇÃO   Permi(r  execução  dos  app+testes   (funcionais,  integração  e  de  unidade)     localmente.   FUNCIONAIS   Jenkins   rmi,webservice   JBOSS   localhost   Base  de  dados   Concorrência  entre  versões  do  sistema  em  QA   2  
  • 3. MOTIVAÇÃO   Focar  a  execução  dos  testes  em  parte  do  sistema.   APLICAÇÃO   Cache   Core   Config   Service   Offer   Persistence   WebServices   Web   Admin   Teste   Código   Testes   Deploy   3  
  • 4. Testes  de  Integração    Focados  na  comunicação  entre  componentes  e  recursos    Específicos  de  um  cenário   Sistema   B   A   fila  de  mensagens   Teste   •  Tempo  de  execução  maior  que   base  de   testes  de  unidade,  entre   dados   segundos.     •  Usam  mesmos  mocks,  mas   mocks  de  maior  tamanho.     4  
  • 5. (des)MOTIVAÇÃO   DEBUG  REMOTO   Problemas  de  concorrência  no  ambiente   *  Quanto  menos  debug,  melhor   5  
  • 6. OpenEJB  §  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   6  
  • 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  Algumas  contribuições   Do  OpenEJB   API  de  container  embu(do  na  versão  3.1   EJBContainer  container  =javax.ejb.embeddable.EJBContainer.createEJBContainer();   7  
  • 8. Adicionando  o  OpenEJB   <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>  Realizando  lookup  no  contexto    @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());  }   8  
  • 9. Injetando  componentes  @LocalClient   src/tests/resources/META-­‐INF/ejb-­‐jar.xml  public  class  SimpleTestWithInjec(on  {   <?xml  version="1.0"  encoding="UTF-­‐8"?>   <ejb-­‐jar  />                    @EJB   Habilita  Full-­‐Scan  no  OpenEJB          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());          }  }   9  
  • 10. Criando  recursos  dentro  dos  testes  Permite  a  criação  de  qualquer  componente  dentro  do  testes:  Recursos  mais  interessantes:   –  DataSources   –  Connec(onFactory   –  Queue,  Topic   –  Mail  Session                    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");   10  
  • 11. Adicionando  recursos  via  descritor  O  descritor  openejb.xml  permi(r  configurar  recursos  iniciados  junto  com  o  container.   <?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>   11  
  • 12. Persistência  dentro  dos  testes  Sempre  interagir  com  recursos  que  possuem  estado  conhecido.          @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();          }   12  
  • 13. ApplicaSon  Composer  Ajuda  a  focar  os  testes  somente  nas  classes  que  importam.  Era  u(lizado  internamente  para  testes  no  OpenEJB.   @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;          }   13  
  • 14. PROBLEMAS   DOCUMENTAÇÃO   14  
  • 15. PROBLEMAS   Integração  com  outras  tecnologias  além  da  especificação   15  
  • 16. TomEE:  CDI,  EJB,  JPA,  JSF,  JSP,  JSTL,  JTA,                                  Servlet,  JavaMail,                                  Bean  Valida(on     TomEE+:  TomEE  +  JAX-­‐RS,  JAX-­‐WS,  JMS,                                      Connector  (JCA)    Outras  projetos  adicionados  ao  tomcat:    AcSveMQ,  CXF,  MyFaces,  OpenJPA,  OpenWebBeans  JelasSc:  primeira  empresa  de  PAAS  que  uSliza  o  TomEE     16  
  • 17. RESULTADO   Suite  com  centenas  de  testes  de  integração     roda  em  1  minuto,     interagindo  com  DAS  e  banco.   Podemos  debugar  localmente,  interagindo   com  ambientes  de  stage  e  qa   Permite  rodar  todos  os  testes  de  regressão  várias  vezes  por  dia   E  não  somente  na  fase  final  da  história.   17  
  • 18. Outra  opção  Extensões  para  Jboss   OSGI  Tomcat   CloudBees  Glassfish   TomEE  Resin   Je€y   Google  AppEngine    Weld   Spring     18  
  • 19. Diferenças   OpenEJB   embu(do   APP+TESTES   Container   copia   Arquillian   Servidor  de  Aplicação     APP+TESTES   ou  Container   19  
  • 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  {                  ….          }   20  
  • 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   21  
  • 22. Obrigado!   22