padrões de testes automatizados -...

68
Padrões de Testes Automatizados Curso de Verão 2010 - IME/USP www.agilcoop.org.br Hugo Corbucci [email protected]

Upload: truongnhan

Post on 14-Feb-2019

285 views

Category:

Documents


0 download

TRANSCRIPT

Padrões de Testes Automatizados

Curso de Verão 2010 - IME/USPwww.agilcoop.org.br

Hugo Corbucci

[email protected]

Copyleft Agilcoop 2010 2

Introdução

Copyleft Agilcoop 2010 3

Introdução

● Código! De testes automatizados

Copyleft Agilcoop 2010 4

Introdução

● Código! De testes automatizados

E o que Métodos Ágeis dizem

que deve ser feito com código?

Copyleft Agilcoop 2010 5

Introdução

● Código! De testes automatizados

E o que Métodos Ágeis dizem

que deve ser feito com código?

Copyleft Agilcoop 2010 6

Introdução

● Código! De testes automatizados

E o que Métodos Ágeis dizem

que deve ser feito com código?

Copyleft Agilcoop 2010 7

Introdução

● Código! De testes automatizados

E o que Métodos Ágeis dizem

que deve ser feito com código?

Copyleft Agilcoop 2010 8

Introdução

● O que vale pra código de produção vale pra código de testes automatizados

Copyleft Agilcoop 2010 9

Introdução

● O que vale pra código de produção vale pra código de testes automatizados– Precisa ser mantido

Copyleft Agilcoop 2010 10

Introdução

● O que vale pra código de produção vale pra código de testes automatizados– Precisa ser mantido

– Precisa ser refatorado

Copyleft Agilcoop 2010 11

Introdução

● O que vale pra código de produção vale pra código de testes automatizados– Precisa ser mantido

– Precisa ser refatorado

– Precisa ter um design (ainda que simples)

Copyleft Agilcoop 2010 12

Introdução

● O que vale pra código de produção vale pra código de testes automatizados– Precisa ser mantido

– Precisa ser refatorado

– Precisa ter um design (ainda que simples)

– Precisa ser expressivo

Copyleft Agilcoop 2010 13

Introdução

● O que vale pra código de produção vale pra código de testes automatizados– Precisa ser mantido

– Precisa ser refatorado

– Precisa ter um design (ainda que simples)

– Precisa ser expressivo

– Pode ter erros

Copyleft Agilcoop 2010 14

Por que Padrões?

“Um padrão de projeto é uma solução conhecida e reutilizável para um problema

recorrente em design”

Copyleft Agilcoop 2010 15

Padrões para testes

● Facilitam e otimizam a escrita dos testes

Copyleft Agilcoop 2010 16

Padrões para testes

● Facilitam e otimizam a escrita dos testes

● Direcionam a refatoração do código de teste

Copyleft Agilcoop 2010 17

Anti-Padrão

“Um anti-padrão é uma aparente solução a um problema recorrente que introduz outros

problemas. Ou seja, um padrão cujo uso não é recomendado.”

Copyleft Agilcoop 2010 18

Cheiros

“Sintomas do código fonte que indicam a presença de algum problema.”

Copyleft Agilcoop 2010 19

Cheiros no código

Copyleft Agilcoop 2010 20

Cheiros no código

● Código obscuro

Copyleft Agilcoop 2010 21

Cheiros no código

● Código obscuro

● Lógica de teste condicional

Copyleft Agilcoop 2010 22

Cheiros no código

● Código obscuro

● Lógica de teste condicional

● Duplicação de código de teste

Copyleft Agilcoop 2010 23

Cheiros no código

● Código obscuro

● Lógica de teste condicional

● Duplicação de código de teste

● Produção de Lógica de teste

Copyleft Agilcoop 2010 24

Cheiros no código

● Código obscuro

● Lógica de teste condicional

● Duplicação de código de teste

● Produção de Lógica de teste

● Código difícil de testar

Copyleft Agilcoop 2010 25

Cheiros de comportamento

● Roleta de asserções

Copyleft Agilcoop 2010 26

Cheiros de comportamento

● Roleta de asserções

● Intervenção manual

Copyleft Agilcoop 2010 27

Cheiros de comportamento

● Roleta de asserções

● Intervenção manual

● Testes erráticos

Copyleft Agilcoop 2010 28

Cheiros de comportamento

● Roleta de asserções

● Intervenção manual

● Testes erráticos

● Testes frágeis

