J820. Mock objects. Testes de código com dependências. argonavis.com.br. Helder da Rocha

Documentos relacionados
São Paulo Maio de argonavis.com.br. Desenvolvimento. testes. guiado por testes. com. Helder da Rocha

Testes de performance JUnitPerf

Testes de Unidade com JUnit

J820. Testes em J2EE com. Jakarta C A C T U S. argonavis.com.br. Helder da Rocha

Objetos Dublês. Mariana Bravo AgilCoop Cursos de Verão 2009

extreme Programming Brasil Testes de Unidade Java com em Java argonavis.com.br Helder da Rocha

Objetos Dublês. AgilCoop Cursos de Verão Mariana Bravo IME/USP

Java 2 Standard Edition Classes internas

Injeção de Dependências e Spring

Testes com JUnit. Treinamento ALESP SPL. Danilo Toshiaki Sato.

JUnit. Alexandre Menezes Silva Eduardo Manuel de Freitas Jorge

Introdução ao Desenvolvimento de

Java RMI. RMI Remote Method Invocation. Chamadas Remotas de Procedimentos (RPC) RPC - Implementação

Visitor. Um problema a resolver. Temos uma hierarquia de classes, provavelmente um Composite Exemplo: Numa rede elétrica, temos a seguinte hierarquia:

Padrões de Testes Automatizados

Programação Orientada a Objetos


Avançando em Java com

Aplicações Web com Servlets e JSP

Programação orientada a objetos

Enterprise JavaBeansTM

Testes com objetos mock. Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Análise e Projeto Orientados a Objetos

Classes e Objetos POO

Desenvolvendo aplicações de qualidade com TDD

Programação Orientada a Objetos Relacionamentos entre classes

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

extreme Programming Brasil Testes de Integraçã ção J2EE com J2EE em Jakarta C A C T U S argonavis.com.br Helder da Rocha

Idiomas de Programação

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Java para Desktop. Programação Orientada à Objetos 2 JSE

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

October 13, 2016 Web.br hugeinc.com

Engenharia de Software

Estratégias de Escrita de Testes Automatizados

DATA ACCESS OBJECT (DAO)

1 Introdução e Conceitos básicos

Roteiro. Introdução. Uma Introdução à Programação Orientada a Objetos e JAVA usando NetBeans. Objetos. Princípios da Orientação a Objetos

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Interfaces e polimorfismo

J530 - Enterprise JavaBeans. Geração automática de EJB com. XDoclet. argonavis.com.br. Helder da Rocha

J820. Testes de interface Web com. HttpUnit. argonavis.com.br. Helder da Rocha

Testes Automatizados. Cursos de Verão 2007 IME/USP Dairton Bassi & Paulo Cheque

PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula de Revisão para AV1

Programação orientada a objetos em Java

ALUNO: RONI FABIO BANASZEWSKI

Test-driven Development

9 Classes Abstractas e Interfaces

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

JUnit: framework de testes unitários. Fred Lopes

Análise e Projeto Orientados a Objetos

Abstract Factory. Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas

Teste Unitários com NUnit. Anderson Martiniano da Rocha

p Imagine que um Sistema de Controle do Banco pode ser acessado, além dos Gerentes, pelos Diretores do Banco

Programação Orientada a Objetos II

Exercícios de fixação: Listas

Desenvolvimento orientado por testes, padrões de testes e JWebUnit

Interfaces e Classes Abstratas

Community. .com. Introdução ao T D

JUnit. Facilitando o desenvolvimento e execução de testes unitários em código java. Peterson Rodrigues

Teste de Software. Estratégias de Teste. Rosemary Silveira Filgueiras Melo

Computação II Orientação a Objetos

INTRODUÇÃO. RPC x RMI

Padrões de Testes Automatizados

Organizando seus Testes Funcionais AUMENTANDO A MANUTENIBILIDADE DE TESTES FUNCIONAIS ATRAVÉS DA ORIENTAÇÃO A OBJETOS.

Iterator. Professor: Hyggo Almeida

Herança e Polimorfismo

Engenharia de Software

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

