67

Test-Driven Development - Introdução ao método de construção de software guiado por testes

Embed Size (px)

DESCRIPTION

Palestra sobre TDD ministrada por Thiago Faria de Andrade (AlgaWorks).

Citation preview

Page 1: Test-Driven Development - Introdução ao método de construção de software guiado por testes
Page 2: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Palestrante

Thiago Faria de Andrade

Programador há mais de 15 anos

9 anos de experiência com Java

Bacharel em Sistemas de Informação

Certificado como programador Java pela Sun

Consultor, arquiteto, desenvolvedor, escritor e instrutor Java

Diretor/Proprietário da AlgaWorks

Diretor de Tecnologia da Boobow

Page 3: Test-Driven Development - Introdução ao método de construção de software guiado por testes

AgendaO que é TDD?

Quem inventou?

Espiral da morte

Benefícios

Padrões do TDD

Red Bar Patterns

Testing Patterns

Green Bar Patterns

Padrões xUnit

Refatoração

Dominando TDD

Como aprender TDD

Page 4: Test-Driven Development - Introdução ao método de construção de software guiado por testes

O que é TDD?

Técnica de desenvolvimento de software

Testes unitários automatizados

Test-first programming (da XP)

Processo formado por pequenas iterações

Page 5: Test-Driven Development - Introdução ao método de construção de software guiado por testes

O que é TDD?

Já sei, é um método para testar software!

Page 6: Test-Driven Development - Introdução ao método de construção de software guiado por testes

O que é TDD?

Não é um método para testar software

É um método para construir software

Page 7: Test-Driven Development - Introdução ao método de construção de software guiado por testes

O que é TDD?

Através do processo “vermelho-verde-refatorar”

Com “código limpo que funciona” (Ron Jefrries)

Page 8: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Quem inventou?

Não sei…

Mas um criador de cabras que redescobriu TDD.

@kentbeck

Page 9: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Espiral da morte “sem tempo para testar”

Page 10: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Benefícios

Testes unitários sempre atualizados

Design guiado pelos testes

Aumento de confiança

Qualidade de código

Baixo acoplamento

Alta coesão

Código limpo

Testes são especificações

Page 11: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões do TDD

Crie uma lista de testes

• Faça um brainstorm

• Identifique e anote todos os testes que você precisará escrever

• Faça isso para uma mesma classe ou método a ser testado

• Durante o desenvolvimento, você pode adicionar novos testes a essa lista

Page 12: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões do TDD

Crie testes isolados uns dos outros

• Um teste não pode depender de outro

• Deve ser possível executar um teste isoladamente

Page 13: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões do TDD

Teste primeiro

• Escreva o teste antes do código que é para ser testado

• É uma oportunidade para pensar no design das classes

• Uma forma de controlar o escopo do que será implementado

Page 14: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões do TDD

Assertiva primeiro

• Pense primeiro no sucesso do teste

• Depois pense se vai precisar de um método, de uma classe, os nomes dos parâmetros, etc

Page 15: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões do TDD

Como assim?

Page 16: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões do TDD

Como assim?

Page 17: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões do TDD

Dados para teste

• Não use números mágicos

• Evite passar o mesmo valor para diferentes parâmetros

• Use dados do mundo real

Page 18: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões do TDD

Use dados evidentes

• Testes são para pessoas, não para computadores

• Escreva na assertiva uma expressão não só que representa o valor final esperado, mas o que ele significa

Page 19: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões do TDD

Use dados evidentes

Page 20: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões do TDD

Ao invés de…

Page 21: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Red Bar Patterns

Quando e onde escrever os testes?

Quando parar?

Page 22: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Red Bar Patterns

Um passo de cada vez

Qual o próximo teste?

• O que você está confiante e vai lhe ensinar algo

• Para cada pessoa a resposta é diferente

• Cada teste deve representar um passo em direção ao objetivo final

Page 23: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Red Bar Patterns

Primeiro teste

• Não comece pelo mais completo

• Comece pelo menor

• Comece pelo mais simples

Page 24: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Red Bar Patterns

Explicação usando testes

• Não dá para forçar ninguém a mudar a forma de trabalhar

• Peça explicações em termos de testes

• Explique em termos de testes

Page 25: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Red Bar Patterns

Testes de estudo

Podemos escrever testes para componentes de terceiros?

•Apenas para estudar ou documentar o uso

•Não teste todos os recursos do componente terceiro

Page 26: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Red Bar Patterns

Novo teste

O que fazer quando surgir uma discussão?

• Adicione um novo item na lista de testes

• Volte ao assunto principal

Page 27: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Red Bar Patterns

