92
Iure Guimarães, 2009 [email protected] Siriusoft Siriusoft ®

Introdução a Desenvolvimento Orientado a Testes ( TDD )

Embed Size (px)

DESCRIPTION

Palestra faz parte de um conjunto de assuntos abordados no curso de Metodologias Ágeis ministrado na Universidade Federal de Goiás durante a Semana de Engenharia de 2009

Citation preview

Page 1: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Iure Guimarães, [email protected]

SiriusoftSiriusoft®®

Page 2: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Resolvendo o problema Resolvendo o problema certocerto

Page 3: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Resolvendo o problema Resolvendo o problema certocerto

da maneira da maneira corretacorreta

Page 4: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Códigos ruínsCódigos ruínsCódigos ruínsCódigos ruíns

• Defeitos• Defeitos

Page 5: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Códigos ruínsCódigos ruínsCódigos ruínsCódigos ruíns

• Defeitos

• Manutenção

• Defeitos

• Manutenção

Page 6: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Códigos ruínsCódigos ruínsCódigos ruínsCódigos ruíns

• Defeitos

• Manutenção

• Produtividade

• Defeitos

• Manutenção

• Produtividade

Page 7: Introdução a Desenvolvimento Orientado a Testes ( TDD )

O problemaO problema

Page 8: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Necessidades do Necessidades do clientecliente

Necessidades do Necessidades do clientecliente

Page 9: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Tarde demaisTarde demaisTarde demaisTarde demais

Page 10: Introdução a Desenvolvimento Orientado a Testes ( TDD )
Page 11: Introdução a Desenvolvimento Orientado a Testes ( TDD )

A A SoluçãoSoluçãoA A SoluçãoSolução

Page 12: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Caixa Caixa

PretaPretaCaixa Caixa Branca

Branca

Regressão

Regressão Caixa Caixa

CinzaCinza

TDD TDD não énão éTDD TDD não énão é

Page 13: Introdução a Desenvolvimento Orientado a Testes ( TDD )

UnitáriosUnitários FFununcionais

cionais

AceitaçãAceitaçã

oo

TDD TDD não é limitadonão é limitadoTDD TDD não é limitadonão é limitado

……

Page 14: Introdução a Desenvolvimento Orientado a Testes ( TDD )

SOFTWARE SOFTWARE DESIGNDESIGNSOFTWARE SOFTWARE DESIGNDESIGN

Page 15: Introdução a Desenvolvimento Orientado a Testes ( TDD )

TFTFD D TFTFD D

RefatoraçãoRefatoração

Page 16: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Experience is a harsh teacher Experience is a harsh teacher because she gives the test because she gives the test first, the lesson afterward.first, the lesson afterward.

_ _ Provérbio ChinêsProvérbio Chinês

Page 17: Introdução a Desenvolvimento Orientado a Testes ( TDD )

O O resultadoresultado é um reflexo do é um reflexo do que foi que foi solicitadosolicitado

Page 18: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Menos Menos tempotempo gasto com a gasto com a solução de defeitossolução de defeitos

Page 19: Introdução a Desenvolvimento Orientado a Testes ( TDD )

ConfiançaConfiança na qualidade do na qualidade do próprio trabalhopróprio trabalho

Page 20: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Possibilita a Possibilita a propriedade propriedade coletiva coletiva do códigodo código

Page 21: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Desenvolvendo Desenvolvendo incrementalmenteincrementalmente

Page 22: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Nunca se afastando do Nunca se afastando do real real objetivoobjetivo

Page 23: Introdução a Desenvolvimento Orientado a Testes ( TDD )

E o E o resultadoresultado é é

Page 24: Introdução a Desenvolvimento Orientado a Testes ( TDD )

E o E o resultadoresultado é é

?

Page 25: Introdução a Desenvolvimento Orientado a Testes ( TDD )

E o E o resultadoresultado é é

Page 26: Introdução a Desenvolvimento Orientado a Testes ( TDD )

E o E o resultadoresultado é é

Page 27: Introdução a Desenvolvimento Orientado a Testes ( TDD )
Page 28: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Modele

Implemente

Teste

TesteTesteTesteTeste

Page 29: Introdução a Desenvolvimento Orientado a Testes ( TDD )
Page 30: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Modele

TDDTDDTDDTDD

Descubra o que você Descubra o que você realmente quer fazerrealmente quer fazer

Page 31: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Modele

Teste

TDDTDDTDDTDD

Escreva um teste que Escreva um teste que expresse sua expresse sua

