SlideShare une entreprise Scribd logo
1  sur  22
Aislan Fernandes
           @aislanfp
aislanfp@gmail.com
Roteiro
 Contextos
 Conceitos
 Ferramentas
 Técnicas
 Demonstração
Referências
 KOSKELA, Lasse. Test Driven: Pratictal
  TDD and Acceptance TDD for Java
  Developers. Manning. Greenwich, 2008.
 FOWLER, Martin. Refactoring:
  Improving the Design of Existing Code.
  Addison-Wesley. 1999.
 BECK, Kent. Programação Extrema
  (XP) Explicada – Acolha as mudanças.
  Porto Alegre: Bookman, 2004.
Contexto Maior (Organização)
    Software            Mudanças
                           Custo




               Escopo
                        Projeto       Tempo




                          Qualidade


                                              Engenharia
                                              de Software
Contexto Menor (Equipe)
     “Mudança é uma constante, o problema é falta de habilidade”*


 O custo da mudança não é
  exponencial mas achatado                         Metodologias Ágeis
 Não há aquele código difícil de
  modificar , acompanhado de
  medo e da falta de testes para                   Iterativo e Incremental
  verificar se houve efeito
  colateral.                                        XP     Scrum    PU**
 TDD é um ingrediente chave 

                  * BECK, 2004; **LARMAN, Craig.
Conceito
 TDD não é desenvolvimento com testes!




    Regra 10 de Myers
     Quanto mais cedo
     defeito descoberto
   menor custo de correção
Conceito
 TDD = fazer certo
 TDD = Test-code-refactor
 TDD = Red-green-refactor
 TDD = Test Driven Development
 TDD = Test Driven Design
 TDD = Test-First Programming

 “Infectado por Testes”* = não codificar sem teste antes

    Acceptance TDD (ATDD) = fazer a coisa certa ≈ BDD


                    * Erich Gamma
Objetivos*  Benefícios
 Encorajar um bom design                                 Testes
 Produzir código testável
 Evitar engenharia excessiva ou pesada                   Revelar falhas

 Evitar código mal escrito, difícil de
  entender e de mudar                                     Mostrar que
                                                          faz o que deve
 Cortar o tempo em tarefas não                           ser feito

  produtivas:
     Debugging                               100%        Revelar design

     Resolvendo bugs
     Entendendo código ilegível                          Especificar em
                                                          exemplos
        Programar e testar ao mesmo tempo é mais rápido
                   do que apenas programar!
                  * KOSKELA, 2008
Funcionamento
 Ciclo TDD  Escreva o teste, e somente então escreva o
  código para passar no teste. Por fim, transforme o design
  atual num melhor (refactor).
 Repetição dos ciclos TDD = design evolucionário
    Quando parar?
    Ponto de satisfação ≈ conhecimento de padrões de projeto



                        Test        Code       Refactor


        “Os testes me dão a chance de pensar sobre o que eu quero
                 independentemente da implementação.”*

                  * BECK, 2004
Design Evolucionário
 Feedback imediato  design somente evolui quando
 efetiva e objetivamente o usamos, escrevendo o teste
 antes*
   Escrever teste = decidir sobre design
 Focado no presente  menos custoso
    Uso de code coverage  gordura?
    Priorizado em histórias
 “Quando você acrescenta mais ao projeto hoje, você
aumenta a sobrecarga do sistema. Há mais coisas para
           testar, entender e explicar”**
      “Os problemas de hoje já são suficientes”**
                   * KOSKELA, 2008 ** BECK, 2004
Design Evolucionário
 Testar + Refatorar  Escrever testes antes promove um
 certo nível de testabilidade, porém é preciso estar
 consciente de não construir um que funciona agora
 mas pode explodir em breve *

                            Design Testável
     Prefira composição em vez                         Procure isolar e injetar
              de herança                                   dependências

                                  Melhor
                                                                     Melhor testabilidade e
       Mais código      testabilidade, flexibilidade   Mais código
                                                                         manutenção
                              e manutenção



                     * KOSKELA, 2008
