extreme Programming Brasil Testes de Integraçã ção J2EE com J2EE em Jakarta C A C T U S argonavis.com.br Helder da Rocha

Documentos relacionados
J820. Testes em J2EE com. Jakarta C A C T U S. argonavis.com.br. Helder da Rocha

J550 Testes em Aplicações Web com Cactus

J820. Testes de interface Web com. HttpUnit. argonavis.com.br. Helder da Rocha

Aplicações Web com Servlets e JSP

São Paulo Maio de argonavis.com.br. Desenvolvimento. testes. guiado por testes. com. Helder da Rocha

J550. Model View Controller

J820. Mock objects. Testes de código com dependências. argonavis.com.br. Helder da Rocha

Enterprise JavaBeansTM

A composição de uma Java Server Pages (Diretivas, Elementos de Script e Objetos Implícitos)

EXERCÍCIOS DE REVISÃO DE CONTEÚDO QUESTÕES DISSERTATIVAS

Java para WEB com Struts 2 e Hibernate

Aplicações Distribuídas

Integração com Banco de Dados

Surgindo em 1997 a API Java Servlet proporciona ao desenvolvedor a possibilidade de adicionar conteúdo dinâmico em um servidor web usando a

Arquitetura de Aplicações JSP/Web. Padrão Arquitetural MVC

JUnit: framework de testes unitários. Fred Lopes

!" # # # $ %!" " & ' ( 2

Desenvolvimento de Sistemas Corporativos Aula 1.5 Introdução a Servlets. Prof. Bruno Moreno

Programação Na Web. Servlets: Como usar as Servlets. Agenda. Template genérico para criar Servlets Servlet 2.4 API

JUnit. Alexandre Menezes Silva Eduardo Manuel de Freitas Jorge

Formação JAVA Web.

J550 JSP com tags padrão

J550 Como criar Custom Tags

Implementar um exemplo de relacionamento entre classes um para muitos (1:N) e um para um (1:1). Sistema para uma Promotora de Evento Agenda Anual

Testes de performance JUnitPerf

Aplicações Distribuídas

JavaScript Fundamental e Servlet Fundamental

J550. Apache Struts. Helder da Rocha

Java II. Sérgio Luiz Ruivace Cerqueira

Java para WEB. Servlets

Aula 7: Servlets (II)

Use a Cabeça! FREEMAN, Eric e Elisabeth. HTML com CSS e XHTML BASHMAN, Brian / SIERRA Kathy / BATES, Bert. Servlets & JSP

Agilizando o processo de redeploy de aplicações Java

Java Server Pages (JSP)

DESENVOLVIMENTO DE SISTEMAS WEB. Lista de Exercícios AV1-01. Luiz Leão

Model-View-Controller (MVC) Fernando de Freitas Silva

Java Server Pages (Diretivas, Elementos de Script e Objetos Implícitos)

Associação Carioca de Ensino Superior Centro Universitário Carioca

Java para Desenvolvimento Web Carga Horária: 40 Horas.

Desenvolvimento Web TCC Turma A-1

SIST706 Sistemas Distribuídos

Prática Sobre Servlets e JSP

Java para Desenvolvimento Web

Programação orientada a objetos

Introdução ao Desenvolvimento de

Arquiteturas de Aplicações Web. Leonardo Gresta Paulino Murta

Aula 5: J2EE Application Assembly Model

PadrãoIX. Módulo II JAVA. Marcio de Carvalho Victorino. Servlets A,L,F,M

DESENVOLVIMENTO DE SISTEMAS WEB. Lista de Exercícios AV2-01. Luiz Leão

Ciclo de vida; Funcionamento; Requisições e Respostas.

Objetivos. Aprender o que são JavaBeans e como podem ser usados em páginas JSPs Usando ações-padrão ao invés de scripts

Programação Web Aula 12 - Java Web Software

Configurando uma aplicação Struts

Curso de Java. Geração de Páginas WEB. TodososdireitosreservadosKlais

João Carlos Pinheiro. Julho / 2004

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

Testes com JUnit. Treinamento ALESP SPL. Danilo Toshiaki Sato.

