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

Preview:

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

Iure Guimarães, 2009iureguimaraes@gmail.com

SiriusoftSiriusoft®®

Resolvendo o problema Resolvendo o problema certocerto

Resolvendo o problema Resolvendo o problema certocerto

da maneira da maneira corretacorreta

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

• Defeitos• Defeitos

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

• Defeitos

• Manutenção

• Defeitos

• Manutenção

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

• Defeitos

• Manutenção

• Produtividade

• Defeitos

• Manutenção

• Produtividade

O problemaO problema

Necessidades do Necessidades do clientecliente

Necessidades do Necessidades do clientecliente

Tarde demaisTarde demaisTarde demaisTarde demais

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

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 é

UnitáriosUnitários FFununcionais

cionais

AceitaçãAceitaçã

oo

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

……

SOFTWARE SOFTWARE DESIGNDESIGNSOFTWARE SOFTWARE DESIGNDESIGN

TFTFD D TFTFD D

RefatoraçãoRefatoração

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

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

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

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

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

Desenvolvendo Desenvolvendo incrementalmenteincrementalmente

Nunca se afastando do Nunca se afastando do real real objetivoobjetivo

E o E o resultadoresultado é é

E o E o resultadoresultado é é

?

E o E o resultadoresultado é é

E o E o resultadoresultado é é

Modele

Implemente

Teste

TesteTesteTesteTeste

Modele

TDDTDDTDDTDD

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

Modele

Teste

TDDTDDTDDTDD

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

modelagemmodelagem. Ele . Ele deverá deverá falharfalhar

Modele

Teste

Implemente

TDDTDDTDDTDD

Escreva o códigoEscreva o código

Modele

Teste

Implemente

TDDTDDTDDTDD

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

passarpassar

Refatore

Teste

Implemente

TDDTDDTDDTDD

Teste Refatore para Refatore para melhorar a melhorar a

qualidade da qualidade da soluçãosolução

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”

TesteTesteTesteTeste

FalhaFalhaFalhaFalha

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

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

Triangulação com valoresdiferentes

Triangulação com valoresdiferentes

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

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

Renomeando o titulo do testeRenomeando o titulo do teste

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

Falhar…Falhar…Falhar…Falhar…

Passar…Passar…Passar…Passar…

Refatorar para HashMapRefatorar para HashMap

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

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

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

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

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

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

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

SpikeSpike

Um jeito de Um jeito de tornar o tornar o

desconhecido desconhecido

conhecidoconhecido

XPXP

AprendaAprenda escrevendo testesescrevendo testes

Spiking RegexSpiking Regex

AprendaAprenda escrevendo testesescrevendo testes

Como escrever testes e os fazer passar

Estratégias para escolha do teste

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

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

Maior valor x Mais fácil

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

Estratégia para escolha do teste

Como escrever testes e os fazer passar

Estratégias para implementação

do teste

Estratégias para implementação do teste

Solução paleativa:

FAKE

Não fique muito tempo no vermelho

Estratégias para implementação do teste

Triangulação

Reduza o espaço da solução

Estratégias para implementação do teste

Implementação óbvia

Como escrever testes e os fazer passar

Princípios importantes a

serem seguidos

Princípios inportantes

Vá para o verde o mais rápido

possível

Princípios inportantes

Vá mais devagar depois de um

erro

Princípios inportantes

Jamais pule a refatoração

Conceitos Essenciais

Conceitos Essenciais

Fixtures correspondem ao

contexto da aplicação

Conceitos Essenciais - Fixtures

Estado de todo o ambiente de

execução

Conceitos Essenciais - Fixtures

Removem duplicação

DRY

Conceitos Essenciais - Fixtures

Removem duplicaçãoDon’t RY

Conceitos Essenciais - Fixtures

Removem duplicação

Don’t Repeat Y

Conceitos Essenciais - Fixtures

Removem duplicação

Don’t Repeat Yourself

Conceitos Essenciais - Fixtures

Removem duplicação

DRYCompreensão

do Código?Compreensão

do Código?

Conceitos Essenciais - Fixtures

Testes com FOCO

Identifique uma floresta por suas árvores

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

Conceitos Essenciais

Teste baseado no Estado

Conceitos Essenciais

Teste baseado na interação

Testa a interação entre um

objeto e seus colaboradores

Conceitos Essenciais

Teste baseado na interação

mocksmocks

stubsstubs

fakesfakes

Testa a interação entre um

objeto e seus colaboradores

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

Conceitos Essenciais

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

possívelpossível

HARD-CODEDHARD-CODED

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

Conceitos Essenciais

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

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

Conceitos Essenciais

MocksMocksNormalmente gerados Normalmente gerados

dinamicamente por dinamicamente por frameworks: frameworks: jMockjMock, ,

EashMockEashMock, , FlexMockFlexMock, , MockPPMockPP

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

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

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

Iure Guimarães, 2009iureguimaraes@gmail.com

SiriusoftSiriusoft®®

BibliografiaBibliografia

blog.briandicroce.comwww.lispcast.com

Introduction to TDD - Kirrily Robert

Recommended