SlideShare une entreprise Scribd logo
1  sur  16
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Tendances (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
 

Similaire à 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 WebElenilson 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 ApplicationMario Sergio
 
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 webelliando dias
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
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 componentesCI&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 EELoiane Groner
 
Rapid Application Development com Tapestry 5
Rapid Application Development com Tapestry 5Rapid Application Development com Tapestry 5
Rapid Application Development com Tapestry 5Marcelo 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 ServletsEduardo 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 automatizadosDiego Santos
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer FacesEduardo Bregaida
 
Servlet jsp tomcat 8
Servlet jsp tomcat 8Servlet jsp tomcat 8
Servlet jsp tomcat 8maxrosan
 
Trabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial IiTrabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial IiMateus 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 WebAlex Camargo
 
Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Gilberto Holms
 

Similaire à 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
 

Plus de 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 appletsDenis L Presciliano
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsDenis L Presciliano
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteDenis 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çãoDenis 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 AntDenis 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 fluxoDenis 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 2Denis L Presciliano
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntDenis 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 JavaDenis L Presciliano
 

Plus 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
 

Dernier

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx2m Assessoria
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 

Dernier (9)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

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