J820

Testes em J2EE com
Jakarta

CACTUS

Helder da Rocha (helder@acm.org)

argonavis.com.br
Cactus: framework para J2EE
Testa componentes J2EE no próprio container
Componentes Web (Camada de Controle)
Camada EJB (M...
Para que serve?

argonavis.com.br

Use Cactus para testar a integração de aplicações Web
(servlets, JSP, filtros) e aplica...
Como funciona?
Cactus utiliza os test cases simultaneamente no
cliente e no servidor: duas cópias
Uma cópia é instanciada ...
Arquitetura
Parte da mesma classe (ServletTestCase) é executada
no cliente, parte no servidor
(4) setUp()
org.apache.cactu...
ServletTestCase (ou similar)
Para cada método XXX() a ser testado, pode haver:

Um beginXXX(), para inicializar a requisiç...
O objetivo deste servlet é

argonavis.com.br

1) gravar qualquer parâmetro que receber na sessão (objeto session)
2) devol...
MapperServletTest.java

Testes com o Cactus

public class MeuServletTest extends ServletTestCase { (...)
private MeuServle...
Exemplo: funcionamento
Cliente (JUnit)

Servidor (Tomcat)

beginDoGet(WebRequest req)
- Grava parâmetro:
nome=user
value=J...
HttpUnit com Cactus
Troque o WebResponse em cada endXXX() por

argonavis.com.br

com.meterware.httpunit.WebResponse
public...
Para testar EJBs
Não é necessário usar Cactus. EJBs podem ser testados
a partir do cliente, usando suas interfaces remotas...
Componentes EJB
Servlets e JSPs podem se comunicar com EJBs da aplicação
declarando uma referência associada ao bean chama...
Testes em EJBs locais
Uma vez obtida a referência local para o EJB, seus
métodos podem ser testados dentro do container da...
Exercícios

argonavis.com.br

1. Execute os exemplos
2. Escreva testes para testar a aplicação Web
fornecida
O ambiente es...
Fontes
[1] Richard

Hightower e Nicholas Lesiecki. Java Tools for
eXtreme Programming. Wiley, 2002.

argonavis.com.br

[2]...
Curso J820
Produtividade e Qualidade em Java:
Ferramentas e Metodologias
Revisão 1.1

© 2002, 2003, Helder da Rocha
(helde...
Próximos SlideShares
Carregando em…5
×

Cactus - Testes em J2EE com Jakarta Cactus

275 visualizações

Publicada em

Aqui são apresentados as técnicas de Desenvolvimento com Jakarta Cactus.
/**Depois que entrei no mundo Java, começei a procurar por conteúdo na internet para estudar, então me deparei com um ótimo site, http://www.argonavis.com.br, de um grande cara chamado Helder Rocha, que disponibiliza este mesmo conteúdo em seu site também. Obrigado pela ajuda a comunidade.*/

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
275
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
11
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Cactus - Testes em J2EE com Jakarta Cactus

  1. 1. J820 Testes em J2EE com Jakarta CACTUS Helder da Rocha (helder@acm.org) argonavis.com.br
  2. 2. Cactus: framework para J2EE Testa componentes J2EE no próprio container Componentes Web (Camada de Controle) Camada EJB (Model) e cliente (View): indiretamente Cactus estende o JUnit framework Execução dos testes é realizada de forma idêntica TestCases são construídos sobre uma subclasse de junit.framework.TestCase argonavis.com.br Por que usar? Para testes de integração (JUnit testa lógica local) Aplicações J2EE possuem muitas dependências (é preciso simular a rede, o servidor, o EJB container, etc.) Mock objects podem ficar muito complicados Testar a integração com o servidor pode ser mais fácil 2
  3. 3. Para que serve? argonavis.com.br Use Cactus para testar a integração de aplicações Web (servlets, JSP, filtros) e aplicações EJB com o container Controller Model Arquitetura do Cactus M: EJB (Modelo de dados/ lógica de negócios) V: JSPs (camada de apresentação: View, através de controladores) C: Servlets, filtros e custom tags (Controladores) Servlets Taglibs EJBs Remotos Filtros Classes Java Classes Java JSP EJBs Locais Velocity XSLT View Se não precisar testar a integração, use JUnit Pode-se usar ambos em conjunto, uma vez que Cactus é extensão do JUnit e usa a mesma interface Ilustração: Manual do Cactus 3
  4. 4. Como funciona? Cactus utiliza os test cases simultaneamente no cliente e no servidor: duas cópias Uma cópia é instanciada pelo servlet container Outra cópia é instanciada pelo JUnit Comunicação com o servlet container é feita através de um proxy (Redirector) argonavis.com.br JUnit envia requisições via HTTP para proxy Proxy devolve resultado via HTTP e TestRunner mostra Há três tipos de proxies: ServletRedirector: para testar servlets JSPRedirector: para testar JSP custom tags FilterRedirector: para testar filtros de servlets 4
  5. 5. Arquitetura Parte da mesma classe (ServletTestCase) é executada no cliente, parte no servidor (4) setUp() org.apache.cactus. ServletTestCase (1) beginXXX() testXXX() tearDown() (2) (8) ServletTestCase MeuServletTestCase argonavis.com.br request: AbstractHttpServletRequest response: HttpServletResponse config: ServletConfigWrapper ... beginXXX(WebRequest) setUp() testXXX() tearDown() endXXX(WebResponse) (10) endXXX() (7) (9) Redirector Servlet (3) ServletTestCase (6) (5) lado cliente lado servidor encapsulam objetos no servidor. São null, no cliente Classes lado-servidor executados apenas no servidor executados apenas no cliente 5
  6. 6. ServletTestCase (ou similar) Para cada método XXX() a ser testado, pode haver: Um beginXXX(), para inicializar a requisição do cliente Encapsulada em um objeto WebRequest a ser enviado ao servidor Um testXXX(), para testar o funcionamento do método no servidor (deve haver ao menos um) Um endXXX(), para verificar a resposta do servidor Devolvida em um objeto WebResponse retornada pelo servidor argonavis.com.br Além desses três métodos, cada TestCase pode conter setUp(), opcional, para inicializar objetos no servidor tearDown(), opcional, para liberar recursos no servidor Os métodos do lado do servidor têm acesso aos mesmos objetos implícitos disponíveis em um servlet ou página JSP: request, response, etc. 6
  7. 7. O objetivo deste servlet é argonavis.com.br 1) gravar qualquer parâmetro que receber na sessão (objeto session) 2) devolver uma página contendo os pares nome/valor em uma tabela 3) imprimir resposta em caixa-alta public void doGet(...) throws IOException { Enumeration e = request.getParameterNames(); HttpSession s = request.getSession(); (1) Grava request while (e.hasMoreElements()) { em session String param = (String)e.nextElement(); s.setAttribute(param, request.getParameter(param)); } writer.println("<html><body><table border='1'>"); String str = ""; (3) Transforma while(e.hasMoreElements()) { nome e valor String param = (String)e.nextElement(); para caixa-alta key = param.toUpperCase(); val = request.getParameter(param).toUpperCase(); } str = "<tr><td><b>"+key+"</b></td><td>"+val+"</td></tr>"; } writer.println(str); writer.println("</table></body></html>"); (2) Devolve tabela [1] Fonte do exemplo: } 7
  8. 8. MapperServletTest.java Testes com o Cactus public class MeuServletTest extends ServletTestCase { (...) private MeuServlet servlet; public void beginDoGet(WebRequest cSideReq) { cSideReq.addParameter("user", "Jabberwock"); } argonavis.com.br public void setUp() throws ServletException { servlet = new MeuServlet(); servlet.init(this.config); Simula servlet } container public void testDoGet() throws IOException { servlet.doGet(this.request, this.response); String value = (String) session.getAttribute("user"); assertEquals("Jabberwock", value); Verifica se parâmetro foi } mapeado à sessão public void endDoGet(WebResponse cSideResponse) { String str = cSideResponse.getText(); assertTrue(str.indexOf("USER</b></td><td>JABBERWOCK") > -1); } } Verifica se parâmetro aparece na tabela HTML e em maiúsculas 8
  9. 9. Exemplo: funcionamento Cliente (JUnit) Servidor (Tomcat) beginDoGet(WebRequest req) - Grava parâmetro: nome=user value=Jabberwock argonavis.com.br SUCCESS!! FAIL! falha local falha remota & endDoGet(WebResponse res) - Verifica se resposta contém USER</b></td><td>JABBERWOCK ReqInfo setUp() 2 conexões HTTP: • Uma p/ rodar os testes e obter saida do servlet • Outra para esperar resultados de testes (info sobre exceções) TestInfo - Define init-params no objeto config - Roda init(config) testDoGet() - Roda doGet() - Verifica se parâmetro (no response) foi mapeado à sessão tearDown() Output 9
  10. 10. HttpUnit com Cactus Troque o WebResponse em cada endXXX() por argonavis.com.br com.meterware.httpunit.WebResponse public void endDoGet(com.meterware.httpunit.WebResponse resp) throws org.xml.sax.SAXException { WebTable[] tables = resp.getTables(); assertNotNull(tables); assertEquals(tables.length, 1); // só há uma tabela WebTable table = tables[0]; int rows = table.getRowCount(); boolean keyDefined = false; for (int i = 0; i < rows; i++) { String key = table.getCellAsText(i, 0); // col 1 String value = table.getCellAsText(i, 1); // col 2 if (key.equals("USER")) { keyDefined = true; assertEquals("JABBERWOCK", value); } } if (!keyDefined) { fail("No key named USER was found!"); } } 10
  11. 11. Para testar EJBs Não é necessário usar Cactus. EJBs podem ser testados a partir do cliente, usando suas interfaces remotas Teste de unidade simples usando JUnit Possível para beans que tenham interfaces remotas argonavis.com.br Cactus é útil para testar EJBs através de suas interfaces locais, já que roda dentro do container Ideal para testar Entity Beans que geralmente não possuem interfaces remotas Permite também testar objetos que rodam no servidor e são inaccessíveis aos clientes (DAOs, Service Locators) Cactus testa a integração de EJBs com o Container Aplicação usa referências java:comp/env para ter acesso ao bean (precisam ser declaradas em web.xml) 11
  12. 12. Componentes EJB Servlets e JSPs podem se comunicar com EJBs da aplicação declarando uma referência associada ao bean chamado A referência deve informar o tipo do bean (Session, Entity ou MessageDriven e suas interfaces remota e home. argonavis.com.br <ejb-local-ref> <description>Cruise ship cabin</description> <ejb-ref-name>ejb/Cabin</ejb-ref-name> <ejb-ref-type>Entity</ejb-ref-type> <local-home>com.titan.cabin.CabinHome</local-home> <local>com.titan.cabin.Cabin</local> </ejb-local-ref> Componentes EJB locais não são objetos remotos RMI-IIOP. Para obter sua referência no ServletTestCase use JNDI (javax.naming): InitialContext initCtx = new InitialContext(); Object ref = initCtx.lookup("java:comp/env/ejb/CabinHome"); CabinHome home = (CabinHome) ref; 12
  13. 13. Testes em EJBs locais Uma vez obtida a referência local para o EJB, seus métodos podem ser testados dentro do container da maneira convencional argonavis.com.br Cabin cabin = home.findByPrimaryKey("311"); String number = cabin.getNumber(); assertEquals("311", number); Não interessa se a implementação de persistência usada é BMP ou CMP Uma vantagem do Cactus é a possibilidade de testar relacionamentos CMR, impossíveis remotamente Collection cabins = home.findByShip("Titanic"); ... 13
  14. 14. Exercícios argonavis.com.br 1. Execute os exemplos 2. Escreva testes para testar a aplicação Web fornecida O ambiente está configurado (use o Ant) Guie-se pelos comentários no código A aplicação recebe parâmetros e grava os dados no contexto. No final retorna uma página HTML Rode a aplicação. Escreva testes para verificar sua interface e para testar se os dados passados como parâmetros foram gravados no contexto. Use Cactus apenas onde for necessário (use test cases normais do JUnit para outros testes) 14
  15. 15. Fontes [1] Richard Hightower e Nicholas Lesiecki. Java Tools for eXtreme Programming. Wiley, 2002. argonavis.com.br [2] Apache Cactus User's Manual. 15
  16. 16. Curso J820 Produtividade e Qualidade em Java: Ferramentas e Metodologias Revisão 1.1 © 2002, 2003, Helder da Rocha (helder@acm.org) argonavis.com.br

×