SlideShare uma empresa Scribd logo
1 de 16
Baixar para ler offline
J820

Testes de interface
Web com

HttpUnit

Helder da Rocha (helder@acm.org)

argonavis.com.br
O que é HttpUnit
API Java para comunicação com servidores HTTP
Permite que programas construam e enviem requisições,
e depois recebam e processem respostas
Cria parâmetros de formulários, cria cookies, segue links,
interpreta HTML (tabelas, links, etc.) e realiza outras
tarefas normalmente feitas por browsers

Não é uma ferramenta de testes
argonavis.com.br

É só um cliente HTTP. Pode ser usado com JUnit para
realizar testes em aplicações Web

Testes HttpUnit não são testes de unidade
São testes de interface (funcionais) ou testes de
integração (dependem do servidor)
Não testa JavaScript (use JsUnit: jsunit.sourceforge.net)

2
Como instalar e usar
Onde encontrar
http://httpunit.sourceforge.net

Acrescente Tidy.jar e httpunit.jar no classpath da
aplicação testada
Tidy.jar: monta uma árvore DOM do HTML recebido na
resposta (permite também interpretar página como XML)
httpunit.jar: classes que implementam o cliente HTTP

argonavis.com.br

Importe com.meterware.httpunit.* no TestCase
Operação básica
WebConversation wc = new WebConversation();
WebRequest request =
new GetMethodWebRequest("http://xyz.com/t.html");
WebResponse response = wc.getResponse(request);
String html = response.getText();

3
Principais classes da API do HttpUnit

argonavis.com.br

com.meterware.httpunit.WebConversation

Representa uma sessão de cliente Web (usa cookies e
permite lidar com requisições e respostas HTTP)
com.meterware.httpunit.WebRequest
Representa uma requisição. Permite setar parâmetros
com.meterware.httpunit.WebResponse
Representa uma resposta. A partir deste objeto pode-se
obter objetos WebLink, WebTable e WebForm
com.meterware.httpunit.WebLink
Possui métodos para extrair dados de links de hipertexto
com.meterware.httpunit.WebTable
Possui métodos para navegar na estrutura de tabelas
com.meterware.httpunit.WebForm
Possui métodos para analisar a estrutura de formulários

4
WebConversation, WebRequest, WebResponse
WebRequest pode ser criado de várias formas. Primeiro é preciso
obter uma página. Para isto a melhor solução é usar
GetMethodWebRequest
WebConversation wc = new WebConversation();
WebRequest request =
new GetMethodWebRequest("http://xyz.com/t.html");
WebResponse response = wc.getResponse(request);

argonavis.com.br

Se não for preciso usar o objeto request (para, por exemplo,
acrescentar parâmetros), pode-se utilizar forma mais compacta
WebConversation wc = new WebConversation();
WebResponse response =
wc.getResponse("http://xyz.com/t.html");

Tendo-se uma página pode-se iniciar novas requisições através
de métodos de WebLink e WebForm
5
Testes com HttpUnit
Para usar HttpUnit, importe o pacote com.meterware.httpunit
no TestCase e use asserções normalmente no código
Vários métodos que permitem navegar no HTML retornado apóes
uma requisição podem ser usados para extrair dados testáveis da
resposta para uso nas asserções.
getText() de WebResponse retorna a página inteira. Pode-se fazer
asserções verificando a presença de determinados substrings com
String.indexOf():

argonavis.com.br

assertTrue(resp.getText().indexOf("texto esperado"));

getColumnCount(), getRowCount(), getTableCell() e outros
métodos de WebTable permitem testar tabelas
Métodos de WebForm permitem verificar a existência de objetos de
formulário como botões, conteúdo de caixas de texto, etc.
WebRequest permite ler cookies criados
WebLink permite descobrir a presença de links na página

6
Simulação de cliques em links
Uma vez obtida uma página, pode-se selecionar os
links que ela contém e clicá-los para obter uma
segunda resposta a ser testada

argonavis.com.br

Links podem ser selecionados através do seu conteúdo
através de response.getLinkWith()
Se webConversation.getResponse() receber código 404
uma exceção HttpNotFoundException será provocada
WebConversation wc = new WebConversation();
WebResponse response = wc.getResponse("http://xyz.com/t.html");
WebLink link = response.getLinkWith("resumo");
WebRequest clickResumo = link.getRequest();
try {
WebResponse respResumo = wc.getResponse(clickResumo);
} catch (HttpNotFoundException e) {
fail("Link quebrado! " + e);
}