DESENVOLVIMENTO DE SISTEMAS WEB UNIDADE I Criação de Aplicativos Web. Luiz Leão

INTRODUÇÃO À TECNOLOGIA SERVLETS

PLATAFORMA SIGA RIO DAS VELHAS MANUAL DO CÓDIGO FONTE

Desenvolvimento WEB II. Professora: Kelly de Paula Cunha

Trabalhando com Servlet

Servlets.

Testes Unitários com JUnit

Autenticação e Autorização

JavaServer Pages (JSP) Leonardo Gresta Paulino Murta

Web Browser como o processo cliente. Servidor web com páginas estáticas Vs Aplicações dinâmicas para a Web: HTTP porto 80

JUNIT 28/03/2011. Márcio Delamaro Harry Trinta

Programação Na Web. Servlets: Ciclo de Vida. Agenda. Visão geral sobre ciclo de vida. Nascimento de uma Servlet. Execução de uma Servlet

Frameworks funcionais para JSF que proporciona o desenvolvimento de aplicações computacionais WEB

JSP e Servlet Princípio de MVC

Tutorial TC-23. Implementando. Programming. extreme. em Java. Integraçã testes de unidade CRUISE CONTROL. Helder da Rocha

UNIDADE II JAVA SERVLETS

INTRODUÇÃO À TECNOLOGIA SERVLETS

INE 5612 Professor: Frank Siqueira. Leonardo Silva Jean Ercilio Thiago

CONTEÚDO PROGRAMÁTICO

Continuação... Criando a Interface e adiante

Prof. Roberto Desenvolvimento Web Avançado

Testes com objetos mock. Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Análise e Projeto Orientados a Objetos

Arquitetura de uma Webapp

Injeção de Dependências e Spring

Sistemas Distribuídos Aula 10

JavaTM RMI - Remote Method Invocation

Tutorial Jogo da Velha WEB

Treinamento. Professor: Maurício Giacomini Penteado 1/42

Programação Orientada a Objetos

SERVLETS. Introdução UNIDADED

J550. Sessões. Helder da Rocha

ALUNO: RONI FABIO BANASZEWSKI

1.2- Ambientes de Middleware

Lista de exercícios I - RESPOSTAS Servlets e banco de dados

arquitetura shared-nothing em 3 camadas

Programação WEB (JSP + Banco Dados) Eng. Computação Prof. Rodrigo Rocha

Gerador de código JSP baseado em projeto de banco de dados MySQL

Java II. Sérgio Luiz Ruivace Cerqueira

15/4/15. Processamento Paralelo Middleware Orientado a Objetos. Sistema operacional é a única infraestrutura para interação. Middleware é adicionado

Ant JUnit Qualidade e produtividade em projetos Java

Java na WEB Servlet. Sumário

Transcrição:

extreme Programming Brasil Testes de Integraçã ção J2EE com J2EE em Jakarta C A C T U S Helder da Rocha (helder@acm.org) argonavis.com.br

Objetivos 1. Discutir as dificuldades relativas a testes em J2EE 2. Apresentar o framework Cactus e demonstrar como utilizá-lo para testar aplicações J2EE 3. Mostrar como usar o Cactus com extensões como HttpUnit e JUnitEE para testar servlets e EJBs Público-alvo: Programadores J2EE familiarizados com o JUnit 2

Por que outro framework para testes J2EE? JUnit não é suficiente? Sim, para testes de unidade (lógica de EJBs, por exemplo) Aplicações J2EE possuem muitas dependências (é preciso simular a rede, o servidor, o EJB container, etc.) Testes de unidade não garantem o funcionamento de toda uma aplicação J2EE Mock objects não servem? Sim, mock objects ajudam a testar com dependências e permitem testar toda a aplicação Mock objects podem ficar muito complicados Aplicações geralmente rodam em um servidor de aplicação ou Web - testar a integração da aplicação com o servidor é mais útil e mais fácil 3

