View
221
Download
0
Category
Preview:
Citation preview
Teste De Sistemas Web Com JUnit E Suas Extensões
Eduardo Aranha
Por Quê Testar Sistemas Web?
Sistemas 24x7 Corretude
Performance Escalabilidade Etc.
O Que Devemos Testar?
Funcionalidade (testes de aceitação) Performance
Segurança Apresentação Muitos outros aspectos
Por Quê Utilizar O Framework JUnit?
Automação de testes de unidade JUnit e suas extensões são Free e Open
Source Utilização no mercado alavancada pela
metodologia Extreme Programming Versão atual: 3.7 (21/05/2001)
O Framework JUnit
Implementação de classes e métodos de teste Execução dos testes através de modo textual
ou com interface gráfica Não dá suporte para parametrização dos
dados de teste
O Framework Junit: Exemplo
public class MoneyTest extends TestCase { private Money m12CHF; ....
protected void setUp() { m12CHF = ... }
public void testSimpleAdd() { Money result = m12CHF.add(m14CHF); assert(expected.equals(result)); }
}
A Extensão JPerf
Teste de Performance Aplicação do padrão de projeto Decorator Utilização de classes decoradoras em testes
JUnit já criados Versão atual: 1.3 (11/05/2001)
A Extensão JPerf
Decoradores– TimedTest
Testa o tempo gasto por um teste– LoadTest
Simula a execução concorrente de um teste por um determinado número de usuários
– ThreadedTest Executa o teste em um novo Thread
A Extensão JPerf: Exemplo
...
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test loadTest = new LoadTest(testCase, maxUsers, iterations, timer);
Test timedTest = new TimedTest(loadTest, maxElapsedTime);
...
A Extensão Cactus
Projeto suportado pelo grupo Apache Teste de unidade de Servlets
Testes de caixa branca Simulação do ambiente de execução de
Servlets Versão atual: 1.0 (02/05/2001)
A Extensão Cactus: Exemplo
public class SampleServlet extends HttpServlet {
void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { ... registerUser(req, resp) ... }
String registerUser(HttpServletRequest req, HttpServletResponse resp) {String name = theRequest.getParameter("USER_NAME"); HttpSession session = theRequest.getSession(); session.putValue("NAME", name); Cookie cookie = new Cookie("ID", name); theResponse.addCookie(cookie); return name;
} …
A Extensão Cactus: Exemplo
public class TestSimpleServlet extends ServletTestCase {
void beginRegisterUser(ServletTestRequest theRequest) { theRequest.addParameter("USER_NAME", "Vincent");
}
void testRegisterUser() {SimpleServlet servlet = new SimpleServlet();String name = servlet.registerUser(request, response);assertEquals("Vincent", name);assertEquals("Vincent", (String)session.getValue("NAME"));
}
A Extensão Cactus: Exemplo
void endRegisterUser(HttpURLConnection theConnection) {Hashtable cookies = AssertUtils.getCookies(theConnection);Vector list = (Vector) cookies.get("ID");assert(list.size() == 1);ClientCookie cookie = (ClientCookie) list.elementAt(0);assertEquals("ID", cookie.getName());assertEquals("Vincent", cookie.getValue());
}
A Extensão Cactus: Exemplo
void testDoGet() {SimpleServlet servlet = new SimpleServlet();servlet.doGet(request, response);
}
void endDoGet(HttpURLConnection theConnection) {assertEquals(
"<html><head/><body><h1>Your name is” + “Vincent</h1></body></html>",
AssertUtils.getResponseAsString(theConnection));}
}
A Extensão HttpUnit
Testes de sistemas Web (servlets, páginas estáticas, JSP, ...)
Testes de caixa preta Suporta HTTPS e cookies
A Extensão HttpUnit
Não suporta JavaScript (em construção) Utilização de classes que representam
conexões, páginas HTML, formulários, ... Versão atual: 1.2.4 (04/05/2001)
A Extensão HttpUnit: Exemplo
try {WebRequest request; WebResponse response;WebConversation conversation = new WebConversation();request = new GetMethodWebRequest("http://www.x.com/" );response = conversation.getResponse( request );WebForm loginForm = response.getForms()[0];request = loginForm.getRequest();request.setParameter( "name", "master" );response = conversation.getResponse( request );
} catch (Exception e) { ... }
A Extensão JXUnit
Testes de unidade assim como o JUnit Separação entre dados e código de teste
Não suporta diretamente a parametrização dos dados de teste
A Extensão JXUnit
Não suporta testes de performance Integração com JPerf não é direta
Integrado com Quick (mapeamento de dados XML para objetos Java)
Versão atual: 2.1 (20/05/2001)
A Extensão JXUnit
Código de teste– Classes que implementam a interface JXTestStep– Leitura dinâmica das classes
Dados de teste– Arquivos XML
A Extensão JXUnit: Exemplo
import net.sourceforge.jxunit.*;
public class CopiadorTestStep implements JXTestStep {
public void eval(JXTestCase testCase) throws Throwable {
JXProperties properties=testCase.getProperties();
Object data=properties.get("input");
properties.put("output",data);
}
}
A Extensão JXUnit: Exemplo
<jxu>
<set name="input" value=“v1"/>
<eval stepClass=“CopiadorTestStep"/>
<ifEqual converse=“true” name="output" value=“v1">
<save name="output" file=“output.txt"/>
<fail>Dummy Test Failure: myData.xml</fail>
</ifEqual>
...
</jxu>
A Extensão JXUnit: SCHEMA TREE
Jxu |---testStep*
|---fail |---isNull |---ifNull |---testStep* |---isEqual |---ifEqual |---testStep* |---set |---save |---eval
|---exception |---trap
|---testStep* |---subst |---main
|---testStep* |---arg |---absolute
A Extensão JXUnit
Execução do JXUnit procura no diretório corrente e nos subdiretórios– Dados de teste (.jxu)
– Arquivo de contexto (.jxuc)
A Extensão JXWeb
Integração do HttpUnit e do JXUnit Script de teste escrito em JXWeb (extensão da
linguagem JXUnit) Não é necessário programação em Java (em
tese) Versão atual: 0.2 (23/05/2001)
A Extensão JXWeb: Exemplo
<jxw>
<set name="req" value="http://www.expoimovel.com.br"/>
<httpGet/>
<getLink text=“Lançamentos"/>
<httpGet/>
<save file=“paginaLancamentos.html" name="respText"/>
</jxw>
A Extensão JXWeb: SCHEMA TREE
jxw |---testStep*
|---getForm |---getFormParameter|---getLink|---httpGet |---setFormParameter |--- ... [ TODOS OS OUTROS MARCADORES DO
JXUNIT]
Suporte Para Teste de Sistemas Web
O ideal– Utilização exclusiva do JXWeb e/ou Cactus
O possível (“Quem não tem cão…”)– Utilização do JXWeb e/ou Cactus– JXUnit e HttpUnit para os comandos ainda não
implementados em JXWeb– JXPerf para o teste de performance enquanto não
for implementado em JXUnit (ou JXWeb)
Exemplo
Ver Arquivo de Exemplo Externo à Apresentação
Referências
JUnithttp://www.junit.org JPerfhttp://www.clarkware.com/software/JUnitPerf.html Cactushttp://jakarta.apache.org/commons/cactus/
Referências
HttpUnithttp://httpunit.sourceforge.net/ JXUnithttp://jxunit.sourceforge.net/ JXWebhttp://sourceforge.net/projects/jxweb/
Referências
Quick
http://jxquick.sourceforge.net/quick3/
Extreme Programming
http://www.extremeprogramming.org
Referências
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software, 1995. Addison-Wesley.
Recommended