SlideShare uma empresa Scribd logo
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 (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
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
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
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
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
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
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
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
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
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
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
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
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
Fontes
[1] Richard

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

argonavis.com.br

[2] Apache

Cactus User's Manual.

15
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

Mais conteúdo relacionado

Mais procurados

Java 08
Java 08Java 08
Java 08
samuelthiago
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3
David Ruiz
 
Introdução ao desenvolvimento web com Java
Introdução ao desenvolvimento web com JavaIntrodução ao desenvolvimento web com Java
Introdução ao desenvolvimento web com Java
FellipeFonseca
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
Mario Jorge Pereira
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1
Eduardo Mendes
 
Tutorial +login+mvc
Tutorial +login+mvcTutorial +login+mvc
Tutorial +login+mvc
Diego Feitoza
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITY
raquelcarsi
 
Model View Controller
Model View ControllerModel View Controller
Model View Controller
Denis L Presciliano
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
Helder da Rocha
 
Java 16 Jdbc
Java 16 JdbcJava 16 Jdbc
Java 16 Jdbc
Regis Magalhães
 
Servlets
ServletsServlets
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
slides_teltools
 
Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6
danielfcampos
 
Java Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoJava Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuração
Eduardo Mendes
 
Http Servlet
Http ServletHttp Servlet
Http Servlet
carlos.barros.67
 
Apache Ant
Apache AntApache Ant
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
Denis L Presciliano
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
Guilherme Blanco
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
Guilherme Blanco
 
Build Automation Evolved
Build Automation EvolvedBuild Automation Evolved
Build Automation Evolved
Marcelo Diniz
 

Mais procurados (20)

Java 08
Java 08Java 08
Java 08
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3
 
Introdução ao desenvolvimento web com Java
Introdução ao desenvolvimento web com JavaIntrodução ao desenvolvimento web com Java
Introdução ao desenvolvimento web com Java
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1
 
Tutorial +login+mvc
Tutorial +login+mvcTutorial +login+mvc
Tutorial +login+mvc
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITY
 
Model View Controller
Model View ControllerModel View Controller
Model View Controller
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Java 16 Jdbc
Java 16 JdbcJava 16 Jdbc
Java 16 Jdbc
 
Servlets
ServletsServlets
Servlets
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6Uma abordagem ao Java EE 6
Uma abordagem ao Java EE 6
 
Java Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoJava Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuração
 
Http Servlet
Http ServletHttp Servlet
Http Servlet
 
Apache Ant
Apache AntApache Ant
Apache Ant
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Build Automation Evolved
Build Automation EvolvedBuild Automation Evolved
Build Automation Evolved
 

Semelhante a Cactus - Testes em J2EE com Jakarta Cactus

Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
Elenilson Vieira
 
Curso de Java (Parte 7) Web Application
Curso de Java (Parte 7) Web ApplicationCurso de Java (Parte 7) Web Application
Curso de Java (Parte 7) Web Application
Mario Sergio
 
Apache Struts
Apache StrutsApache Struts
Apache Struts
Denis L Presciliano
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
elliando dias
 
Servlets e jsp
Servlets e jspServlets e jsp
Servlets e jsp
Alan Oliveira
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
Claudio Miranda
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
Rafael Benevides
 
Cactus xp
Cactus xpCactus xp
Cactus xp
rodrigovmoraes
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentes
CI&T
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Loiane Groner
 
Rapid Application Development com Tapestry 5
Rapid Application Development com Tapestry 5Rapid Application Development com Tapestry 5
Rapid Application Development com Tapestry 5
Marcelo Rodrigues
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
Eduardo Mendes
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizados
Diego Santos
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
Eduardo Bregaida
 
J2EE e Datasources
J2EE e DatasourcesJ2EE e Datasources
J2EE e Datasources
Denis L Presciliano
 
Servlet jsp tomcat 8
Servlet jsp tomcat 8Servlet jsp tomcat 8
Servlet jsp tomcat 8
maxrosan
 
Trabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial IiTrabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial Ii
Mateus Ramos Pereira
 
Programação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java WebProgramação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java Web
Alex Camargo
 
Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5
Gilberto Holms
 
Conceitos de Java Web
Conceitos de Java WebConceitos de Java Web
Conceitos de Java Web
Mateus Parente
 

Semelhante a Cactus - Testes em J2EE com Jakarta Cactus (20)

Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
Curso de Java (Parte 7) Web Application
Curso de Java (Parte 7) Web ApplicationCurso de Java (Parte 7) Web Application
Curso de Java (Parte 7) Web Application
 
Apache Struts
Apache StrutsApache Struts
Apache Struts
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
 
Servlets e jsp
Servlets e jspServlets e jsp
Servlets e jsp
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Cactus xp
Cactus xpCactus xp
Cactus xp
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentes
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Rapid Application Development com Tapestry 5
Rapid Application Development com Tapestry 5Rapid Application Development com Tapestry 5
Rapid Application Development com Tapestry 5
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizados
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 
J2EE e Datasources
J2EE e DatasourcesJ2EE e Datasources
J2EE e Datasources
 
Servlet jsp tomcat 8
Servlet jsp tomcat 8Servlet jsp tomcat 8
Servlet jsp tomcat 8
 
Trabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial IiTrabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial Ii
 
Programação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java WebProgramação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java Web
 
Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5
 
Conceitos de Java Web
Conceitos de Java WebConceitos de Java Web
Conceitos de Java Web
 

Mais de Denis L Presciliano

Funmentos de Objetos Remotos
Funmentos de Objetos RemotosFunmentos de Objetos Remotos
Funmentos de Objetos Remotos
Denis L Presciliano
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
Denis L Presciliano
 
Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e applets
Denis L Presciliano
 
Classes internas
Classes internasClasses internas
Classes internas
Denis L Presciliano
 
Entrada e Saída
Entrada e SaídaEntrada e Saída
Entrada e Saída
Denis L Presciliano
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e Strings
Denis L Presciliano
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação Concorrente
Denis L Presciliano
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
Denis L Presciliano
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
Denis L Presciliano
 
Interfaces e Porlimosfismo
Interfaces e PorlimosfismoInterfaces e Porlimosfismo
Interfaces e Porlimosfismo
Denis L Presciliano
 
Reuso com Herança e Composição
Reuso com Herança e ComposiçãoReuso com Herança e Composição
Reuso com Herança e Composição
Denis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
Denis L Presciliano
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
Denis L Presciliano
 
Como criar classes e objetos
Como criar classes e objetosComo criar classes e objetos
Como criar classes e objetos
Denis L Presciliano
 
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoTipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxo
Denis L Presciliano
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2
Denis L Presciliano
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + Ant
Denis L Presciliano
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em Java
Denis L Presciliano
 
Introdução a tecnologia Java
Introdução a tecnologia JavaIntrodução a tecnologia Java
Introdução a tecnologia Java
Denis L Presciliano
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
Denis L Presciliano
 

Mais de Denis L Presciliano (20)

Funmentos de Objetos Remotos
Funmentos de Objetos RemotosFunmentos de Objetos Remotos
Funmentos de Objetos Remotos
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e applets
 
Classes internas
Classes internasClasses internas
Classes internas
 
Entrada e Saída
Entrada e SaídaEntrada e Saída
Entrada e Saída
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e Strings
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação Concorrente
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
 
Interfaces e Porlimosfismo
Interfaces e PorlimosfismoInterfaces e Porlimosfismo
Interfaces e Porlimosfismo
 
Reuso com Herança e Composição
Reuso com Herança e ComposiçãoReuso com Herança e Composição
Reuso com Herança e Composição
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
Como criar classes e objetos
Como criar classes e objetosComo criar classes e objetos
Como criar classes e objetos
 
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoTipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxo
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + Ant
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em Java
 
Introdução a tecnologia Java
Introdução a tecnologia JavaIntrodução a tecnologia Java
Introdução a tecnologia Java
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
 

Cactus - Testes em J2EE com Jakarta Cactus

  • 1. J820 Testes em J2EE com Jakarta CACTUS Helder da Rocha (helder@acm.org) argonavis.com.br
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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