O que é Cactus? Um framework que oferece facilidades para testar componentes J2EE Componentes Web (Camada de Controle) Camada EJB (Model) e cliente (View): indiretamente Produto Open Source do projeto Jakarta Metas de curto prazo: testar servlets, JSPs, filtros e EJB Metas de longo prazo: oferecer facilidades para testar todos os componentes J2EE; ser o framework de referência para testes in-container. 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 4

Para que serve? Para testar aplicações que utilizam componentes J2EE Arquitetura MVC Controller Model Servlets, filtros e custom EJBs Servlets Taglibs Remotos tags (Controladores) Classes Classes Filtros Java Java JSPs (camada de apresentação: View, através de controladores) JSP Velocity EJB (Modelo de dados/ XSLT View lógica de negócios) EJBs Locais Cactus testa a integração desses componentes com seus containers não usa stubs - usa o próprio container como servidor e usa JUnit como cliente comunicação é intermediada por um proxy Ilustração: Manual do Cactus 5

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 (XXXRedirector) JUnit envia requisições via HTTP para proxy Proxy devolve resultado via HTTP e JUnit os mostra Há, atualmente (Cactus 1.3) três tipos de proxies: ServletRedirector: para testar servlets JSPRedirector: para testar JSP custom tags FilterRedirector: para testar filtros de servlets 6

Arquitetura Parte da mesma classe (ServletTestCase) é executada no cliente, parte no servidor org.apache.cactus. ServletTestCase MeuServletTestCase request: AbstractHttpServletRequest response: HttpServletResponse config: ServletConfigWrapper... beginxxx(webrequest) setup() testxxx() teardown() endxxx(webresponse) (1) beginxxx() ServletTestCase (10) endxxx() lado cliente (2) (8) (7) (9) lado servidor Redirector Servlet null, no cliente (3) (6) executados apenas no servidor (4) setup() testxxx() teardown() ServletTestCase Classes lado-servidor executados apenas no cliente (5) 7

Fonte: Manual do usuário do Cactus 8 Diagrama UML

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 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. 9

Cactus: exemplo Veja cactusdemo.zip (distribuído com esta palestra) Usa duas classes: um servlet (MapperServlet) e uma classe (SessionMapper) que guarda cada parâmetro como atributo da sessão e em um HashMap - veja fontes em src/xptoolkit/cactus Para rodar, configure o seu ambiente: build.properties - localização dos JARs usados pelo servidor Web (CLASSPATH do servidor) runtests.bat (para Windows) e runtests.sh (para Unix) - localização dos JARs usados pelo JUnit (CLASSPATH do cliente) lib/client.properties (se desejar rodar cliente e servidor em máquinas separadas, troque as ocorrências de localhost pelo nome do servidor) Para montar, execute: 1. ant test-deploy instala cactus-tests.war no tomcat 2. o servidor (Tomcat 4.0 startup) veja demonstração 3. runtests.bat roda os testes no JUnit cactusdemo.zip 10