By Gian Ricardo Berkenbrock & Eduardo Dockhorn da Costa

INE 5612 Professor: Frank Siqueira. Leonardo Silva Jean Ercilio Thiago

Web Presentation Patterns - Controllers

Fundamentos de programação

Teste Automatizado POO. Prof. Marcio Delamaro

Programação Orientada a Objetos (DPADF 0063)

Análise e Projeto Orientados a Objetos

Engenharia de Software

Ferramenta MVCASE - Estágio Atual: Especificação, Projeto e Construção de Componentes

Engenharia de Software

Arquitectura de Sistemas de Software

J820. Helder da Rocha argonavis.com.br

Criando uma aplicação web

Construtores e Especificadores de Acesso

POO fundamentos Parte II. Professor Vicente Paulo de Camargo

J550 JSP com tags padrão

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Linguagem de programação Programação Orientada a objetos

Indo Além com Automação e Testes de Apps Android. Eduardo

Composição e Herança. carro meucarro = new carro();

Testes Unitários com JUnit

Sistemas Operacionais

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Aula Prática Criando Views e Controles

Agilizando o processo de redeploy de aplicações Java

Iteradores. Iteradores. Isabel Harb Manssour. Roteiro. Coleções

15/4/15. Processamento Paralelo Middleware Orientado a Objetos. Sistema operacional é a única infraestrutura para interação. Middleware é adicionado

Transcrição:

J820 Mock objects Testes de código com dependências Helder da Rocha (helder@acm.org)

Como lidar com testes difíceis Testes devem ser simples e suficientes Comece com testes mais importantes Sempre pode-se escrever novos testes, quando necessário Não complique Não teste o que é responsabilidade de outra classe/método Assuma que outras classes e métodos funcionam Testes difíceis (ou que parecem difíceis) Aplicações gráficas: eventos, layouts, threads Objetos inaccessíveis, métodos privativos, Singletons Objetos que dependem de outros objetos Objetos cujo estado varia devido a fatores imprevisíveis Soluções Alterar o design da aplicação para facilitar os testes Simular dependências usando proxies e stubs 2

Como testar GUIs O que testar? Assumir que GUI (Swing, AWT, etc.) funciona Concentrar-se na lógica de negócio e não na UI Como testar? "Emagrecer" o código para reduzir a chance de falha Usar MVC: isolar lógica de apresentação e controle Separar código confiável do código que pode falhar Usar mediadores (Mediator pattern) para intermediar interações entre componentes Exemplo: event handlers Devem ter 0% de lógica de negócio: "A Stupid GUI is an Unbreakable GUI" (Robert Koss, Object Mentor) Responsabilidades delegadas a mediadores testáveis 3