Refactoring
 Técnica para reestruturar um código
  existente, alterando sua estrutura interna sem alterar
  seu comportamento externo*
 Disciplinado
   Não prevemos e nem nos preparamos para problemas de
    design antes de ter um em mãos, evitando criar mais
    problemas
 Padronizado
    Remoção de código duplicado
    Problemas específicos
                  * FOWLER, 1999
Ferramentas
 Frameworks
    EasyMock
    JUnit
    DBUnit


 Integração Contínua
    Hudson              Análise Estática
                            EMMA  Code
    TeamCity
                             Coverage
    Apache Continuum
                            PMD  Duplicação e
                             padrões
EasyMock                                   Mocks


                                            Fakes
 Má Prática  classes
  vazias como mocks
 Foco  preocupação                        Stubs

  com teste e não com
  ambiente                                 ITranslator mockTranslator =
                                         createMock(ITranslator.class);
 Problemas  erros de    Greeting greeting = new Greeting(mockTranslator);
                           expect(mockTranslator.translate("English",
  compilação nos testes     "Hindi", "Hello")).andReturn("Namaste");
  quando mudam as                              replay(mockTranslator);
                                              assertEquals("Namaste Paulo",
  interfaces                            greeting.sayHello("Hindi", "Paulo"));
                                                verify(mockTranslator);
Integração Contínua
 Médio e longo prazo  repositório de testes difíceis de
 gerenciar individualmente
   Não é possível executar todos os testes
   Executar suite de testes a cada pequena mudança
    permite um feedback imediato
Implementação
           Decomposição                    Programação
            de requisito                   por intenção

 Decomposição de Requisito*  criar uma lista de
 testes em vez de tarefas
   Foco no que é necessário e não no que poderia ser feito
 Programação por Intenção*  escrever teste sem
 código algum, como se o código existisse!
   Foco no que necessitamos e não no que temos

       Teste é algo um pouco mais concreto, mais executável, mais
                     exemplificativo do que o requisito
                * KOSKELA, 2008
Implementação
 Qual teste selecionar?
 Estratégias*
    “Primeiro pelos Detalhes” X “Primeiro pelo Todo”
    Incerto X Familiar
    Maior Valor X Menor Valor
    “Caminho Feliz” X Situações de Erro


       Não há fórmula mágica!




                 * KOSKELA, 2008
Implementação
 Etapas*
    Faking
    Triangulação
    Implementação Óbvia
 Faking
    Passo mais fácil para o teste
     passar (red  green)
    Ter um momento mais
     concreto
    Comece retornando valores
     hardcoding
                * KOSKELA, 2008
Implementação
 Triangulação  transformar
  código fake em código de
  produção
    Os testes levam à solução
     correta
    Triangular = variar testes com
     novos valores

 Implementação Óbvia
    Após triangulação, o trabalho restante vai parecer óbvio
     ou bem mais natural
Demonstração
                            X LTDA          M SA
  História       História
                    3
     1
                             Mostra 1 em    Tudo em 2
         História             1 semana       semanas
             2



                              Mudança!      Mudança!!!


                                            Talvez não
                             Aceita e não
                                             entregue
                             entrega a 3.
                                              nada!
Demonstração
          X LTDA          M SA
                           Design 
           TDD história
                          programação
                1
                             testes


           Mudança       Mudança 
           refactoring    adeus testes!


           Maior valor    Retrabalho e
             ficou!       muita reza!
Considerações Finais
 Boas práticas
    Qualidade do teste  atômico e enxuto
    Granularidade do código = teste
 Outras aplicações
    Código legado
    Interface gráfica
 Dificuldades
    Trabalho em equipe (coesão alta)
    Cultura (pré-conceito e atitude)
    Conhecimento de padrões
 Curso de TDD

Contenu connexe

Tendances

Coding Dojo - Funcionamento
Coding Dojo - FuncionamentoCoding Dojo - Funcionamento
Coding Dojo - Funcionamentothiagodp
 
IBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em TestesIBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em TestesFelipe Freire
 
Desenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por testeDesenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por testeUniversidade Tiradentes
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshopguestd37c23
 
