introdução ao tdd
DESCRIPTION
Contextualização e benefícios do desenvolvimento baseado em testesTRANSCRIPT
@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 é