CactusDemo: servlet O objetivo deste servlet é 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 se <init-param> ALL_CAPS definido no web.xml contiver o valor true public void doget(...) throws IOException { SessionMapper.mapRequestToSession(request); writer.println("<html><body><table border='1'>"); // (... loop for each parameter...) Escreveremos os testes para avaliar esses objetivos Fonte do exemplo: [1] if (useallcaps()) { key = key.touppercase(); val = val.touppercase(); str = "<tr><td><b>"+key+"</b></td><td>"+val+"</td></tr>"; writer.println(str); (2) // (...) writer.println("</table></body></html>"); (1) Grava request em session (3) Retorna true se <init-param> "ALL_CAPS" contiver "true" Trecho de MapperServlet.java 11

MapperServletTest.java CactusDemo: testes public class MapperServletTest extends ServletTestCase { (...) private MapperServlet servlet; public void begindoget(webrequest csidereq) { csidereq.addparameter("user", "Jabberwock"); public void setup() throws ServletException { this.config.setinitparameter("all_caps", "true"); servlet = new MapperServlet(); servlet.init(this.config); public void testdoget() throws IOException { servlet.doget(this.request, this.response); String value = (String) session.getattribute("user"); assertequals("jabberwock", value); public void teardown() { /*... */ Simula DD <init-param> Simula servlet container 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 12

Exemplo: funcionamento Cliente (JUnit) Servidor (Tomcat) begindoget(webrequest req) - Grava parâmetro: nome=user value=jabberwock SUCCESS!! FAIL! falha local falha remota enddoget(webresponse res) - Verifica se resposta contém USER</b></td><td>JABBERWOCK & ReqInfo 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 Output setup() - Define init-params no objeto config - Roda init(config) testdoget() - Roda doget() - Verifica se parâmetro (no response) foi mapeado à sessão teardown() 13

HttpUnit Onde encontrar http://httpunit.sourceforge.net Framework para testes funcionais de interface (teste tipo "caixa-preta") Verifica a resposta de uma aplicação Web ou página HTML É teste funcional caixa-preta (não é "unit") Oferece métodos para "navegar" na resposta links, tabelas, imagens objetos DOM (Node, Element, Attribute) Pode ser combinado com Cactus no endxxx() Argumento com.meterware.httpunit.webresponse Acompanha ServletUnit stub que simula o servlet container veja também httpunitdemo.zip 14

Resumo da API do HttpUnit WebConversation Representa uma sessão de cliente Web (usa cookies) WebConversation wc = new WebConversation(); WebResponse resp = wc.getresponse("http://xyz.com/t.html"); WebRequest Representa uma requisição WebResponse Representa uma resposta. A partir deste objeto pode-se obter objetos WebLink, WebTable e WebForm WebLink Possui métodos para extrair dados de links de hipertexto WebTable Possui métodos para navegar na estrutura de tabelas WebForm Possui métodos para analisar a estrutura de formulários 15

Veja MapperServletTest2.java HttpUnit com Cactus Troque o WebResponse em cada endxxx() por 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!"); 16

Outros testes com Cactus Testes em taglibs (JspRedirector) Veja exemplos em cactusdemo/taglib/src Testes em filtros (FilterRedirector) Usa proxy FilterRedirector Teste básico é verificar se método dofilter() foi chamado Veja exemplos em cactusdemo/src/xptoolkit/authfilter Testes indiretos em páginas JSP (camada View) Ideal é JSP não ter código Java Principais testes são sobre a interface: HttpUnit! Testes indiretos em EJB (camada Model) Indireto, através dos redirectors + JUnitEE Redirectors permitem testar EJBs com interface local ou remota chamados por código no servidor veja taglibdemo.zip veja também strutsdemo.zip veja hellojsp.zip veja helloejb.zip 17

Exemplo de aplicação MVC cmd getcommand(cmd) ControlServlet CommandFactory consulta mapping.xml executa cria Command inclui inclui navbar.html despacha index.html messages.jsp lastmessage.jsp taglib Model View Controller usa cria usa PrintMessagesTag PrintFieldTag MessageBean DefaultCommand NewMessageCommand ShowLastMessageCommand preenche ShowMessagesCommand grava / recupera MessageBeanDAO JAXB (XML) ou BD 18

ControlServletTest: client set up import org.apache.cactus.*; import junit.framework.*;... public class ControlServletTest extends ServletTestCase { private String testmessage = "This is a Web Message."; public void beginservicenewmessage(webrequest clientrequest) { clientrequest.addparameter("cmd", "newmessage"); clientrequest.addparameter("message", testmessage); public void beginserviceshowlastmessage(webrequest clientrequest) { clientrequest.addparameter("cmd", "showlastmessage"); public void beginserviceshowmessages(webrequest clientrequest) { clientrequest.addparameter("cmd", "showallmessages"); public void beginservicedefaultcommand(webrequest clientrequest) { // nothing or unknown command... 19

ControlServletTest: server set up & fixture... private HttpServlet servlet; private String messagedir = "/tmp/test";... public void setup() throws ServletException { config.setinitparameter("mappings-file", "/WEB-INF/mapping.xml"); config.setinitparameter("message-dir", messagedir); servlet = new ControlServlet(); servlet.init(this.config); 20

ControlServletTest: server-side tests... public void _testservice() throws ServletException, IOException { System.out.print("Starting servlet..."); servlet.service(this.request, this.response); System.out.println("Server side testing is done."); public void testservicenewmessage() throws ServletException, IOException { assertequals("newmessage", request.getparameter("cmd")); assertequals(testmessage, request.getparameter("message")); _testservice(); public void testserviceshowlastmessage() throws ServletException,... { assertequals("showlastmessage", request.getparameter("cmd")); _testservice(); public void testserviceshowmessages() throws ServletException,IOException { assertequals("showallmessages", request.getparameter("cmd")); _testservice(); public void testservicedefaultcommand() throws ServletException,... { _testservice();... 21

ControlServletTest: clientp-side response public void endservicenewmessage(com.meterware.httpunit.webresponse clientresponse) throws SAXException, IOException { String pagetitle = clientresponse.gettitle(); asserttrue("wrong page: " + pagetitle, pagetitle.indexof("last Message") >= 0); String responsestring = clientresponse.gettext(); asserttrue("test Message is not in result page!", responsestring.indexof(testmessage) >= 0); public void endserviceshowlastmessage(...)... { String pagetitle = clientresponse.gettitle(); asserttrue("wrong page: " + pagetitle, pagetitle.indexof("last Message") >= 0); public void endserviceshowmessages(...)... { String pagetitle = clientresponse.gettitle(); asserttrue("wrong page: " + pagetitle, pagetitle.indexof("all Messages") >= 0);... 22

PrintMessagesTagTest public class PrintMessagesTagTest extends JspTestCase {... public void testdoafterbody() throws JspException, java.io.ioexception { tag.dostarttag(); bodycontent = pagecontext.pushbody(); tag.setbodycontent(bodycontent); int count = 0; do { bodycontent.print( "<test>"+testbeans[count].getmessage()+"</test>"); assertequals("unexpected contents.", "<test>this is Cactus Test Message number " + (count + 1) + "</test>", tag.getbodycontent().getstring()); count++; while (tag.doafterbody() == tag.eval_body_buffered); pagecontext.popbody(); assertequals(3, count); assertequals("body Content not empty!", "", tag.getbodycontent().getstring().trim()); public void enddoafterbody(webresponse response) { String resultstring = ""; for (int i = 0; i < 3; i++) { resultstring += "<test>this is Cactus Test Message number " + (i + 1) + "</test>"; assertequals(resultstring, response.gettext());... 23

Testes em aplicações Web: conclusões Aplicações Web são difíceis de testar porque dependem da comunicação com servlet containers Stubs, proxies e APIs, que estendem ou cooperam com o JUnit, tornam o trabalho mais fácil Neste bloco, conhecemos três soluções que facilitam testes de unidade, de integração e de caixa-preta em aplicações Web Stubs como ServletUnit permitem testar as unidades de código mesmo que um servidor não esteja presente Proxies como os "redirectors" do Cactus permitem testar a integração da aplicação com o container Uma API, como a fornecida pelo HttpUnit ajuda a testar o funcionamento da aplicação do ponto de vista do usuário 24

Fontes [1] Richard Hightower e Nicholas Lesiecki. Java Tools for extreme Programming. Wiley, 2002. Explora as ferramentas Ant, JUnit, Cactus, JUnitPerf, JMeter, HttpUnit usando estudo de caso com processo XP. [2] Apache Cactus User's Manual. Contém tutorial para instalação passo-a-passo. [3] Mackinnon, Freeman, Craig. Endo-testing with Mock Objects. http://mockobjects.sourceforge.net/misc/mockobjects.pdf. O autor apresenta técnicas para testes usando uma variação da técnica de stubs chamada de "mock objects". 25

Palestra: Cactus helder@argonavis.com.br Selecione o link relativo a esta palestra no endereço /xpbrasil2002 Recursos disponíveis no site: Palestra completa em PDF Todo o código-fonte usado nos exemplos e demonstrações Instruções detalhadas sobre como rodar e instalar os exemplos Links para software utilizado e documentação Tutorial: Implementando extreme Programming em Java XP Brasil 2002, São Paulo 2002, Helder da Rocha