Bate-papo com Especialista Terra XP
Bate-papo com Especialista Terra XPBate-papo com Especialista Terra XP
Bate-papo com Especialista Terra XPWildtech
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehaveMarcelo Zeferino
 
Desenvolvimento de Software com Extreme Programming (XP)
Desenvolvimento de Software com Extreme Programming (XP)Desenvolvimento de Software com Extreme Programming (XP)
Desenvolvimento de Software com Extreme Programming (XP)Fernando Kenji Kamei
 
Apresentando Extreme Programming
Apresentando Extreme ProgrammingApresentando Extreme Programming
Apresentando Extreme ProgrammingMilfont Consulting
 
Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Especificação por meio de exemplos (BDD, testes de aceitação, ...)Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Especificação por meio de exemplos (BDD, testes de aceitação, ...)Fábio Nogueira de Lucena
 
Desmistificando agile testing tdc 2011
Desmistificando agile testing tdc 2011Desmistificando agile testing tdc 2011
Desmistificando agile testing tdc 2011tatiane_fukuda
 

Tendances (20)

Coding Dojo - Funcionamento
Coding Dojo - FuncionamentoCoding Dojo - Funcionamento
Coding Dojo - Funcionamento
 
Test First, TDD e outros Bichos
Test First, TDD e outros BichosTest First, TDD e outros Bichos
Test First, TDD e outros Bichos
 
IBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em TestesIBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em Testes
 
Desenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por testeDesenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por teste
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshop
 
Dívida Técnica
Dívida TécnicaDívida Técnica
Dívida Técnica
 
Bate-papo com Especialista Terra XP
Bate-papo com Especialista Terra XPBate-papo com Especialista Terra XP
Bate-papo com Especialista Terra XP
 
TDD na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehave
 
Desenvolvimento de Software com Extreme Programming (XP)
Desenvolvimento de Software com Extreme Programming (XP)Desenvolvimento de Software com Extreme Programming (XP)
Desenvolvimento de Software com Extreme Programming (XP)
 
Extreme Programming
Extreme ProgrammingExtreme Programming
Extreme Programming
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
Apresentando Extreme Programming
Apresentando Extreme ProgrammingApresentando Extreme Programming
Apresentando Extreme Programming
 
Qualidade e Testes de Software
Qualidade e Testes de SoftwareQualidade e Testes de Software
Qualidade e Testes de Software
 
Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Especificação por meio de exemplos (BDD, testes de aceitação, ...)Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Especificação por meio de exemplos (BDD, testes de aceitação, ...)
 
TDD para Java EE
TDD para Java EETDD para Java EE
TDD para Java EE
 
Tdd x testes unidades
Tdd x testes unidadesTdd x testes unidades
Tdd x testes unidades
 
Extreme Programming
Extreme ProgrammingExtreme Programming
Extreme Programming
 
Desmistificando agile testing tdc 2011
Desmistificando agile testing tdc 2011Desmistificando agile testing tdc 2011
Desmistificando agile testing tdc 2011
 
eXtreme Programming (XP)
eXtreme Programming (XP)eXtreme Programming (XP)
eXtreme Programming (XP)
 

En vedette (11)

Extreme programming
Extreme programmingExtreme programming
Extreme programming
 
Curso Xp
Curso XpCurso Xp
Curso Xp
 
Introdução ao XP
Introdução ao XPIntrodução ao XP
Introdução ao XP
 
Parear é um pouco mais que sentar ao lado
Parear é um pouco mais que sentar ao ladoParear é um pouco mais que sentar ao lado
Parear é um pouco mais que sentar ao lado
 
Extreme Programming
Extreme ProgrammingExtreme Programming
Extreme Programming
 
Xp - extreme programing
Xp - extreme programingXp - extreme programing
Xp - extreme programing
 
Trabalho xp
Trabalho xpTrabalho xp
Trabalho xp
 
Agile User Experience
Agile User ExperienceAgile User Experience
Agile User Experience
 
eXtreme Programming (xp)
eXtreme Programming (xp)eXtreme Programming (xp)
eXtreme Programming (xp)
 
