Httpunit - Teste de interface Web com HttpUnit
-
Upload
denis-l-presciliano -
Category
Technology
-
view
95 -
download
0
description
Transcript of Httpunit - Teste de interface Web com HttpUnit
Testes de interface Web com
HttpUnit
Testes de interface Web com
HttpUnit
J820
Helder da Rocha ([email protected]) argonavis.com.br
2argo
navis
.com
.br
O que é HttpUnit
API Java para comunicação com servidores HTTPPermite que programas construam e enviem requisições, e depois recebam e processem respostasCria 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É só um cliente HTTP. Pode ser usado com JUnit para realizar testes em aplicações Web
Testes HttpUnit não são testes de unidadeSão testes de interface (funcionais) ou testes de integração (dependem do servidor)Não testa JavaScript (use JsUnit: jsunit.sourceforge.net)
3argo
navis
.com
.br
Onde encontrarhttp://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
Importe com.meterware.httpunit.* no TestCaseOperação básica
Como instalar e usar
WebConversation wc = new WebConversation();WebRequest request =
new GetMethodWebRequest("http://xyz.com/t.html");WebResponse response = wc.getResponse(request);String html = response.getText();
4argo
navis
.com
.br
Principais classes da API do HttpUnit
com.meterware.httpunit.WebConversationRepresenta uma sessão de cliente Web (usa cookies e permite lidar com requisições e respostas HTTP)
com.meterware.httpunit.WebRequestRepresenta uma requisição. Permite setar parâmetros
com.meterware.httpunit.WebResponseRepresenta uma resposta. A partir deste objeto pode-se obter objetos WebLink, WebTable e WebForm
com.meterware.httpunit.WebLinkPossui métodos para extrair dados de links de hipertexto
com.meterware.httpunit.WebTablePossui métodos para navegar na estrutura de tabelas
com.meterware.httpunit.WebFormPossui métodos para analisar a estrutura de formulários
5argo
navis
.com
.br
WebConversation, WebRequest, WebResponse
WebRequest pode ser criado de várias formas. Primeiro é preciso obter uma página. Para isto a melhor solução é usar GetMethodWebRequestWebConversation wc = new WebConversation();WebRequest request =
new GetMethodWebRequest("http://xyz.com/t.html");WebResponse response = wc.getResponse(request);
Se não for preciso usar o objeto request (para, por exemplo, acrescentar parâmetros), pode-se utilizar forma mais compactaWebConversation 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
6argo
navis
.com
.br
Testes com HttpUnit
Para usar HttpUnit, importe o pacote com.meterware.httpunitno TestCase e use asserções normalmente no códigoVá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():assertTrue(resp.getText().indexOf("texto esperado"));
getColumnCount(), getRowCount(), getTableCell() e outros métodos de WebTable permitem testar tabelasMé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 criadosWebLink permite descobrir a presença de links na página
7argo
navis
.com
.br
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
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);}
8argo
navis
.com
.br
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 formasSe 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
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.0Content-length: 21Content-type: x-www-form-urlencoded
id=agente007&acesso=3
9argo
navis
.com
.br
Envio de requisições com parâmetros
Parâmetros HTTP podem ser acrescentados em qualquer requisição através do HTTPUnitPodem ser incluídos em um acesso via HttpUnit usando o método setParameter() de WebRequest
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"));
10argo
navis
.com
.br
Formulários
Há vários métodos para manipular formulários. Pode-seDetectar a presença de objetos de formulários e seu conteúdoVerificar métodos usados, nome do formulários e outros atributosSimular 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
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");
11argo
navis
.com
.br
Testes de tabelas
Há vários métodos para navegar nas células de tabelasUse 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 1String value = table.getCellAsText(i, 1); // col 2if (key.equals("USER")) {
keyDefined = true;assertEquals("JABBERWOCK", value);
}}if (!keyDefined) {
fail("No key named USER was found!");}
12argo
navis
.com
.br
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=trueproxyHost=nomeDoHostOuIPproxyPort=portaDoProxy
Podem ser passadas em linha de comando (usando "-D"), através do Ant (<jvmargs>) ou pelo código:System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost","200.9.2.1");
System.getProperties().put("proxyPort", "3831");
13argo
navis
.com
.br
Exercícios
1. Escreva testes para testar a aplicação Web fornecidaA aplicação recebe parâmetros e grava os dados no contexto. No final retorna uma página HTMLRode 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)
14argo
navis
.com
.br
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 TomcatPara usar o JBoss altere os arquivos
build.properties
server.home=c:/jboss-3.2.1/server/defaultservlet.jar=${server.home}/lib/javax.servlet.jardeploy.dir=${server.home}/deploy
No build.xml, é preciso carregar build.propertiesUse<property file="build.properties" />
Arquivo necessário apenas na fase de
compilação
15argo
navis
.com
.br
Fontes
[1] Richard Hightower e Nicholas Lesiecki. Java Tools for eXtreme Programming. Wiley, 2002.
[2] Eric Burke & Brian Coyner. Java eXtreme Programming Cookbook. O'Reilly, 2003
Curso J820Produtividade e Qualidade em Java:
Ferramentas e MetodologiasRevisão 1.1
© 2002, 2003, Helder da Rocha([email protected])
argonavis.com.br