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

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

Prof. A. G. Silva. 13 de novembro de Prof. A. G. Silva INE5603 Introdução à POO 13 de novembro de / 1

Injeção de Dependências e Spring

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

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

TRATAMENTO DE EXCEÇÕES

Testes de Interface de Usuário

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

Padrões de Testes Automatizados

Padrões de Testes Automatizados

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

1. Estude e implemente a classe Exemplo1 apresentada abaixo:

RESPOSTA: import java.util.arraylist; import java.util.list; class CarrinhoDeCompras2 { List<Produto> produtos;

Laboratório de Programação. Aula 12 Java 5COP088. Aula 12 Exceções Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Tratamento de Exceções

Programação Orientada a Objetos II

Entrada e Saída Exercício. Linguagem Java. Adenilso da Silva Simão 01/09/05

Exceções AULA 13. Ricardo Massa F. Lima Sérgio C. B. Soares

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Tratamento de Exceções. Grupo de Linguagens de Programação Departamento de Informática PUC-Rio

JUnit. Alexandre Menezes Silva Eduardo Manuel de Freitas Jorge

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

Metodologias de Teste de Software

Programação Java. Tratamento de Exceções

6. Estudo de Caso: Caixa Automático

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

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Programação Orientada a Objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Linguagem de Programação II Implementação

4 Conceito de Herança

Implementar um exemplo de relacionamento entre classes um para muitos (1:N) e um para um (1:1). Sistema para uma Promotora de Evento Agenda Anual

Manipulação de arquivos. João Paulo Q. dos Santos

Encapsulamento. Separa a interface de um objeto dos detalhes de seu funcionamento interno. Caixa preta 2/27

Programação Orientada a Objetos SANTOS, Rafael (PLT)

Engenharia de Software

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

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação

Strings e Arrays POO

Engenharia de Software

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

Exceções. Criando suas exceções

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc.


Padrão de projeto de software

Prof. Rogério Albuquerque de Almeida. Programação Orientada a Objetos II JAVA Décima Segunda Aula

Código-Fonte da Prática 02

Unidade 7: Documentação de Código A Importância dos Comentários Prof. Daniel Caetano

Programação Orientada a Objetos

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

Herança (parte 2) Redefinição de métodos AULA 11

Programação de Computadores II TCC /Turma A 1

Introdução a Testes Automatizados

DATA ACCESS OBJECT (DAO)

Prova 2 PMR3201 1o. semestre 2016 Prof. Thiago Martins

9/24/2014. Prof. André Backes

Testes. Prof. Dr. Fabio Kon. Departamento de Ciência da Computação IME / USP. Lab. Prog. I e sua relação com métodos ágeis

Lista de Linguagens de Programação 18

Desenvolvimento Dirigido por Testes (TDD)

Programação Orientada a Objetos

Criando testes automatizados "like a pro"

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

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

Palavras Reservadas da Linguagem Java

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Universidade Federal de Itajubá Instituto de Engenharia de Sistemas e Tecnologias da Informação-IESTI CCO002 Engenharia de Software

Escreva em Java a classe NumeroComplexo que represente um número complexo. A classe deverá ter os seguintes construtores:

JAVA. Tópicos Especiais de Programação Orientada a Objetos. sexta-feira, 28 de setembro de 12

Sobrecarga. Algoritmos e Programação II. Aula 3 Sobrecarga

Linguagem Algorítmica OO. Linguagem Algorítmica

Reader e Writer para streams de caracteres (texto).

Singleton e Adapter. Professor: Nazareno Andrade (baseado no material de Hyggo Almeida e Jacques Sauvé)

Exceções. Profa. Patrícia A. Jaques Slides alterados por Leandro Tonietto Mar-12. quarta-feira, 21 de março de 12

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

PROGRAMAÇÃO ORIENTADA A OBJETOS: OCULTAR INFORMAÇÕES E ENCAPSULAMENTO

PADI 2014/15. Aula 3.Net Remoting

Num sistema de objectos distribuídos, dois conceitos são fundamentais.

Programação de Computadores II

Errata 2 Engenharia de Software Fundamentos, Métodos e Padrões 3ª. edição

Aula 13 POO 1 Tratamento de Exceções no Java. Profa. Elaine Faria UFU

CETEC Centro Paula Souza

No final deste curso, saberás criar programas através da linguagem de programação Java.

Hierarquia de classes. Veja as diversas classes do pacote

Reader e Writer para streams de caracteres (texto).

Dados armazenados em um objeto podem ser tanto primitivos, tais como inteiros ou caracteres, ou referências para outros objetos.

Engenharia de Software

// quando o estado do Sujeito muda

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Streams e Ficheiros I/O

Notas de Aula 09: Tratamento de exceções

Java Avançado. Carga Horária: 32 horas. Conteúdo Programático: Classes. Classes internas; Instância da classe interna; Referências na classe interna;

Tipos de dados e comandos POO

Tratamento de Exceções. LPG II Java. Tratamento de Exceções. Conceito de Exceções. Exemplo

LISTA DUPLAMENTE ENCADEADA

9 Classes Abstractas e Interfaces

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Tratamento de Exceção. Programação Orientada a Objetos Java (Rone Ilídio)

Transcrição:

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

Motivação Testes de unidade focam em uma unidade Mas as unidades do sistema têm dependências entre si Dublês oferecem uma maneira de isolar as dependências

Dependências Entrada indireta dados que a unidade sob teste obtém de algum objeto do qual ela depende (atributo de instância, parâmetro, etc) Saída indireta resultados esperados da unidade sob teste que não podem ser conferidos apenas pelo valor de retorno. Efeitos colaterais.

Definição Um dublê de teste é uma especialização de alguma componente da qual a unidade testada depende.

Exemplo 1 Pedido Item construído com Produto Cliente No teste do Pedido, quero verificar que a adição de produtos funciona Para criar o pedido preciso de um Cliente, mas o Cliente não é usado na adição de produtos

Bobo Dummy object Permite a realização do teste por satisfazer alguma chamada Mas não é usado em nenhum momento pela unidade sob teste

Exemplo 2 A classe FormatadorDeTempo provê a hora em diversos formatos. public String horaatualporescrito() { Calendar agora = Calendar.getInstance(); if (agora.get(calendar.hour_of_day) == 0) return "Meia noite"; else if (agora.get(calendar.hour_of_day) == 12) return "Meio dia"; else return agora.get(calendar.hour_of_day) + " horas"; }

Substituto Test stub Permite controlar a entrada indireta da unidade testada, fornecendo dados que poderiam ser difíceis de obter com o componente real.

Exemplo 3 Substituto sabotador Algumas vezes queremos testar fluxos excepcionais do programa. public void leinformacao(reader reader) { try { while (reader.read()!= 0) { // Processa informação lida // e armazena de alguma forma } } catch (IOException e) { // Trata exceção } }

Exemplo 4 Continuando... public void leinformacao(reader reader) { try { while (reader.read()!= 0) { // Processa informação lida // e armazena de alguma forma } } catch (IOException e) { // Trata exceção logger.log("erro lendo arquivo", e); } } Como testar que o erro é gravado corretamente?

Espião Test spy Captura informações sobre os efeitos colaterais provodados pela unidade testada, para que o teste verifique se estão corretos.

Exemplo 5 Ainda o Espião Tenho uma class Desenho que deve notificar observadores quando ela é modificada. public void adicionafigura(figura figura) { figuras.add(figura); setchanged(); notifyobservers(figura); }

Exemplo 6 Mesmo problema... Outra solução! public void adicionafigura(figura figura) { figuras.add(figura); setchanged(); notifyobservers(figura); }

Imitação Mock object Verifica diretamente os efeitos colaterais causados pela unidade testada.

Peraí Qual é a diferença? Espião: verificação de comportamento efetuado A unidade sob teste é chamada O espião captura informações O teste verifica se elas estão corretas Imitação: especificação do comportamento esperado A imitação é carregada com as chamadas esperadas A unidade sob teste é chamada se algo der errado, os testes falham

Peraí Qual é a diferença? Espião: verificação de comportamento efetuado A unidade sob teste é chamada O espião captura informações O teste verifica se elas estão corretas Imitação: especificação do comportamento esperado Roda até o fim Falha cedo A imitação é carregada com as chamadas esperadas A unidade sob teste é chamada se algo der errado, os testes falham

Tipos de Imitação Estrito: Espera as mesmas chamadas exatamente na mesma ordem que especificado Tolerante: Aceita qualquer ordem das chamadas, inclusive com chamadas a mais ou a menos

Exemplo 7 Agora com EasyMock A partir do exemplo anterior!

Exemplo 8 O BufferedReader do Java lê um stream linha por linha. Temos um Reader especial que lê um parágrafo inteiro. public class ReaderEspecial extends BufferedReader { public MeuReaderEspecial(Reader in) { super(in); } public String readline() throws IOException; public String readparagraph() throws IOException; public boolean isover() throws IOException; } Como testá-lo sem precisar usar um stream real?

Falso Fake object Substitui uma funcionalidade real por uma implementação alternativa. Emula o comportamento do componente real, com características amigáveis ao teste. Não é controlado nem observado pelo teste.

Falso Motivos Componente real ainda não existe Componente real não está disponível no ambiente de teste Componente real é muito demorado Componente real causa efeitos colaterais indesejáveis

Instalando o dublê Uma vez que o dublê foi instanciado e configurado, precisamos fazer a unidade sob teste usá-lo. Existem diversas maneiras de fazer isso, a escolha pode depender de gosto ou de necessidade.

Injeção de dependência O cliente (ou teste) fornece à unidade sob teste o componente do qual ela depende. Por um setter Por um parâmetro Pelo construtor

Procura de dependência A unidade sob teste pede a algum componente que crie ou encontre o objeto do qual ela precisa. Fábrica de objetos: cria o componente real, é informada pelo teste se deve devolver o componente de teste Localizador de serviços: obtém de alguma forma o objeto a ser utilizado, pode ser configurado pelos testes para devolver o dublê desejado

Vantagens de usar dublês Isola testes de unidade (bug em uma unidade não afeta testes da outra)

Vantagens de usar dublês Acelera preparação ou execução dos testes

Vantagens de usar dublês Permite testar mesmo que alguma componente não esteja pronta ou disponível

Vantagens de usar dublês Evita efeitos colaterais indesejáveis

Perguntas? Mariana Bravo marivb@agilcoop.org.br Copyleft AgilCoop 2010

Referências Conteúdo na web: http://www.mockobjects.com/files/endotesting.pdf http://www.mockobjects.com/files/mockrolesnotobjects.pdf http://xunitpatterns.com/test%20double%20patterns.html http://www.martinfowler.com/articles/mocksarentstubs.html Copyleft AgilCoop 2010

Referências Algumas ferramentas: Java: Mockito - http://mockito.org, EasyMock - http://easymock.org Ruby: RSpec - http://rspec.info/documentation, Mocha - http://mocha.rubyforge.org/.net: NMock - http://www.nmock.org/, RhinoMocks - http://www.ayende.com/projects/rhino-mocks.aspx C++: Google Mock - http://code.google.com/p/googlemock/ Copyleft AgilCoop 2010