Desenvolvimento de Software
Desenvolvimento de SoftwareDesenvolvimento de Software
Desenvolvimento de Software
 
Extreme programming (xp)
 Extreme programming   (xp) Extreme programming   (xp)
Extreme programming (xp)
 

Similaire à TDD: Conceitos, Técnicas e Demonstração

Os Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareOs Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareDextra Sistemas / Etec Itu
 
TDD - Pós Graduação em Engenharia de Software Ágil
TDD - Pós Graduação em Engenharia de Software ÁgilTDD - Pós Graduação em Engenharia de Software Ágil
TDD - Pós Graduação em Engenharia de Software ÁgilBruno Eustáquio
 
Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Wellington Moreira
 
Greenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresaGreenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresaRafael Ponte
 
Como TDD pode influenciar na construção do seu Produto?
Como TDD pode influenciar na construção do seu Produto?Como TDD pode influenciar na construção do seu Produto?
Como TDD pode influenciar na construção do seu Produto?Raphael Paiva
 
TDD: A Essência do Mantra
TDD: A Essência do MantraTDD: A Essência do Mantra
TDD: A Essência do MantraDionatan default
 
Tdd not sure if testing or developing
Tdd  not sure if testing or developingTdd  not sure if testing or developing
Tdd not sure if testing or developingRenato Oliveira
 
Introdução ao TDD nas soluções Global AppCasting
Introdução ao TDD nas soluções Global AppCastingIntrodução ao TDD nas soluções Global AppCasting
Introdução ao TDD nas soluções Global AppCastingPedro Pereira Martins
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Diego Pacheco
 
Introdução ao TDD (Test-Driven Development) - #guma10anos
Introdução ao TDD (Test-Driven Development) - #guma10anosIntrodução ao TDD (Test-Driven Development) - #guma10anos
Introdução ao TDD (Test-Driven Development) - #guma10anosDionatan default
 
Desenvolvimento Guiado por Testes
Desenvolvimento Guiado por TestesDesenvolvimento Guiado por Testes
Desenvolvimento Guiado por Testeselliando dias
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaRogerio Fontes
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"thiagobapt
 
Desenvolvimento orientado a testes
Desenvolvimento orientado a testesDesenvolvimento orientado a testes
Desenvolvimento orientado a testesCarlos Santana
 

Similaire à TDD: Conceitos, Técnicas e Demonstração (20)

TDD
TDDTDD
TDD
 
Os Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareOs Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de software
 
TDD - Pós Graduação em Engenharia de Software Ágil
TDD - Pós Graduação em Engenharia de Software ÁgilTDD - Pós Graduação em Engenharia de Software Ágil
TDD - Pós Graduação em Engenharia de Software Ágil
 
Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?
 
RealDay: Introduction to TDD
RealDay: Introduction to TDDRealDay: Introduction to TDD
RealDay: Introduction to TDD
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
Greenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresaGreenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresa
 
Como TDD pode influenciar na construção do seu Produto?
Como TDD pode influenciar na construção do seu Produto?Como TDD pode influenciar na construção do seu Produto?
Como TDD pode influenciar na construção do seu Produto?
 
TDD: A Essência do Mantra
TDD: A Essência do MantraTDD: A Essência do Mantra
TDD: A Essência do Mantra
 
Teste automatizados e tdd
Teste automatizados e tddTeste automatizados e tdd
Teste automatizados e tdd
 
Tdd not sure if testing or developing
Tdd  not sure if testing or developingTdd  not sure if testing or developing
Tdd not sure if testing or developing
 
Bdd&tdd
Bdd&tddBdd&tdd
Bdd&tdd
 
Introdução ao TDD nas soluções Global AppCasting
Introdução ao TDD nas soluções Global AppCastingIntrodução ao TDD nas soluções Global AppCasting
Introdução ao TDD nas soluções Global AppCasting
 
Introdução a TDD
Introdução a TDDIntrodução a TDD
Introdução a TDD
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1
 
