Httpunit - Teste de interface Web com HttpUnit

16
Testes de interface Web com HttpUnit Testes de interface Web com HttpUnit J820 Helder da Rocha ([email protected]) argonavis.com.br

description

Aqui são apresentados as técnicas de Desenvolvimento com HttpUnit. Simples e prático. /**Depois que entrei no mundo Java, começei a procurar por conteúdo na internet para estudar, então me deparei com um ótimo site, http://www.argonavis.com.br, de um grande cara chamado Helder Rocha, que disponibiliza este mesmo conteúdo em seu site também. Obrigado pela ajuda a comunidade.*/

Transcript of Httpunit - Teste de interface Web com HttpUnit

Page 1: 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

Page 2: Httpunit - Teste de interface Web com HttpUnit

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)

Page 3: Httpunit - Teste de interface Web com HttpUnit

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();

Page 4: Httpunit - Teste de interface Web com HttpUnit

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

Page 5: Httpunit - Teste de interface Web com HttpUnit

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

Page 6: Httpunit - Teste de interface Web com HttpUnit

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

Page 7: Httpunit - Teste de interface Web com HttpUnit

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);}

Page 8: Httpunit - Teste de interface Web com HttpUnit

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

Page 9: Httpunit - Teste de interface Web com HttpUnit

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"));

Page 10: Httpunit - Teste de interface Web com HttpUnit

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");

Page 11: Httpunit - Teste de interface Web com HttpUnit

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!");}

Page 12: Httpunit - Teste de interface Web com HttpUnit

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");

Page 13: Httpunit - Teste de interface Web com HttpUnit

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)

Page 14: Httpunit - Teste de interface Web com HttpUnit

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

Page 15: Httpunit - Teste de interface Web com HttpUnit

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

Page 16: Httpunit - Teste de interface Web com HttpUnit

Curso J820Produtividade e Qualidade em Java:

Ferramentas e MetodologiasRevisão 1.1

© 2002, 2003, Helder da Rocha([email protected])

argonavis.com.br