Teste de regressão

• Se um defeito for encontrado, escreva um pequeno teste que falha, execute e depois implemente a correção

• Para escrever o teste, pense em como você teria feito se fosse no passado

Page 28: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Red Bar Patterns

Pausa

• Quando estiver cansado, dê uma pausa

• Beba água, descanse, tenha outros compromissos diferentes e saia de férias

Page 29: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Red Bar Patterns

Comece de novo

• Se estiver perdido, jogue tudo fora e comece de novo

Page 30: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Testing Patterns

Técnicas mais detalhadas de como escrever testes

Hum… legal!

Page 31: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Testing Patterns

Testes menores

• Se o teste ficou grande demais, deixe-o e escreva um pequeno que representa parte dele

• O ciclo “verde-vermelho-refatorar” deve ser rápido

Page 32: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Testing Patterns

Objetos dublês (mock)

Como testar objetos que dependem de recursos externos, caros e complicados?

•Crie uma versão falsa deles que retornam constantes

•Existem diversas ferramentas para ajudar a fazer isso (eu uso o Mockito)

Page 33: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Testing Patterns

Teste de falhas

Como testar falhas difíceis de reproduzir?

•Falsifique o objeto

•Construa uma nova classe que lance uma exceção

Page 34: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Testing Patterns

Teste quebrado

• Se está desenvolvendo um projeto sozinho, deixe sempre um teste em vermelho

• Isso facilita a continuação no próximo dia

Page 35: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Testing Patterns

Check-in limpo

• Se trabalha em equipe, só faça commit quando os testes estiverem verdes

• Execute todos os testes antes de submeter o código

Page 36: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Green Bar Patterns

Padrões para fazer o teste passar

Como fazer um teste vermelho ficar verde rapidamente?

Page 37: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Green Bar Patterns

Falsifique até construir realmente

• Implemente um código falso que retorna uma constante (só para fazer o teste passar)

• Ter algo rodando é melhor que não ter

• Isso gera um bom efeito psicológico

Page 38: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Green Bar Patterns

Triangulação

• Abstraia métodos quando tiver dois ou mais testes

• Quando fazemos isso, somos forçados a implementar algo que realmente funciona (sem falsificação)

Page 39: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Green Bar Patterns

Implementação óbvia

Como implementar operações simples?

• Apenas codifique a solução diretamente

• Se sabe o que precisa digitar, então faça

• Prepare-se para voltar atrás e dar um passo menor se suas mão não conseguirem acompanhar seu cérebro

Page 40: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Green Bar Patterns

Coleções

• Para implementar operações sobre coleções, implemente primeiro sem coleções

• Depois faça funcionar com coleções

Page 41: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões xUnit

xUnit é o nome genérico para ferramentas de testes unitários

Vamos conhecer alguns padrões para usar ferramentas da família xUnit

Page 42: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões xUnit

Asserções

• Escreva expressões booleanas que automatizam o julgamento sobre quando o código funciona

• Deve ser true se estiver ok e false quando houver algum problema

• Seja específico na asserção

• Inclua mensagens informativas na asserção

Page 43: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões xUnit

Construção

Como criar objetos comuns a vários testes?

• Converta as variáveis locais dos testes em variáveis de instância

• Implemente o método setUp() e inicialize as variáveis

Page 44: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões xUnit

Liberação de recursos

Como liberar recursos externos após um teste?

• Implemente o método tearDown() e libere lá

• O teste deve deixar o mundo exatamente como ele estava antes

Page 45: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões xUnit

Método de teste

• O nome do método pode começar com “test”, “deve”, “should” ou nada disso

• O nome do método deve comunicar o que está sendo testado

• O código de teste deve ser curto e fácil de entender

Page 46: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Padrões xUnit

Teste de exceção

Como testar exceções esperadas?

• Capture e ignore a exceção e chame fail() se não houver exceção

• Ou use algum recurso específico do framework

Page 47: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Refatoração

Refatorar é melhorar o design do sistema sem alterar o comportamento

• Como mudar o design do sistema radicalmente ou em pequenos passos?

• Ao refatorar, os testes devem continuar verdes

• Refatoramos para melhorar legibilidade, facilitar manutenção e melhorar performance

Page 48: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Refatoração

Reconcilie diferenças

• Duas partes de códigos iguais podem ser eliminadas

• Dois loops similares, ao fazerem eles idênticos, podem ser fundidos em um só

• Duas condições similares, ao fazerem idênticas, uma pode ser eliminada

• Dois métodos ou classes similares, ao fazerem idênticos, um pode ser eliminado

Page 49: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Refatoração

Isole mudanças