7
Parâmetros de uma requisição HTTP
Parâmetros são pares nome=valor gerados pelo cliente em links
e formulários. São concatenados em strings separados por &:
nome=Jo%E3o+Grand%E3o&id=agente007&acesso=3

Parâmetros podem ser passados na requisição de duas formas
Se o método HTTP for GET, os parâmetros são passados em uma
única linha no query string, que estende a URL após um "?"
GET /servlet/Teste?id=agente007&acesso=3 HTTP/1.0

argonavis.com.br

Se o método HTTP for POST, os parâmetros são passados como um
stream no corpo na mensagem (o cabeçalho Content-length,
presente em requisições POST informa o tamanho
POST /servlet/Teste HTTP/1.0
Content-length: 21
Content-type: x-www-form-urlencoded
id=agente007&acesso=3

8
Envio de requisições com parâmetros
Parâmetros HTTP podem ser acrescentados em
qualquer requisição através do HTTPUnit
Podem ser incluídos em um acesso via HttpUnit usando
o método setParameter() de WebRequest

argonavis.com.br

Para testar o resultado de uma requisição que recebeu
parâmetro, pode-se usar getText() de WebResponse
para obter o HTML
WebConversation wc = new WebConversation();
WebRequest request =
new GetMethodWebRequest("http://xyz.com/t.html");
request.setParameter("nome", "fulano");
request.setParametro("senha", "F932*xw");
WebResponse response = wc.getResponse(request);
String html = response.getText();
assertFalse(html.indexOf("Acesso Negado"));

9
Formulários
Há vários métodos para manipular formulários. Pode-se
Detectar a presença de objetos de formulários e seu conteúdo
Verificar métodos usados, nome do formulários e outros atributos
Simular o envio clicando no botão submit e obter a resposta

No exemplo abaixo, a página retornada após o envio do
formulário deve conter um campo de texto preenchido com o
valor do parâmetro definido na requisição

argonavis.com.br

WebConversation wc = new WebConversation();
WebResponse response = wc.getResponse("http://xyz.com/t.html");
WebForm form = response.getFormWithID("cadastro");
assertEquals("POST", form.getMethod().toUpperCase());
String campoNome = form.getParameterValue("nome");
assertNotNull(campoNome); // se for null, campo não existe
form.setParameter("nome", "Fulano");
WebRequest request = form.getRequest("botaoEnviar");
WebResponse response = wc.getResponse(request);
assertEquals("Fulano", form.getParameterValue("nome");

10
Testes de tabelas
Há vários métodos para navegar nas células de tabelas

argonavis.com.br

Use métodos das classes WebTable e TableCell
WebConversation wc = new WebConversation();
WebResponse response = wc.getResponse("http://xyz.com/t.html");
WebTable[] tables = response.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!");
}

11
Configuração de proxy
Para realizar testes em um Web site remoto quando as
máquinas de desenvolvimento estiverem atrás de uma
firewall é preciso seter algumas propriedades
proxySet=true
proxyHost=nomeDoHostOuIP
proxyPort=portaDoProxy

Podem ser passadas em linha de comando (usando
"-D"), através do Ant (<jvmargs>) ou pelo código:
argonavis.com.br

System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost","200.9.2.1");
System.getProperties().put("proxyPort", "3831");

12
Exercícios
1. Escreva testes para testar a aplicação Web fornecida

argonavis.com.br

A aplicação recebe parâmetros e grava os dados no
contexto. No final retorna uma página HTML
Rode a aplicação passando parâmetros diferentes e
analise os resultados. Escreva testes com o HttpUnit
que capturem todas as situações possíveis (tabelas, links
e objetos de formulário esperados)

13
Exercícios com aplicações Web
Para compilar aplicações Web é preciso importar os
arquivos da Servlet API
Pode-se usar o JBoss ou o Tomcat

Para usar o JBoss altere os arquivos
build.properties

argonavis.com.br

server.home=c:/jboss-3.2.1/server/default
servlet.jar=${server.home}/lib/javax.servlet.jar
deploy.dir=${server.home}/deploy

No build.xml, é preciso carregar
build.properties
Use

Arquivo necessário
apenas na fase de
compilação

<property file="build.properties" />

14
Fontes
[1] Richard

Hightower e Nicholas Lesiecki. Java Tools for
eXtreme Programming. Wiley, 2002.
Burke & Brian Coyner. Java eXtreme Programming
Cookbook. O'Reilly, 2003

argonavis.com.br

[2] Eric

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

Framework de testes cecom
Framework de testes cecomFramework de testes cecom
Framework de testes cecomlucasbarsand
 
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çãoEduardo Mendes
 
Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2Eduardo Mendes
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Eduardo Mendes
 
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 1Eduardo Mendes
 

Mais procurados (8)

Framework de testes cecom
Framework de testes cecomFramework de testes cecom
Framework de testes cecom
 
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
 
Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2
 
Aplicações web parte 2
Aplicações web parte 2Aplicações web parte 2
Aplicações web parte 2
 
servlet-introducao
servlet-introducaoservlet-introducao
servlet-introducao
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
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
 

Destaque

Destaque (9)

Entrada e Saída
Entrada e SaídaEntrada e Saída
Entrada e Saída
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
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
 
Classes internas
Classes internasClasses internas
Classes internas
 
Um Esforço Combinado Na Padronização
Um Esforço Combinado Na PadronizaçãoUm Esforço Combinado Na Padronização
Um Esforço Combinado Na Padronização
 
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
 
Funmentos de Objetos Remotos
Funmentos de Objetos RemotosFunmentos de Objetos Remotos
Funmentos de Objetos Remotos
 
Teste de Software
Teste de SoftwareTeste de Software
Teste de Software
 

Semelhante a Httpunit - Teste de interface Web com HttpUnit

Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusDenis L Presciliano
 
02 - Fundamentos de Servlets
02 - Fundamentos de Servlets02 - Fundamentos de Servlets
02 - Fundamentos de ServletsMarcio Marinho
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
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
 
Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11Rafael Souza
 
Servlet jsp tomcat 8
Servlet jsp tomcat 8Servlet jsp tomcat 8
Servlet jsp tomcat 8maxrosan
 
Ajax (Asynchronous Javascript And Xml)
Ajax (Asynchronous Javascript And Xml)Ajax (Asynchronous Javascript And Xml)
Ajax (Asynchronous Javascript And Xml)kidh0
 
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EEJavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EERodrigo Cândido da Silva
 
Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1Thyago Maia
 
Aula 01 web server controls
Aula 01   web server controlsAula 01   web server controls
Aula 01 web server controlsGabriel Bugano
 

Semelhante a Httpunit - Teste de interface Web com HttpUnit (20)

Servlets
ServletsServlets
Servlets
 
Curso de Servlets
Curso de ServletsCurso de Servlets
Curso de Servlets
 
servlet-requisicoes
servlet-requisicoesservlet-requisicoes
servlet-requisicoes
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 
02 - Fundamentos de Servlets
02 - Fundamentos de Servlets02 - Fundamentos de Servlets
02 - Fundamentos de Servlets
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
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
 
Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11
 
Servlet jsp tomcat 8
Servlet jsp tomcat 8Servlet jsp tomcat 8
Servlet jsp tomcat 8
 
introdução a ajax
introdução a ajaxintrodução a ajax
introdução a ajax
 
ASP.NET AJAX
ASP.NET AJAXASP.NET AJAX
ASP.NET AJAX
 
Servlets e JSP
Servlets e JSPServlets e JSP
Servlets e JSP
 
o que é ajax
o que é ajaxo que é ajax
o que é ajax
 
Ajax (Asynchronous Javascript And Xml)
Ajax (Asynchronous Javascript And Xml)Ajax (Asynchronous Javascript And Xml)
Ajax (Asynchronous Javascript And Xml)
 
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EEJavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
 
Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1
 
Web services
Web servicesWeb services
Web services
 
Aula 01 web server controls
Aula 01   web server controlsAula 01   web server controls
Aula 01 web server controls
 
API Apontador
API ApontadorAPI Apontador
API Apontador
 
Jdbc e hibernate
Jdbc e hibernateJdbc e hibernate
Jdbc e hibernate
 

Mais de 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çã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
 
Autenticação e Controle de Acesso
Autenticação e Controle de AcessoAutenticação e Controle de Acesso
Autenticação e Controle de AcessoDenis L Presciliano
 

Mais de Denis L Presciliano (20)

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
 
J530 15 workshop
J530 15 workshopJ530 15 workshop
J530 15 workshop
 
J530 14 xdoclet
J530 14 xdocletJ530 14 xdoclet
J530 14 xdoclet
 
Autenticação e Controle de Acesso
Autenticação e Controle de AcessoAutenticação e Controle de Acesso
Autenticação e Controle de Acesso
 
J530 12 transactions
J530 12 transactionsJ530 12 transactions
J530 12 transactions
 
J530 11 relationships
J530 11 relationshipsJ530 11 relationships
J530 11 relationships
 
J530 10 mdb
J530 10 mdbJ530 10 mdb
J530 10 mdb
 
J530 9 jms
J530 9 jmsJ530 9 jms
J530 9 jms
 

Httpunit - Teste de interface Web com HttpUnit

  • 1. J820 Testes de interface Web com HttpUnit Helder da Rocha (helder@acm.org) argonavis.com.br
  • 2. O que é HttpUnit API Java para comunicação com servidores HTTP Permite que programas construam e enviem requisições, e depois recebam e processem respostas Cria parâmetros de formulários, cria cookies, segue links, interpreta HTML (tabelas, links, etc.) e realiza outras tarefas normalmente feitas por browsers Não é uma ferramenta de testes argonavis.com.br É só um cliente HTTP. Pode ser usado com JUnit para realizar testes em aplicações Web Testes HttpUnit não são testes de unidade São testes de interface (funcionais) ou testes de integração (dependem do servidor) Não testa JavaScript (use JsUnit: jsunit.sourceforge.net) 2
  • 3. Como instalar e usar Onde encontrar http://httpunit.sourceforge.net Acrescente Tidy.jar e httpunit.jar no classpath da aplicação testada Tidy.jar: monta uma árvore DOM do HTML recebido na resposta (permite também interpretar página como XML) httpunit.jar: classes que implementam o cliente HTTP argonavis.com.br Importe com.meterware.httpunit.* no TestCase Operação básica WebConversation wc = new WebConversation(); WebRequest request = new GetMethodWebRequest("http://xyz.com/t.html"); WebResponse response = wc.getResponse(request); String html = response.getText(); 3
  • 4. Principais classes da API do HttpUnit argonavis.com.br com.meterware.httpunit.WebConversation Representa uma sessão de cliente Web (usa cookies e permite lidar com requisições e respostas HTTP) com.meterware.httpunit.WebRequest Representa uma requisição. Permite setar parâmetros com.meterware.httpunit.WebResponse Representa uma resposta. A partir deste objeto pode-se obter objetos WebLink, WebTable e WebForm com.meterware.httpunit.WebLink Possui métodos para extrair dados de links de hipertexto com.meterware.httpunit.WebTable Possui métodos para navegar na estrutura de tabelas com.meterware.httpunit.WebForm Possui métodos para analisar a estrutura de formulários 4
  • 5. WebConversation, WebRequest, WebResponse WebRequest pode ser criado de várias formas. Primeiro é preciso obter uma página. Para isto a melhor solução é usar GetMethodWebRequest WebConversation wc = new WebConversation(); WebRequest request = new GetMethodWebRequest("http://xyz.com/t.html"); WebResponse response = wc.getResponse(request); argonavis.com.br Se não for preciso usar o objeto request (para, por exemplo, acrescentar parâmetros), pode-se utilizar forma mais compacta WebConversation wc = new WebConversation(); WebResponse response = wc.getResponse("http://xyz.com/t.html"); Tendo-se uma página pode-se iniciar novas requisições através de métodos de WebLink e WebForm 5
  • 6. Testes com HttpUnit Para usar HttpUnit, importe o pacote com.meterware.httpunit no TestCase e use asserções normalmente no código Vários métodos que permitem navegar no HTML retornado apóes uma requisição podem ser usados para extrair dados testáveis da resposta para uso nas asserções. getText() de WebResponse retorna a página inteira. Pode-se fazer asserções verificando a presença de determinados substrings com String.indexOf(): argonavis.com.br assertTrue(resp.getText().indexOf("texto esperado")); getColumnCount(), getRowCount(), getTableCell() e outros métodos de WebTable permitem testar tabelas Métodos de WebForm permitem verificar a existência de objetos de formulário como botões, conteúdo de caixas de texto, etc. WebRequest permite ler cookies criados WebLink permite descobrir a presença de links na página 6
  • 7. Simulação de cliques em links Uma vez obtida uma página, pode-se selecionar os links que ela contém e clicá-los para obter uma segunda resposta a ser testada argonavis.com.br Links podem ser selecionados através do seu conteúdo através de response.getLinkWith() Se webConversation.getResponse() receber código 404 uma exceção HttpNotFoundException será provocada WebConversation wc = new WebConversation(); WebResponse response = wc.getResponse("http://xyz.com/t.html"); WebLink link = response.getLinkWith("resumo"); WebRequest clickResumo = link.getRequest(); try { WebResponse respResumo = wc.getResponse(clickResumo); } catch (HttpNotFoundException e) { fail("Link quebrado! " + e); } 7
  • 8. Parâmetros de uma requisição HTTP Parâmetros são pares nome=valor gerados pelo cliente em links e formulários. São concatenados em strings separados por &: nome=Jo%E3o+Grand%E3o&id=agente007&acesso=3 Parâmetros podem ser passados na requisição de duas formas Se o método HTTP for GET, os parâmetros são passados em uma única linha no query string, que estende a URL após um "?" GET /servlet/Teste?id=agente007&acesso=3 HTTP/1.0 argonavis.com.br Se o método HTTP for POST, os parâmetros são passados como um stream no corpo na mensagem (o cabeçalho Content-length, presente em requisições POST informa o tamanho POST /servlet/Teste HTTP/1.0 Content-length: 21 Content-type: x-www-form-urlencoded id=agente007&acesso=3 8
  • 9. Envio de requisições com parâmetros Parâmetros HTTP podem ser acrescentados em qualquer requisição através do HTTPUnit Podem ser incluídos em um acesso via HttpUnit usando o método setParameter() de WebRequest argonavis.com.br Para testar o resultado de uma requisição que recebeu parâmetro, pode-se usar getText() de WebResponse para obter o HTML WebConversation wc = new WebConversation(); WebRequest request = new GetMethodWebRequest("http://xyz.com/t.html"); request.setParameter("nome", "fulano"); request.setParametro("senha", "F932*xw"); WebResponse response = wc.getResponse(request); String html = response.getText(); assertFalse(html.indexOf("Acesso Negado")); 9
  • 10. Formulários Há vários métodos para manipular formulários. Pode-se Detectar a presença de objetos de formulários e seu conteúdo Verificar métodos usados, nome do formulários e outros atributos Simular o envio clicando no botão submit e obter a resposta No exemplo abaixo, a página retornada após o envio do formulário deve conter um campo de texto preenchido com o valor do parâmetro definido na requisição argonavis.com.br WebConversation wc = new WebConversation(); WebResponse response = wc.getResponse("http://xyz.com/t.html"); WebForm form = response.getFormWithID("cadastro"); assertEquals("POST", form.getMethod().toUpperCase()); String campoNome = form.getParameterValue("nome"); assertNotNull(campoNome); // se for null, campo não existe form.setParameter("nome", "Fulano"); WebRequest request = form.getRequest("botaoEnviar"); WebResponse response = wc.getResponse(request); assertEquals("Fulano", form.getParameterValue("nome"); 10
  • 11. Testes de tabelas Há vários métodos para navegar nas células de tabelas argonavis.com.br Use métodos das classes WebTable e TableCell WebConversation wc = new WebConversation(); WebResponse response = wc.getResponse("http://xyz.com/t.html"); WebTable[] tables = response.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!"); } 11
  • 12. Configuração de proxy Para realizar testes em um Web site remoto quando as máquinas de desenvolvimento estiverem atrás de uma firewall é preciso seter algumas propriedades proxySet=true proxyHost=nomeDoHostOuIP proxyPort=portaDoProxy Podem ser passadas em linha de comando (usando "-D"), através do Ant (<jvmargs>) ou pelo código: argonavis.com.br System.getProperties().put("proxySet", "true"); System.getProperties().put("proxyHost","200.9.2.1"); System.getProperties().put("proxyPort", "3831"); 12
  • 13. Exercícios 1. Escreva testes para testar a aplicação Web fornecida argonavis.com.br A aplicação recebe parâmetros e grava os dados no contexto. No final retorna uma página HTML Rode a aplicação passando parâmetros diferentes e analise os resultados. Escreva testes com o HttpUnit que capturem todas as situações possíveis (tabelas, links e objetos de formulário esperados) 13
  • 14. Exercícios com aplicações Web Para compilar aplicações Web é preciso importar os arquivos da Servlet API Pode-se usar o JBoss ou o Tomcat Para usar o JBoss altere os arquivos build.properties argonavis.com.br server.home=c:/jboss-3.2.1/server/default servlet.jar=${server.home}/lib/javax.servlet.jar deploy.dir=${server.home}/deploy No build.xml, é preciso carregar build.properties Use Arquivo necessário apenas na fase de compilação <property file="build.properties" /> 14
  • 15. Fontes [1] Richard Hightower e Nicholas Lesiecki. Java Tools for eXtreme Programming. Wiley, 2002. Burke & Brian Coyner. Java eXtreme Programming Cookbook. O'Reilly, 2003 argonavis.com.br [2] Eric 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