330 likes | 435 Vues
Learn about the importance of testing web systems, functionalities to test, and the benefits of using JUnit framework with its extensions for automation. Discover examples of JUnit extensions like JPerf, Cactus, HttpUnit, and JXUnit.
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.