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 LoadTest ThreadedTest 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" ); } 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 Dados 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 <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 |---testStep* |---fail |---isNull |---ifNull |---testStep* |---isEqual |---ifEqual |---set |---save |---eval |---exception |---trap |---testStep* |---subst |---main |---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 <set name="req" value="http://www.expoimovel.com.br"/> <httpGet/> <getLink text=“Lançamentos"/> <save file=“paginaLancamentos.html" name="respText"/> </jxw>
A Extensão JXWeb: SCHEMA TREE |---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 JUnit http://www.junit.org JPerf http://www.clarkware.com/software/JUnitPerf.html Cactus http://jakarta.apache.org/commons/cactus/
Referências HttpUnit http://httpunit.sourceforge.net/ JXUnit http://jxunit.sourceforge.net/ JXWeb http://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.