Copyleft Agilcoop 2010 29

Cheiros de comportamento

● Roleta de asserções

● Intervenção manual

● Testes erráticos

● Testes frágeis

● Debug frequente

Copyleft Agilcoop 2010 30

Cheiros de comportamento

● Roleta de asserções

● Intervenção manual

● Testes erráticos

● Testes frágeis

● Debug frequente

● Testes lentos

Copyleft Agilcoop 2010 31

Cheiros de projeto

● Testes bugados

Copyleft Agilcoop 2010 32

Cheiros de projeto

● Testes bugados

● Testes não escrito por desenvolvedores

Copyleft Agilcoop 2010 33

Cheiros de projeto

● Testes bugados

● Testes não escrito por desenvolvedores

● Alto custo de manutenção de testes

Copyleft Agilcoop 2010 34

Cheiros de projeto

● Testes bugados

● Testes não escrito por desenvolvedores

● Alto custo de manutenção de testes

● Bugs de produção

Copyleft Agilcoop 2010 35

Sugestões

● Nunca adicionar código de teste ao código de produção

– Não usar a lógica dos testes no sistema

Copyleft Agilcoop 2010 36

Sugestões

● Nunca adicionar código de teste ao código de produção

– Não usar a lógica dos testes no sistema● Não incluir código de testes em bibliotecas

– Se precisar, crie outra biblioteca pros testes

Copyleft Agilcoop 2010 37

Sugestões

● Nunca adicionar código de teste ao código de produção

– Não usar a lógica dos testes no sistema● Não incluir código de testes em bibliotecas

– Se precisar, crie outra biblioteca pros testes● Padronizar nomes de classes para facilitar a

identificação e utilização de scripts

– AlgumaClasseTest ou TesteDeAlgumaClasse

Copyleft Agilcoop 2010 38

Padrões de Organização

● Baterias:

– Named Test Suite

Copyleft Agilcoop 2010 39

Padrões de Organização

● Baterias:

– Named Test Suite● Classes:

– Uma classe de teste por Classe/Funcionalidade/Fixture

Copyleft Agilcoop 2010 40

Padrões de Organização

● Baterias:

– Named Test Suite● Classes:

– Uma classe de teste por Classe/Funcionalidade/Fixture

● Métodos:

– Testes parametrizados

– Superclasse de testes

– Classe/Método de ajuda para testes

Copyleft Agilcoop 2010 41

Verificações de Resultados

● Verificação de Estado

– Inspecionar o sistema para saber se o estado está correto:assertEquals(estadoEsperado, sistema.getEstado());

Copyleft Agilcoop 2010 42

Verificações de Resultados

● Verificação de Estado

● Verificação de Comportamento

– Sem estado. Usa um “espião” ou um “dublê”

Copyleft Agilcoop 2010 43

Verificações de Resultados

● Verificação de Estado

● Verificação de Comportamento

– Sem estado. Usa um “espião” ou um “dublê”

CUIDADO!Verifique a funcionalidade e NÃO a implementação.

Copyleft Agilcoop 2010 44

Verificações de Resultados

● Verificação de Estado

● Verificação de Comportamento

● Asserção personalizada

– Criar seu próprio validador

Copyleft Agilcoop 2010 45

Verificações de Resultados

● Verificação de Estado

● Verificação de Comportamento

● Asserção personalizada

● Asserção de mudanças

– Verifico que a mudança que fiz tem o efeito esperadoassertEquals(tamanhoAnterior+1, lista.size());

Copyleft Agilcoop 2010 46

Verificações de Resultados

● Verificação de Estado

● Verificação de Comportamento

● Asserção personalizada

● Asserção de mudanças

● Asserção de guarda

– Asserções para condições iniciais

Copyleft Agilcoop 2010 47

Verificações de Resultados

● Verificação de Estado

● Verificação de Comportamento

● Asserção personalizada

● Asserção de mudanças

● Asserção de guarda

● Asserção de teste inacabado

– Marca de que o teste ainda não terminoufail(“Teste não implementado”);@Ignore(“Produção ainda não está pronta”)

Copyleft Agilcoop 2010 48

Padrões de Valor

● Valores Literais

– Testes NÃO fazem contas.Informação é inserida hard-coded.

– Cuidado apenas para não tornar os testes não repetíveis

Copyleft Agilcoop 2010 49

Padrões de Valor

● Valores Literais

– Testes NÃO fazem contas.Informação é inserida hard-coded.