Introdução ao TDD (Test-Driven Development) - #guma10anos
Introdução ao TDD (Test-Driven Development) - #guma10anosIntrodução ao TDD (Test-Driven Development) - #guma10anos
Introdução ao TDD (Test-Driven Development) - #guma10anos
 
Desenvolvimento Guiado por Testes
Desenvolvimento Guiado por TestesDesenvolvimento Guiado por Testes
Desenvolvimento Guiado por Testes
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis Uberlândia
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"
 
Desenvolvimento orientado a testes
Desenvolvimento orientado a testesDesenvolvimento orientado a testes
Desenvolvimento orientado a testes
 

Plus de Aislan Fernandes

O Pragmatismo Analítico de Brandom: Apresentando um Metavocabulário Pragmático
O Pragmatismo Analítico de Brandom: Apresentando um Metavocabulário PragmáticoO Pragmatismo Analítico de Brandom: Apresentando um Metavocabulário Pragmático
O Pragmatismo Analítico de Brandom: Apresentando um Metavocabulário PragmáticoAislan Fernandes
 
Como a engenharia de software surgiu de uma crise científica
Como a engenharia de software surgiu de uma crise científicaComo a engenharia de software surgiu de uma crise científica
Como a engenharia de software surgiu de uma crise científicaAislan Fernandes
 
Ciência e Dialética em Aristóteles: uma discussão para a atualidade
Ciência e Dialética em Aristóteles: uma discussão para a atualidadeCiência e Dialética em Aristóteles: uma discussão para a atualidade
Ciência e Dialética em Aristóteles: uma discussão para a atualidadeAislan Fernandes
 
UM INSTRUMENTO DE COLETA DE DADOS PARA DETECÇÃO DE PROBLEMAS DE AVALIAÇÃO DO ...
UM INSTRUMENTO DE COLETA DE DADOS PARA DETECÇÃO DE PROBLEMAS DE AVALIAÇÃO DO ...UM INSTRUMENTO DE COLETA DE DADOS PARA DETECÇÃO DE PROBLEMAS DE AVALIAÇÃO DO ...
UM INSTRUMENTO DE COLETA DE DADOS PARA DETECÇÃO DE PROBLEMAS DE AVALIAÇÃO DO ...Aislan Fernandes
 
TRABALHO EM EQUIPES AUTOGERENCIADAS: UMA ANÁLISE DA ADOÇÃO DO SCRUM EM UMA EM...
TRABALHO EM EQUIPES AUTOGERENCIADAS: UMA ANÁLISE DA ADOÇÃO DO SCRUM EM UMA EM...TRABALHO EM EQUIPES AUTOGERENCIADAS: UMA ANÁLISE DA ADOÇÃO DO SCRUM EM UMA EM...
TRABALHO EM EQUIPES AUTOGERENCIADAS: UMA ANÁLISE DA ADOÇÃO DO SCRUM EM UMA EM...Aislan Fernandes
 

Plus de Aislan Fernandes (8)

O Pragmatismo Analítico de Brandom: Apresentando um Metavocabulário Pragmático
O Pragmatismo Analítico de Brandom: Apresentando um Metavocabulário PragmáticoO Pragmatismo Analítico de Brandom: Apresentando um Metavocabulário Pragmático
O Pragmatismo Analítico de Brandom: Apresentando um Metavocabulário Pragmático
 
Filosofia de leibniz
Filosofia de leibnizFilosofia de leibniz
Filosofia de leibniz
 
Como a engenharia de software surgiu de uma crise científica
Como a engenharia de software surgiu de uma crise científicaComo a engenharia de software surgiu de uma crise científica
Como a engenharia de software surgiu de uma crise científica
 
Locke II, 1-8
Locke II, 1-8Locke II, 1-8
Locke II, 1-8
 
Ciência e Dialética em Aristóteles: uma discussão para a atualidade
Ciência e Dialética em Aristóteles: uma discussão para a atualidadeCiência e Dialética em Aristóteles: uma discussão para a atualidade
Ciência e Dialética em Aristóteles: uma discussão para a atualidade
 
