Introdução ao TDD

Preview:

DESCRIPTION

Contextualização e benefícios do desenvolvimento baseado em testes

Citation preview

@dudumendes

DesenvolvimentoBaseado em Testes

Eduardo Mendes de Oliveiraedumendes@gmail.com

@dudumendes

Agenda•Introdução

•Conceitos de desenvolvimento orientados a testes

•TDD / BDD

•Revisão de Refatoração

•Padrões de teste

•Ferramentas

•Aulas práticas2

@dudumendes

Introdução

@dudumendes

Processo de Software

Especificação Projeto  e  Implementação

Validação Evolução

@dudumendes

Contexto do Processo de Sofware - Equipe

•Algo novo para a equipe de software

•pessoas envolvidas

•domínio da aplicação

•tecnologia utilizada

•uma combinação dos 03 anteriores

•Elementos surpresas

@dudumendes

•Obriga a criar um novo olhar sobre a organização a partir de uma nova perspectiva

•É preciso negociar e formalizar processos que até então eram baseados na experiência e convenções

Contexto do Processo de Sofware - Cliente

@dudumendes

Processo de SoftwareProcesso de aprendizagem

•Sucesso do projeto

•Entender o progresso do projeto

•trabalho conjunto para identificar e resolver mal-entendidos

•É preciso um processo que ajude a lidar com as incertezas e antecipar mudanças inantecipadas

@dudumendes

Princípios ágeis fundamentais

•Desenvolvimento incremental

•Envolvimento do cliente

•Pessoas, não processos

•Aceitar as mudanças

•Envolvimento do cliente

@dudumendes

Incremento + Feedback

analisarprojetar

implementarimplantar

feedback

CICLO

@dudumendes

Ciclos no Processo de Software

•Testes de unidade

•Testes de aceitação

•Reuniões diárias

•Releases

@dudumendes

Lidando com a mudança

• Possuir testes de regressão sempre

• adicionar funcionalidades sem quebrar as existentes

• escrever testes às vezes é visto como uma tarefa chata

• Manter a simplicidade (FOWLER, 1999)

• Código fácil de manter e modificar

• exige esforço de refatoração constante

@dudumendes

@dudumendes

Melhores práticas para programação

•Evitar código spaghetti

•Incluir comentários relevantes nos fontes

•Criar testes antes ou concomitantemente à codificação

•Inspeções formais

•Re-inspeções de código após mudanças significativas

•Renovar código legado antes de melhorias

@dudumendes

TDD•Teste antes, teste primeiro

•ao invés de deixar o teste verificar o trabalho depois de feito

•Teste como atividade de projeto

•esclarece as ideias sobre o que queremos que o código faça

•separação dos projetos físicos e lógicos

@dudumendes

Densenvolvimento

em um primeiro momento só existiam 02 fases

Manutenção

Ciclo de vida do software

15

@dudumendes

Ciclos ruins

•Quando se chega na época de entregar o software

•Cliente não está satisfeito

•Por falta de tempo, o software é entregue sem testes

@dudumendes

Espiral da morte

menos testes mais problemas

menos tempo

Abordagens Ágeis

•Kent Beck

Test First✦ Modifica a abordagem

tradicional para modelare analisar

✦ Cria práticas para fornecer apoio ao Test First

Baby Steps

18

Consequências

DensenvolvimentoManutenção

Consequências

TDDTest Driven Development

Consequências

TDDTest Driven Design

TDD

• “Test-driven developmentis a way of managing fear during programming.”

Kent Beck

TDD

• “Desenvolvimento baseado em testes é uma forma de administrar o medo durante a programação.”

Kent Beck

“Alguém sabe o que isso faz?”

“Eu acho que não temos nenhuma documentação

para isso!”

“Se eu mudar X provalvementeY vai quebrar!”

“Na última vez que peguei nesse negócio,

nós passamosuma semana

para corrigí-lo.”

@dudumendes

TDD

@dudumendes

Então o que éT D D

@dudumendes

T D DEscreva um teste ANTESde escrever um código a ser testado

Escreva um código queapenas faça compilar o testee observe o teste funcionando

Refatore para o formato mais simples possível

@dudumendes

O ciclo básico do TDD

Escrever umteste unitário

que falha

Fazer um códigopassar no teste

Fazer um códigopassar no teste

Refatorar

@dudumendes

red / green / refactor

@dudumendes

Feedback do TDD

•Implementação

•Funciona?

•Projeto

•Está bem elaborado?

@dudumendes

Benefícios do TDD•Escrevendo testes

•esclarece os critérios de aceitação

•encoraja a escrever componentes fracamente acoplados para que sejam testados isoladamente

•atribui uma descrição executável do que o código faz

•ganha-se uma suíte de regressão completa

@dudumendes

Benefícios do TDD

•Executando testes

•detecta erros enquanto o contexto do código ainda está em mente

•avisa quando fizemos o bastante, evitando esforço desnecessário

@dudumendes

Benefícios resumo

•O projeto evolui constatemente

•O projeto está sobre constante revisão

•qualidade de código

•fraco acoplamento

•alta coesão

@dudumendes

Regra de Ouro do TDD

“Nunca codifique uma funcionalidade nova

sem um teste falhando”

@dudumendes

Níveis de teste

Componente  testado  de  maneira  isolada

preparar

executar

validar

“resetar”

TestesUnitários

@dudumendes

TDDx Testes unitários

•TDD é somente a utilização de testes unitários?

•melhor do que nada!

•às vezes os testes ficam isolados e não podem ser integrados

@dudumendes

Por onde começar?

• Por onde começa um projeto?

@dudumendes

Regra de Ouro do TDD

“Nunca codifique uma funcionalidade nova

sem um teste falhando”

@dudumendes

Por onde começar?

Escrever umteste unitário

que falha

Fazer um códigopassar no teste

Fazer um códigopassar no teste

RefatorarEscrever umteste de aceitação

que falha

@dudumendes

Níveis de teste

• Aceitação

• O sistema funciona como um todo?

• Integração

• Nosso código funciona com o código já existente?

• Unidade

• Nossos objetos fazem a coisa certa do jeito certo?

Processo de Software

Requisitos

Projeto

Implementa

Teste

Evolução

Processo de Software com TDD

Projeto

Implementa

Teste

Processo de Software com TDD

Projeto

Implementa

Teste

Processo de Software com TDD

Projeto

Implementa

Teste

Teste

TDD

Projeto

Implementa

TesteTeste

TDD

Projeto

Implementa

TesteTeste

TDD

Projeto

crie uma lista de teste

anote e identifique os testes

seja conciso: uma classe ou método

posteriormente, é possível adicionar mais testes

TDD

Projeto

Teste

TDD

Teste

Escreva o teste primeiro•pense no design•controle o escopo

crie o teste utilizando assertivas•teste o que é esperado e o que não é esperado

TDD

Implementa

Teste

TDD

Implementa

implemente o código que deve ser testado

faça o mínimo e somente o necessáriopara que o teste compile e passe

TDD

Implementa

Teste

TDD

Teste Verifique se o teste passou

TDD

Projeto

Implementa

TesteTeste E tudo de novo!

@dudumendes

Entendi!Já sei! TDD é um método

para testar software

@dudumendes

PEINNNNN!!!!!

@dudumendes

um método*para construir software

*método:

abordagem repetítivel - ciclo

para solucionar um determinado problema - aprendizado

TDD é