modelagemmodelagem. Ele . Ele deverá deverá falharfalhar

Page 32: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Modele

Teste

Implemente

TDDTDDTDDTDD

Escreva o códigoEscreva o código

Page 33: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Modele

Teste

Implemente

TDDTDDTDDTDD

Teste Teste novamente. Teste novamente. Desta vez para Desta vez para

passarpassar

Page 34: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Refatore

Teste

Implemente

TDDTDDTDDTDD

Teste Refatore para Refatore para melhorar a melhorar a

qualidade da qualidade da soluçãosolução

Page 35: Introdução a Desenvolvimento Orientado a Testes ( TDD )

ModelagemModelagemModelagemModelagem

““Quando validado, o template “Olá, $Quando validado, o template “Olá, ${nome} com o valor “Iure” para a variável {nome} com o valor “Iure” para a variável

nome retornará a string “Olá, Iure”nome retornará a string “Olá, Iure”

Page 36: Introdução a Desenvolvimento Orientado a Testes ( TDD )

TesteTesteTesteTeste

Page 37: Introdução a Desenvolvimento Orientado a Testes ( TDD )

FalhaFalhaFalhaFalha

Page 38: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Fazendo o teste Fazendo o teste PassarPassarFazendo o teste Fazendo o teste PassarPassar

Page 39: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Faça Faça falharfalhar novamente novamente Faça Faça falharfalhar novamente novamente

Triangulação com valoresdiferentes

Triangulação com valoresdiferentes

Page 40: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Faça Faça PassarPassar novamente novamente Faça Faça PassarPassar novamente novamente

Page 41: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Faça Faça falharfalhar novamente novamente Faça Faça falharfalhar novamente novamente

Renomeando o titulo do testeRenomeando o titulo do teste

Page 42: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Faça Faça passarpassar novamente novamente Faça Faça passarpassar novamente novamente

Apenas funciona para a variável nomeApenas funciona para a variável nome

Page 43: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Falhar…Falhar…Falhar…Falhar…

Page 44: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Passar…Passar…Passar…Passar…

Refatorar para HashMapRefatorar para HashMap

Page 45: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Não se esqueça de Não se esqueça de RefatorarRefatorar

Não se esqueça de Não se esqueça de RefatorarRefatorar

Page 46: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Não se esqueça de Não se esqueça de RefatorarRefatorar

Não se esqueça de Não se esqueça de RefatorarRefatorar

ResponsabilidadesResponsabilidades

Page 47: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Não se esqueça de Não se esqueça de RefatorarRefatorar

Não se esqueça de Não se esqueça de RefatorarRefatorar

Extract Method

Extract Method

ResponsabilidadesResponsabilidades

Page 48: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Não se esqueça de Não se esqueça de RefatorarRefatorar

Não se esqueça de Não se esqueça de RefatorarRefatorar

Extract Method

Extract Method

Inner lineInner line

ResponsabilidadesResponsabilidades

Page 49: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Não se esqueça de Não se esqueça de RefatorarRefatorar

Não se esqueça de Não se esqueça de RefatorarRefatorar

Extract Method

Extract Method

Inner lineInner line

ResponsabilidadesResponsabilidades

EncapsulamentoEncapsulamento

Page 50: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Não se esqueça de Não se esqueça de RefatorarRefatorar

Não se esqueça de Não se esqueça de RefatorarRefatorar

Extract Method

Extract Method

Inner lineInner line

Extract ClassExtract Class

ResponsabilidadesResponsabilidades

EncapsulamentoEncapsulamento

Page 51: Introdução a Desenvolvimento Orientado a Testes ( TDD )
Page 52: Introdução a Desenvolvimento Orientado a Testes ( TDD )
Page 53: Introdução a Desenvolvimento Orientado a Testes ( TDD )
Page 54: Introdução a Desenvolvimento Orientado a Testes ( TDD )

SpikeSpike

Um jeito de Um jeito de tornar o tornar o

desconhecido desconhecido

conhecidoconhecido

XPXP

Explorando as várias soluçõesExplorando as várias soluções

Page 55: Introdução a Desenvolvimento Orientado a Testes ( TDD )

SpikeSpike

Um jeito de Um jeito de tornar o tornar o

desconhecido desconhecido

conhecidoconhecido

XPXP

AprendaAprenda escrevendo testesescrevendo testes

Page 56: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Spiking RegexSpiking Regex

AprendaAprenda escrevendo testesescrevendo testes

