330 likes | 422 Views
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.
E N D
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 • 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.