UM INSTRUMENTO DE COLETA DE DADOS PARA DETECÇÃO DE PROBLEMAS DE AVALIAÇÃO DO ...
UM INSTRUMENTO DE COLETA DE DADOS PARA DETECÇÃO DE PROBLEMAS DE AVALIAÇÃO DO ...UM INSTRUMENTO DE COLETA DE DADOS PARA DETECÇÃO DE PROBLEMAS DE AVALIAÇÃO DO ...
UM INSTRUMENTO DE COLETA DE DADOS PARA DETECÇÃO DE PROBLEMAS DE AVALIAÇÃO DO ...
 
TRABALHO EM EQUIPES AUTOGERENCIADAS: UMA ANÁLISE DA ADOÇÃO DO SCRUM EM UMA EM...
TRABALHO EM EQUIPES AUTOGERENCIADAS: UMA ANÁLISE DA ADOÇÃO DO SCRUM EM UMA EM...TRABALHO EM EQUIPES AUTOGERENCIADAS: UMA ANÁLISE DA ADOÇÃO DO SCRUM EM UMA EM...
TRABALHO EM EQUIPES AUTOGERENCIADAS: UMA ANÁLISE DA ADOÇÃO DO SCRUM EM UMA EM...
 
Motivação
MotivaçãoMotivação
Motivação
 