Page 57: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Como escrever testes e os fazer passar

Estratégias para escolha do teste

Page 58: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Detalhes x Visão geral

Solução vai de encontro com o Solução vai de encontro com o que se imaginavaque se imaginava

Estratégia para escolha do teste

Page 59: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Incerto x Familiar

Pegando as frutas mais baixas, Pegando as frutas mais baixas, resultados mais rápidosresultados mais rápidos

Estratégia para escolha do teste

Page 60: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Maior valor x Mais fácil

Mais progresso com menos esforçoMais progresso com menos esforço

Estratégia para escolha do teste

Page 61: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Como escrever testes e os fazer passar

Estratégias para implementação

do teste

Page 62: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Estratégias para implementação do teste

Solução paleativa:

FAKE

Não fique muito tempo no vermelho

Page 63: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Estratégias para implementação do teste

Triangulação

Reduza o espaço da solução

Page 64: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Estratégias para implementação do teste

Implementação óbvia

Page 65: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Como escrever testes e os fazer passar

Princípios importantes a

serem seguidos

Page 66: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Princípios inportantes

Vá para o verde o mais rápido

possível

Page 67: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Princípios inportantes

Vá mais devagar depois de um

erro

Page 68: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Princípios inportantes

Jamais pule a refatoração

Page 69: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

Page 70: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

Fixtures correspondem ao

contexto da aplicação

Page 71: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais - Fixtures

Estado de todo o ambiente de

execução

Page 72: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais - Fixtures

Removem duplicação

DRY

Page 73: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais - Fixtures

Removem duplicaçãoDon’t RY

Page 74: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais - Fixtures

Removem duplicação

Don’t Repeat Y

Page 75: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais - Fixtures

Removem duplicação

Don’t Repeat Yourself

Page 76: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais - Fixtures

Removem duplicação

DRYCompreensão

do Código?Compreensão

do Código?

Page 77: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais - Fixtures

Testes com FOCO

Identifique uma floresta por suas árvores

Page 78: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

Objetos falsos Colaboração / dependência

Pretendem ser o que não são

O cliente não tem idéia

Acabam fazendo mais rápido do que os reais

Page 79: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

Teste baseado no Estado

Page 80: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

Teste baseado na interação

Testa a interação entre um

objeto e seus colaboradores

Page 81: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

Teste baseado na interação

mocksmocks

stubsstubs

fakesfakes

Testa a interação entre um

objeto e seus colaboradores

Page 82: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

“We lean on interaction-based testing to verify how an object

talks to its collaborators; and we lean on state-based testing to verify

how well theobject listens.”

J. B. Rainsberger, author of JUnit Recipes

Page 83: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

StubsStubsImplementação mais simples Implementação mais simples

possívelpossível

HARD-CODEDHARD-CODED

Page 84: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

FakesFakesParecem patos, andam como Parecem patos, andam como patos e soam como patos. patos e soam como patos.

MAS NÃO SAO PATOSMAS NÃO SAO PATOS

Page 85: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

MocksMocksIncorpora asserções que Incorpora asserções que

verificam colaboração com verificam colaboração com outros objetos outros objetos

Page 86: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Conceitos Essenciais

MocksMocksNormalmente gerados Normalmente gerados

dinamicamente por dinamicamente por frameworks: frameworks: jMockjMock, ,

EashMockEashMock, , FlexMockFlexMock, , MockPPMockPP

Page 87: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Testando em EquipeTestando em Equipe

• Muitos desenvolvedoresMuitos desenvolvedores

• Desenvolvimento Desenvolvimento

DistribuídoDistribuído

• Plataformas diferêntesPlataformas diferêntes

• Uma estratégia de testesUma estratégia de testes

Page 88: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Quem é Quem é responsável ?responsável ?

Page 89: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Responsabilidade da Responsabilidade da EquipeEquipe

• TodosTodos são responsáveis são responsáveis

• Viu um problema, Viu um problema, conserteconserte!!

• O O códigocódigo é de todos é de todos

Page 90: Introdução a Desenvolvimento Orientado a Testes ( TDD )
Page 91: Introdução a Desenvolvimento Orientado a Testes ( TDD )

Iure Guimarães, [email protected]

SiriusoftSiriusoft®®

Page 92: Introdução a Desenvolvimento Orientado a Testes ( TDD )

BibliografiaBibliografia

blog.briandicroce.comwww.lispcast.com

Introduction to TDD - Kirrily Robert