– Cuidado para não tornar os testes não repetíveis● Valores Derivados

– Implementar um algoritmo que gere o valor esperado se for muito complexo

– Cuidado para não ficar com uma cópia do código de produção

Copyleft Agilcoop 2010 50

Padrões de Valor

● Valor Gerado

– Gerar valores distintos a cada teste

– Útil para testes de Integração

– Cuidado para não conseguir mais repetir esse teste caso ele falhe

Copyleft Agilcoop 2010 51

Padrões de Valor

● Valor Gerado

– Gerar valores distintos a cada teste

– Útil para testes de Integração

– Cuidado para não conseguir mais repetir esse teste caso ele falhe

● Objeto Bobo

– Só para não atrapalhar

Copyleft Agilcoop 2010 52

SetUp: Zerados

● In-line set up

– Set Up é pequeno e muda para cada teste então cada teste tem o seu

Copyleft Agilcoop 2010 53

SetUp: Zerados

● In-line set up

– Set Up é pequeno e muda para cada teste então cada teste tem o seu

● Delegated set up

– SetUp distintos para cada teste num método auxiliar. Chamada explícita.

Copyleft Agilcoop 2010 54

SetUp: Zerados

● In-line set up

– Set Up é pequeno e muda para cada teste então cada teste tem o seu

● Delegated set up

– SetUp distintos para cada teste num método auxiliar. Chamada explícita.

● Implicit set up

– TestCase por Fixture

– Uso de arcabouços (frameworks)

Copyleft Agilcoop 2010 55

SetUp: Compartilhados

● Fixtures pré-montadas

● Set up preguiçoso

● Set up para suite baseada em Fixtures

● Decoradores de Set up

Copyleft Agilcoop 2010 56

Estratégias para tear down

● Tear down para coletar lixo

– Delete

– frame.cleanUp()

– System.gc()

Copyleft Agilcoop 2010 57

Estratégias para tear down

● Tear down para coletar lixo

– Delete

– frame.cleanUp()

– System.gc()● Tear down automático

– Guardo uma lista do que inseri e o tear down se vira pra tirar

Copyleft Agilcoop 2010 58

Organização de tear down

● In-line tear down

– Tear down é curto então cada teste cuida do seu

– Sempre deve ficar depois das verificações

Copyleft Agilcoop 2010 59

Organização de tear down

● In-line tear down

– Tear down é curto então cada teste cuida do seu

– Sempre deve ficar depois das verificações● Tear down implícito

– Uso de arcabouços (frameworks)

Copyleft Agilcoop 2010 60

Padrões de arquitetura testável

● Injeção de dependência

– Injeta por construtor

– Injeta via setter/variáveis públicas

Copyleft Agilcoop 2010 61

Padrões de arquitetura testável

● Injeção de dependência

● Busca de dependências (lookup)

– Teste usa um repositório de objeto

Copyleft Agilcoop 2010 62

Padrões de arquitetura testável

● Injeção de dependência

● Busca de Dependências (lookup)

● Humble Object

– Existem características que dificultam testar um objeto: quebre-o e teste a parte com lógica

Copyleft Agilcoop 2010 63

Padrões de arquitetura testável

● Injeção de dependência

● Busca de Dependências (lookup)

● Humble Object

● Anti-Padrão: Hook de teste

if(TESTANDO) { … } else { ... }

– Modifica o sistema para funcionar diferente ao executar o teste.

Copyleft Agilcoop 2010 64

Anti-padrões

● Incluir código no sistema para uso exclusivo dos testes

// Usado apenas para testes

public Sistema() {}

Copyleft Agilcoop 2010 65

Anti-padrões

● Incluir código no sistema para uso exclusivo dos testes

● Torturar o código do teste para encaixar no sistema ao invés de refatorar o sistema para permitir testes

Copyleft Agilcoop 2010 66

Anti-padrões

● Incluir código no sistema para uso exclusivo dos testes

● Torturar o código do teste para encaixar no sistema ao invés de refatorar o sistema para permitir testes

● Testar a implementação, não a funcionalidade

Copyleft Agilcoop 2010 67

Anti-padrões

● Incluir código no sistema para uso exclusivo dos testes

● Torturar o código do teste para encaixar no sistema ao invés de refatorar o sistema para permitir testes

● Testar a implementação, não a funcionalidade

● Qualquer outro anti-padrão de código de produção

Copyleft AgilCoop 2010 68

Perguntas

?Hugo Corbucci

[email protected]