• Se precisar alterar uma parte de um método que possui várias outras partes, isole primeiro o que precisa ser alterado com refatoração

• Extrair métodos é a forma mais comum de fazer isso

Page 50: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Refatoração

Migre dados

Como mudar de uma estrutura de dados para outra?

• Crie uma nova variável e duplique os dados

• Atribua a nova variável em todos os lugares

• Use a nova variável em todos os lugares

• Apague a variável antiga

• Mantenha os testes sempre verdes entre os passos

Page 51: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Refatoração

Extraia métodos

Como fazer um método longo e complicado fácil de ser lido?

•Encontre uma parte do código que faça sentido ter seu próprio método (blocos em loops e caminhos de condições são candidatos)

•Deixe o teste sempre verde durante as mudanças

Page 52: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Refatoração

Elimine métodos

Como simplificar o código quando ele parece muito disperso e sem sentido?

•Substitua a chamada do método pelo código do método

•Entenda melhor o código e depois repense sobre a melhor forma de organizá-lo

Page 53: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Refatoração

Extraia interfaces

Como criar uma segunda implementação de operações em Java?

•Crie uma interface que especifica os métodos compartilhados com o nome da classe existente

•Mude o nome da classe existente para algo que faça sentido

•Adicione os métodos necessários na interface

•Cuidado ao nomear as classes e a interface (dê nomes que realmente fazem sentido)

Page 54: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Refatoração

Mover métodos

Como mover métodos para outros lugares sem precisar modificar quem os chamam?

•Crie um novo método e mova o conteúdo do método antigo para dentro do novo método

•Faça uma chamada ao novo método de dentro do método antigo

Page 55: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Refatoração

Objetos como métodos

Como representar um método complicado que requer muitos parâmetros e variáveis locais?

•Crie uma classe que recebe os mesmos parâmetros do método

•Torne as variáveis locais do método em variáveis de instância da nova classe

•Crie um método run() que execute o mesmo código do método antigo

•No método antigo, instancie um objeto da nova classe e chame run()

Page 56: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Refatoração

Parâmetro de método para parâmetro de construtor

Se você passa os mesmos parâmetros para vários métodos diferentes do mesmo objeto:

•Crie um construtor que recebe os mesmos parâmetros

•Adicione as variáveis de instância na classe com os mesmos nomes dos parâmetros e inicialize-as no construtor

•Mude todas as referências às variáveis para incluir “this.variavel”

Page 57: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Dominando TDD

Perguntas que surgem ao iniciar com TDD.

Page 58: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Dominando TDD

Qual o tamanho ideal dos passos?

• Não existe uma regra

• Mas a tendência é que sejam passos pequenos

• Quando sentir confortável, você poderá dar passos um pouco maiores

• Ferramentas ajudam a pular etapas na fase de refatoração

Page 59: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Dominando TDD

O que você precisa testar?

• Você encontrará essa resposta praticando

• Teste condições, loops, operações, polimorfismo

• Teste apenas códigos que você escreve

Page 60: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Dominando TDD

Como você sabe se tem bons testes?

Alguns atributos que sugerem testes ruins:

• Código de configuração longo ou duplicado

• Testes demorados para executar

• Testes frágeis (que dependem do resultado de outros)

Page 61: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Dominando TDD

Quando você deve excluir um teste?

• É bom ter muitos testes

• Mas se dois testes são redundantes

• Se excluir um diminuirá sua confiança, é melhor deixar assim

• Se os dois testes seguem o mesmo fluxo mas comunicam cenários diferentes, deixe assim

• Se ambos os testes comunicam a mesma coisa e a exclusão de um deles não diminui sua confiança, então exclua um

Page 62: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Dominando TDD

Como migrar um projeto existente para usar TDD?

• O maior problema é que códigos escritos sem pensar nos testes normalmente são difíceis de testar

• Mudanças no código são perigosas porque não existem testes para garantir o funcionamento

• Se tiver partes do sistema que precisam ser simplificadas mas não precisam de mudança no momento, não faça nada

• Quando precisar modificar um método, implemente os testes antes

• Faça testes em nível de aplicação para garantir um certo nível de confiança

Page 63: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Como aprender TDD

Leia livros

Page 64: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Como aprender TDD

Assista vídeos na internet de pessoas usando TDD

Page 65: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Como aprender TDD

Estude códigos de projetos que usam TDD

Page 66: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Como aprender TDD

Pratique muito

Page 67: Test-Driven Development - Introdução ao método de construção de software guiado por testes

Perguntas?

Thiago Faria de Andrade

[email protected]: @ThiagoFAndrade

Obrigado!www.algaworks.com

Twitter: @algaworks