Dependência de código-fonte Problema Como testar componente que depende do código de outros componentes? Classe-alvo não oferece o que testar: CarroTest +testacelera() Carro +acelera() Se ligado e houver combustível método void acelera() deve funcionar Como saber? Tanque +nivel() Ignição +ligada() public void testacelera() { Carro carro = new Carro(); carro.acelera(); assert???(???); Fonte: www.objectmentor.com, 2002 4

A Stubs: objetos "impostores" É possível remover dependências de código-fonte refatorando o código para usar interfaces antes B A depois «interface» InterB A não conhece mais o tipo concreto de B Agora B pode ser substituída por um stub BStub está sob controle total de ATest (1) Em alguns casos, ATest pode implementar InterB (2) B ATest «cria» A (1) BStub «interface» InterB B ATest A (2) self-shunt pattern «interface» InterB Fonte: www.objectmentor.com, 2002 B 5

Dependência: solução usando stubs CarroTest +testtanquevaziosemign() +testtanquecheiosemign() +testtanquevaziocomign() +testtanquecheiocomign() Carro +acelera() «interface» Tanque +nivel():float «interface» Ignicao +ligada(): bool TanqueImpl +nivel():float IgnicaoImpl +ligada():bool Quando usar stubs Dependência não existe ainda (não está pronta) Dependências tem estado mutante, imprevisível ou estão indisponíveis durante o desenvolvimento BDs, servidores de aplicação, servidores Web, hardware Fonte: www.objectmentor.com, 2002 6

Dependências de servidores Use stubs para simular serviços e dados É preciso implementar classes que devolvam as respostas esperadas para diversas situações Complexidade muito grande da dependência pode não compensar investimento (mas não deixe de fazer testes por causa disto!) Vários tipos de stubs: mock objects, self-shunts. Use proxies (mediadores) para serviços reais Oferecem interface para simular comunicação e testa a integração real do componente com seu ambiente Não é teste unitário: teste pode falhar quando código está correto (se os fatores externos falharem) Exemplo: Cactus, HttpUnit 7

Mock Objects Mock objects (MO) é uma estratégia similar ao uso de stubs mas que não implementa nenhuma lógica Um mock object não é exatamente um stub, pois não simula o funcionamento do objeto em qualquer situação Comportamento é controlado pela classe de teste que Define comportamento esperado (valores retornados, etc.) Passa MO configurado para objeto a ser testado Chama métodos do objeto (que usam o MO) Implementações open-source que facilitam uso de MOs EasyMock (tammofreese.de/easymock/) e MockMaker (www.xpdeveloper.com) geram MOs a partir de interfaces Projeto MO (mockobjects.sourceforge.net) coleção de mock objects e utilitários para usá-los 8

Exemplo de Mock Object public interface Dependencia { public String metodo(); Interface import mockmaker.returnvalues; import com.mockobjects.*; Implementação "mock" da interface gerada pelo mock maker public class MockDependencia implements Dependencia{ private ExpectationCounter metodocalls = new... ; private ReturnValues metodoreturnvalues = new... ; public void setexpectedmetodocalls(int calls){ metodocalls.setexpected(calls); public void setupmetodo(boolean arg){ metodoreturnvalues.add(new Boolean(arg)); public void verify(){ metodocalls.verify(); public boolean metodo(){ metodocalls.inc(); Object nextreturnvalue = metodoreturnvalues.getnext(); return ((String) nextreturnvalue).tostring(); métodos para configuração do mock object e resultados esperados implementação 9

Objeto que usa Dependência. Em tempo de desenvolvimento, ela será implementada por um Mock object. import junit.framework.*; Usando um Mock Object public class DepClient { private Dependencia dep; public DepClient(Dependencia dep) { this.dep = dep; public String operacao(string texto) { return dep.metodo(texto); public class DepClientTest extends TestCase { private DepClient client; private MockDependencia mockobject; // implements Dependencia! public void setup() { mockobject = new MockDependencia(); client = new DepClient(mockObject); mockobject.setexpectedmetodocalls(1); mockobject.setupmetodo("dados"); // define comportamento public void testmetodo() throws java.io.ioexception { String result = client.operacao("dados"); assertequals("dados", result); mockobject.verify(); Test Case que usa um Mock Object para simular uma dependência real 10

Como testar bancos de dados Refatore seu código para que não seja necessário usar mock objects para JDBC Forneça um DAO (Data-Access Object) que encapsule os métodos de acesso ao banco que sua aplicação irá utilizar Escreva testes para a Interface do DAO Escreva um stub para a interface do DAO ou gere um mock object para ela Outra alternativa é criar implementação de DAO que faça acesso a banco pequeno, facilmente configurável Muitas vezes é mais fácil testar no próprio sistema que escrever os stubs e mock objects 11

Exercício 1. Gere um MockObject para testar a aplicação fornecida que depende de um DAO Use o MockMaker Escreva um test-case que utilize o mock object criado pelo mock maker. Escreva um segundo teste (no mesmo test case) que use o DAO implementado (antes de executar, rode ant create-table para criar a tabela) 12

Fontes [1] Documentação XDoclet. xdoclet.sourceforge.net [2] Erik Hatcher. Java Development with Ant. Manning, 2003 [3] Eric Burke & Brian Coyner. Java extreme Programming Cookbook. O'Reilly, 2003 13

Curso J820 Produtividade e Qualidade em Java: Ferramentas e Metodologias Revisão 1.1 2002, 2003, Helder da Rocha (helder@acm.org)