TDD: Conceitos, Técnicas e Demonstração

  • 1. Aislan Fernandes @aislanfp aislanfp@gmail.com
  • 2. Roteiro  Contextos  Conceitos  Ferramentas  Técnicas  Demonstração
  • 3. Referências  KOSKELA, Lasse. Test Driven: Pratictal TDD and Acceptance TDD for Java Developers. Manning. Greenwich, 2008.  FOWLER, Martin. Refactoring: Improving the Design of Existing Code. Addison-Wesley. 1999.  BECK, Kent. Programação Extrema (XP) Explicada – Acolha as mudanças. Porto Alegre: Bookman, 2004.
  • 4. Contexto Maior (Organização) Software Mudanças Custo Escopo Projeto Tempo Qualidade Engenharia de Software
  • 5. Contexto Menor (Equipe) “Mudança é uma constante, o problema é falta de habilidade”*  O custo da mudança não é exponencial mas achatado Metodologias Ágeis  Não há aquele código difícil de modificar , acompanhado de medo e da falta de testes para Iterativo e Incremental verificar se houve efeito colateral. XP Scrum PU**  TDD é um ingrediente chave  * BECK, 2004; **LARMAN, Craig.
  • 6. Conceito  TDD não é desenvolvimento com testes! Regra 10 de Myers Quanto mais cedo defeito descoberto menor custo de correção
  • 7. Conceito  TDD = fazer certo  TDD = Test-code-refactor  TDD = Red-green-refactor  TDD = Test Driven Development  TDD = Test Driven Design  TDD = Test-First Programming “Infectado por Testes”* = não codificar sem teste antes Acceptance TDD (ATDD) = fazer a coisa certa ≈ BDD * Erich Gamma
  • 8. Objetivos*  Benefícios  Encorajar um bom design Testes  Produzir código testável  Evitar engenharia excessiva ou pesada Revelar falhas  Evitar código mal escrito, difícil de entender e de mudar Mostrar que faz o que deve  Cortar o tempo em tarefas não ser feito produtivas:  Debugging 100% Revelar design  Resolvendo bugs  Entendendo código ilegível Especificar em exemplos Programar e testar ao mesmo tempo é mais rápido do que apenas programar! * KOSKELA, 2008
  • 9. Funcionamento  Ciclo TDD  Escreva o teste, e somente então escreva o código para passar no teste. Por fim, transforme o design atual num melhor (refactor).  Repetição dos ciclos TDD = design evolucionário  Quando parar?  Ponto de satisfação ≈ conhecimento de padrões de projeto Test Code Refactor “Os testes me dão a chance de pensar sobre o que eu quero independentemente da implementação.”* * BECK, 2004
  • 10. Design Evolucionário  Feedback imediato  design somente evolui quando efetiva e objetivamente o usamos, escrevendo o teste antes*  Escrever teste = decidir sobre design  Focado no presente  menos custoso  Uso de code coverage  gordura?  Priorizado em histórias “Quando você acrescenta mais ao projeto hoje, você aumenta a sobrecarga do sistema. Há mais coisas para testar, entender e explicar”** “Os problemas de hoje já são suficientes”** * KOSKELA, 2008 ** BECK, 2004
  • 11. Design Evolucionário  Testar + Refatorar  Escrever testes antes promove um certo nível de testabilidade, porém é preciso estar consciente de não construir um que funciona agora mas pode explodir em breve * Design Testável Prefira composição em vez Procure isolar e injetar de herança dependências Melhor Melhor testabilidade e Mais código testabilidade, flexibilidade Mais código manutenção e manutenção * KOSKELA, 2008
  • 12. Refactoring  Técnica para reestruturar um código existente, alterando sua estrutura interna sem alterar seu comportamento externo*  Disciplinado  Não prevemos e nem nos preparamos para problemas de design antes de ter um em mãos, evitando criar mais problemas  Padronizado  Remoção de código duplicado  Problemas específicos * FOWLER, 1999
  • 13. Ferramentas  Frameworks  EasyMock  JUnit  DBUnit  Integração Contínua  Hudson  Análise Estática  EMMA  Code  TeamCity Coverage  Apache Continuum  PMD  Duplicação e padrões
  • 14. EasyMock Mocks Fakes  Má Prática  classes vazias como mocks  Foco  preocupação Stubs com teste e não com ambiente ITranslator mockTranslator = createMock(ITranslator.class);  Problemas  erros de Greeting greeting = new Greeting(mockTranslator); expect(mockTranslator.translate("English", compilação nos testes "Hindi", "Hello")).andReturn("Namaste"); quando mudam as replay(mockTranslator); assertEquals("Namaste Paulo", interfaces greeting.sayHello("Hindi", "Paulo")); verify(mockTranslator);
  • 15. Integração Contínua  Médio e longo prazo  repositório de testes difíceis de gerenciar individualmente  Não é possível executar todos os testes  Executar suite de testes a cada pequena mudança permite um feedback imediato
  • 16. Implementação Decomposição Programação de requisito por intenção  Decomposição de Requisito*  criar uma lista de testes em vez de tarefas  Foco no que é necessário e não no que poderia ser feito  Programação por Intenção*  escrever teste sem código algum, como se o código existisse!  Foco no que necessitamos e não no que temos Teste é algo um pouco mais concreto, mais executável, mais exemplificativo do que o requisito * KOSKELA, 2008
  • 17. Implementação  Qual teste selecionar?  Estratégias*  “Primeiro pelos Detalhes” X “Primeiro pelo Todo”  Incerto X Familiar  Maior Valor X Menor Valor  “Caminho Feliz” X Situações de Erro Não há fórmula mágica! * KOSKELA, 2008
  • 18. Implementação  Etapas*  Faking  Triangulação  Implementação Óbvia  Faking  Passo mais fácil para o teste passar (red  green)  Ter um momento mais concreto  Comece retornando valores hardcoding * KOSKELA, 2008
  • 19. Implementação  Triangulação  transformar código fake em código de produção  Os testes levam à solução correta  Triangular = variar testes com novos valores  Implementação Óbvia  Após triangulação, o trabalho restante vai parecer óbvio ou bem mais natural
  • 20. Demonstração X LTDA M SA História História 3 1 Mostra 1 em Tudo em 2 História 1 semana semanas 2 Mudança! Mudança!!! Talvez não Aceita e não entregue entrega a 3. nada!
  • 21. Demonstração X LTDA M SA Design  TDD história programação 1  testes Mudança  Mudança  refactoring adeus testes! Maior valor Retrabalho e ficou! muita reza!
  • 22. Considerações Finais  Boas práticas  Qualidade do teste  atômico e enxuto  Granularidade do código = teste  Outras aplicações  Código legado  Interface gráfica  Dificuldades  Trabalho em equipe (coesão alta)  Cultura (pré-conceito e atitude)  Conhecimento de padrões  Curso de TDD