Agenda O 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
O que é TDD? Técnica de desenvolvimento de software Testes unitários automatizados Test-first programming (da XP) Processo formado por pequenas iterações
O que é TDD? Já sei, é um método para  testar  software!
O que é TDD? Não é um método para testar software É um método para  construir  software
O que é TDD? Através do processo “vermelho-verde-refatorar”
O que é TDD? Com “código limpo que funciona” (Ron Jefrries)
Quem inventou? Não sei… Mas um criador de cabras que redescobriu TDD. @kentbeck
Espiral da morte “sem tempo para testar”
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
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
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
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
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
Padrões do TDD Como assim?
Padrões do TDD Como assim?
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
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
Padrões do TDD Use dados evidentes
Padrões do TDD Ao invés de…
Padrões do TDD Live code!
Red Bar Patterns Quando e onde escrever os testes? Quando parar?
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
Red Bar Patterns Primeiro teste Não comece pelo mais completo Comece pelo menor Comece pelo mais simples
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
Testing Patterns Técnicas mais detalhadas de como escrever testes Hum… legal!
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
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)
Green Bar Patterns Padrões para fazer o teste passar Como fazer um teste vermelho ficar verde rapidamente?
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
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)
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
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
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
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
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
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
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
Dominando TDD Perguntas que surgem ao iniciar com TDD.
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
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
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)
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
Como aprender TDD Leia livros
Como aprender TDD Assista vídeos na internet de pessoas usando TDD
Como aprender TDD Estude códigos de projetos que usam TDD
Como aprender TDD Pratique muito
Perguntas? Thiago Faria de Andrade [email_address] @thiagofandrade Obrigado! www.algaworks.com @algaworks Normandes Júnior [email_address] @normandesjr

Introdução ao TDD

  • 1.
  • 2.
    Agenda O 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
  • 3.
    O que éTDD? Técnica de desenvolvimento de software Testes unitários automatizados Test-first programming (da XP) Processo formado por pequenas iterações
  • 4.
    O que éTDD? Já sei, é um método para testar software!
  • 5.
    O que éTDD? Não é um método para testar software É um método para construir software
  • 6.
    O que éTDD? Através do processo “vermelho-verde-refatorar”
  • 7.
    O que éTDD? Com “código limpo que funciona” (Ron Jefrries)
  • 8.
    Quem inventou? Nãosei… Mas um criador de cabras que redescobriu TDD. @kentbeck
  • 9.
    Espiral da morte“sem tempo para testar”
  • 10.
    Benefícios Testes unitáriossempre 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
  • 11.
    Padrões do TDDCrie 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
  • 12.
    Padrões do TDDCrie testes isolados uns dos outros Um teste não pode depender de outro Deve ser possível executar um teste isoladamente
  • 13.
    Padrões do TDDTeste 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
  • 14.
    Padrões do TDDAssertiva 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
  • 15.
    Padrões do TDDComo assim?
  • 16.
    Padrões do TDDComo assim?
  • 17.
    Padrões do TDDDados para teste Não use números mágicos Evite passar o mesmo valor para diferentes parâmetros Use dados do mundo real
  • 18.
    Padrões do TDDUse 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
  • 19.
    Padrões do TDDUse dados evidentes
  • 20.
    Padrões do TDDAo invés de…
  • 21.
    Padrões do TDDLive code!
  • 22.
    Red Bar PatternsQuando e onde escrever os testes? Quando parar?
  • 23.
    Red Bar PatternsUm 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
  • 24.
    Red Bar PatternsPrimeiro teste Não comece pelo mais completo Comece pelo menor Comece pelo mais simples
  • 25.
    Red Bar PatternsTeste 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
  • 26.
    Testing Patterns Técnicasmais detalhadas de como escrever testes Hum… legal!
  • 27.
    Testing Patterns Testesmenores 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
  • 28.
    Testing Patterns Objetosdublê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)
  • 29.
    Green Bar PatternsPadrões para fazer o teste passar Como fazer um teste vermelho ficar verde rapidamente?
  • 30.
    Green Bar PatternsFalsifique 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
  • 31.
    Green Bar PatternsTriangulaçã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)
  • 32.
    Green Bar PatternsImplementaçã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
  • 33.
    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
  • 34.
    Padrões xUnit AsserçõesEscreva 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
  • 35.
    Padrões xUnit Métodode 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
  • 36.
    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
  • 37.
    Refatoração Reconcilie diferençasDuas 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
  • 38.
    Refatoração Extraia métodosComo 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
  • 39.
    Dominando TDD Perguntasque surgem ao iniciar com TDD.
  • 40.
    Dominando TDD Qualo 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
  • 41.
    Dominando TDD Oque você precisa testar? Você encontrará essa resposta praticando Teste condições, loops, operações, polimorfismo Teste apenas códigos que você escreve
  • 42.
    Dominando TDD Comovocê 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)
  • 43.
    Dominando TDD Comomigrar 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
  • 44.
    Como aprender TDDLeia livros
  • 45.
    Como aprender TDDAssista vídeos na internet de pessoas usando TDD
  • 46.
    Como aprender TDDEstude códigos de projetos que usam TDD
  • 47.
    Como aprender TDDPratique muito
  • 48.
    Perguntas? Thiago Fariade Andrade [email_address] @thiagofandrade Obrigado! www.algaworks.com @algaworks Normandes Júnior [email_address] @normandesjr