SlideShare a Scribd company logo
1 of 37
Download to read offline
Desenvolvimento
Guiado por Testes
Test-Driven Development (TDD)

       Guilherme Chapiewski
          http://gc.blog.br
        gc@mandic.com.br
O que é TDD?
Regras fundamentais do TDD:
   Escreva o teste da implementação ANTES de
    escrevê-la

    Escreva somente código suficiente para o teste
    passar e nada além disso

    Escreva testes pequenos: teste a menor
    quantidade possível de código de cada vez

    Escreva testes muito rápidos: não devem
    demorar mais do que alguns segundos para
    serem executados
Etapas da programação com TDD:
1. Criar um teste
2. Executar todos os testes da aplicação para ver
   o novo teste falhar
3. Escrever a implementação testada
4. Executar os testes para ver se todos passarão
5. Refactoring
6. Executar os testes novamente para garantir
   que eles continuam passando
Conceitos
Tipos de testes:
• Testes Unitários
• Testes de Integração
• Testes de Aceitação
1. Testes Unitários:
   Testam apenas um componente do sistema

    Todos os outros componentes são simulados
    (mock objects)

    Ex. ferramentas: JUnit, JMock

    Fundamental para a prática do TDD!
2. Testes de Integração:
   Testam a integração entre componentes

    Envolvem dois ou mais componentes
    (classes+SGBD, classes+SGBD+webservices,
    vários layers da aplicação, etc.)

    Ex. ferramentas: JUnit, DBUnit, HSQLDB

    Normalmente não utilizado em TDD
3. Testes de Aceitação:
   Testam uma história, funcionalidade ou caso de
    uso

    Envolvem vários componentes do sistema

    Ex. ferramentas: JUnit, Selenium, Fit/FitNesse

    Utilizado em TDD
Demonstração
1. Definção da interface:
2. Criação do teste:
3. Execução do teste:
(deve falhar pois sequer há implementação)
4. Criação da classe de implementação:
(somente o esqueleto da classe retornando sempre o mesmo resultado)
5. Execução do teste:
(falhou porque a implementação desenvolvida sempre retorna FALSE)
6. Programação do método:
7. Execução do teste:
(teste passou: 100% de certeza que o código funciona!!!)
8. Refactoring:
9. Execução do teste:
(teste falhou por distração do programador: não verificou se cep é nulo!!!)
10. Corrigindo o refactor:
11. Execução do teste:
(teste passou: temos 100% de certeza que o código CONTINUA funcionando e que
    nenhum componente que depende deste código quebrou após o refactor)
Exemplos reais
Exemplo 1:
Exemplo 2:
Exemplo 3:
Consequências
Consequências:
   Suite de regressão
          Testes completos podem ser executados no build:
           aplicação não sobe para produção se não passar no teste
           de regressão
   Testes também pode ser feitos na IDE
        Não há necessidade de deploy da aplicação para
         execução dos testes
        Bugs são encontrados com maior facilidade e corrigidos

         com maior velocidade
   Bugs comprovados por testes unitários
Consequências:
   Código mais testável
       
           Estimula um design melhor
          Força que os designs antigos que são pouco testáveis
           sejam refatorados
   Facilita o refactoring

    Evita “overdesign”
          Só se escreve código suficiente para o teste passar
       
           Evita que o desenvolvedor tente adivinhar o futuro
   Colabora com a documentação
Consequências:
   Integração contínua
Consequências:
   Integração contínua
Conclusões
Conclusões:
   Colabora para o aumento da qualidade dos
    sistemas

    Desenvolvedores ficam mais corajosos e
    confiantes ao programar!

    Software cresce de forma ordenada e com
    qualidade de design

    Software se adapta com mais facilidade a
    mudanças
Conclusões:
   Demora mais?
Conclusões:
   Demora mais?
         
             No início é necessário escrever muitos testes
            Depois da inércia a suite de regressão está pronta e
             escrevem-se menos testes
         
             Certeza de que a implementação está funcionando
            Maioria dos bugs encontrados em tempo de
             desenvolvimento
         
             Bugs de produção são encontrados e corrigidos com
             muito mais velocidade
       Então no fim das contas demora-se muito menos
        tempo e com muito mais qualidade!
Perguntas?
Leitura complementar:
   Introduction to TDD: http://www.agiledata.org/essays/tdd.html

    Desenvolvimento Orientado a Testes:
    http://www.improveit.com.br/xp/praticas/tdd

    Screencast TDD em ação:
    http://dojofloripa.wordpress.com/2007/05/21/screencast-tdd-em-
    acao/

    Improve your unit tests by replacing your collaborators with mock
    objects: http://www.opensourcetutorials.com/tutorials/Server-Side-
    Coding/Java/java-unit-testing-with-mock-objects

    Behaviour-Driven Development: http://behaviour-driven.org/
Obrigado!

More Related Content

What's hot

Facilitando o desenvolvimento orientado a testes em aplicações PHP
Facilitando o desenvolvimento orientado a testes em aplicações PHPFacilitando o desenvolvimento orientado a testes em aplicações PHP
Facilitando o desenvolvimento orientado a testes em aplicações PHPPedro Chaves
 
DevOps Summit Brasil - O que não te contaram sobre Agile Testing
DevOps Summit Brasil - O que não te contaram sobre Agile TestingDevOps Summit Brasil - O que não te contaram sobre Agile Testing
DevOps Summit Brasil - O que não te contaram sobre Agile TestingSamanta Cicilia
 
DevQA - Da zona de conforto ao comprometimento com a Qualidade
DevQA - Da zona de conforto ao comprometimento com a QualidadeDevQA - Da zona de conforto ao comprometimento com a Qualidade
DevQA - Da zona de conforto ao comprometimento com a QualidadeKamilla Queiroz Xavier
 
[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes AutomatizadosSamanta Cicilia
 
Testes com TestLink e Selenium
Testes com TestLink e SeleniumTestes com TestLink e Selenium
Testes com TestLink e SeleniumAndré Thiago
 
Importância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsImportância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsSamanta Cicilia
 
TDC2018SP | Trilha Testes - Guia de sobrevivência do QA em DevOps
TDC2018SP | Trilha Testes - Guia de sobrevivência do QA em DevOpsTDC2018SP | Trilha Testes - Guia de sobrevivência do QA em DevOps
TDC2018SP | Trilha Testes - Guia de sobrevivência do QA em DevOpstdc-globalcode
 
Tester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitidoTester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitidoLeonardo Galani
 
Automação de Testes de Aceitação em Sistemas Web
Automação de Testes de Aceitação em Sistemas WebAutomação de Testes de Aceitação em Sistemas Web
Automação de Testes de Aceitação em Sistemas WebRodrigo Veiga
 
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvem
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvemMinas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvem
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvemStefan Teixeira
 
ATC BSB - Agile Testing
ATC BSB - Agile Testing ATC BSB - Agile Testing
ATC BSB - Agile Testing Samanta Cicilia
 
Meetup SP - O QA & a Especificação Por Exemplo
Meetup SP - O QA & a Especificação Por ExemploMeetup SP - O QA & a Especificação Por Exemplo
Meetup SP - O QA & a Especificação Por ExemploSamanta Cicilia
 
Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016Bruno Maomeh
 
Janaína Horácio - Terceirização - O desafio de garantir a Qualidade
Janaína Horácio - Terceirização - O desafio de garantir a QualidadeJanaína Horácio - Terceirização - O desafio de garantir a Qualidade
Janaína Horácio - Terceirização - O desafio de garantir a Qualidademinastestingconference
 
[MTC 2021] Tests smells: aquele cheirinho de que algo não está bom no seu cód...
[MTC 2021] Tests smells: aquele cheirinho de que algo não está bom no seu cód...[MTC 2021] Tests smells: aquele cheirinho de que algo não está bom no seu cód...
[MTC 2021] Tests smells: aquele cheirinho de que algo não está bom no seu cód...minastestingconference
 
TDD com Python e App Engine
TDD com Python e App EngineTDD com Python e App Engine
TDD com Python e App EngineRicardo Bánffy
 
Minas Testing Conference - Entrega Contínua
Minas Testing Conference - Entrega ContínuaMinas Testing Conference - Entrega Contínua
Minas Testing Conference - Entrega ContínuaSamanta Cicilia
 

What's hot (20)

Facilitando o desenvolvimento orientado a testes em aplicações PHP
Facilitando o desenvolvimento orientado a testes em aplicações PHPFacilitando o desenvolvimento orientado a testes em aplicações PHP
Facilitando o desenvolvimento orientado a testes em aplicações PHP
 
DevOps Summit Brasil - O que não te contaram sobre Agile Testing
DevOps Summit Brasil - O que não te contaram sobre Agile TestingDevOps Summit Brasil - O que não te contaram sobre Agile Testing
DevOps Summit Brasil - O que não te contaram sobre Agile Testing
 
DevQA - Da zona de conforto ao comprometimento com a Qualidade
DevQA - Da zona de conforto ao comprometimento com a QualidadeDevQA - Da zona de conforto ao comprometimento com a Qualidade
DevQA - Da zona de conforto ao comprometimento com a Qualidade
 
[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados
 
Testes com TestLink e Selenium
Testes com TestLink e SeleniumTestes com TestLink e Selenium
Testes com TestLink e Selenium
 
Importância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsImportância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOps
 
TDC2018SP | Trilha Testes - Guia de sobrevivência do QA em DevOps
TDC2018SP | Trilha Testes - Guia de sobrevivência do QA em DevOpsTDC2018SP | Trilha Testes - Guia de sobrevivência do QA em DevOps
TDC2018SP | Trilha Testes - Guia de sobrevivência do QA em DevOps
 
Tester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitidoTester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitido
 
Automação de Testes de Aceitação em Sistemas Web
Automação de Testes de Aceitação em Sistemas WebAutomação de Testes de Aceitação em Sistemas Web
Automação de Testes de Aceitação em Sistemas Web
 
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvem
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvemMinas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvem
Minas Testing Conference 2015 - Visual Regression Testing em ambientes na nuvem
 
ATC BSB - Agile Testing
ATC BSB - Agile Testing ATC BSB - Agile Testing
ATC BSB - Agile Testing
 
Meetup SP - O QA & a Especificação Por Exemplo
Meetup SP - O QA & a Especificação Por ExemploMeetup SP - O QA & a Especificação Por Exemplo
Meetup SP - O QA & a Especificação Por Exemplo
 
Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016
 
Palestra TDD Javou! #08 2016
Palestra TDD Javou! #08 2016Palestra TDD Javou! #08 2016
Palestra TDD Javou! #08 2016
 
Janaína Horácio - Terceirização - O desafio de garantir a Qualidade
Janaína Horácio - Terceirização - O desafio de garantir a QualidadeJanaína Horácio - Terceirização - O desafio de garantir a Qualidade
Janaína Horácio - Terceirização - O desafio de garantir a Qualidade
 
[MTC 2021] Tests smells: aquele cheirinho de que algo não está bom no seu cód...
[MTC 2021] Tests smells: aquele cheirinho de que algo não está bom no seu cód...[MTC 2021] Tests smells: aquele cheirinho de que algo não está bom no seu cód...
[MTC 2021] Tests smells: aquele cheirinho de que algo não está bom no seu cód...
 
Testes unitários e Mocks
Testes unitários e MocksTestes unitários e Mocks
Testes unitários e Mocks
 
TDD com Python e App Engine
TDD com Python e App EngineTDD com Python e App Engine
TDD com Python e App Engine
 
Minas Testing Conference - Entrega Contínua
Minas Testing Conference - Entrega ContínuaMinas Testing Conference - Entrega Contínua
Minas Testing Conference - Entrega Contínua
 
BDD em Ação
BDD em AçãoBDD em Ação
BDD em Ação
 

Similar to Desenvolvimento Guiado por Testes

Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitDomingos Teruel
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Diego Pacheco
 
Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesCamilo Ribeiro
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...Isaac de Souza
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de softwareHeider Lopes
 
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
 
Qualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALMQualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALMAdriano Bertucci
 
TDD (Test-Driven Development)
TDD (Test-Driven Development)TDD (Test-Driven Development)
TDD (Test-Driven Development)Renato Groff
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Gerenciamento da Qualidade de Software 4.pptx
Gerenciamento da Qualidade de Software 4.pptxGerenciamento da Qualidade de Software 4.pptx
Gerenciamento da Qualidade de Software 4.pptxRoberto Nunes
 
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
 
Integração Contínua
Integração ContínuaIntegração Contínua
Integração ContínuaScrumHalf Tool
 

Similar to Desenvolvimento Guiado por Testes (20)

Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnit
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1
 
Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por Testes
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software
 
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
 
Testes
TestesTestes
Testes
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
JUnit Sample
JUnit SampleJUnit Sample
JUnit Sample
 
Qualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALMQualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALM
 
Teste Driven Development
Teste Driven DevelopmentTeste Driven Development
Teste Driven Development
 
TDD (Test-Driven Development)
TDD (Test-Driven Development)TDD (Test-Driven Development)
TDD (Test-Driven Development)
 
Tdd x testes unidades
Tdd x testes unidadesTdd x testes unidades
Tdd x testes unidades
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Gerenciamento da Qualidade de Software 4.pptx
Gerenciamento da Qualidade de Software 4.pptxGerenciamento da Qualidade de Software 4.pptx
Gerenciamento da Qualidade de Software 4.pptx
 
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 na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
Integração Contínua
Integração ContínuaIntegração Contínua
Integração Contínua
 
TDD em 220V
TDD em 220VTDD em 220V
TDD em 220V
 

More from elliando dias

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slideselliando dias
 
Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScriptelliando dias
 
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data StructuresFunctional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structureselliando dias
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de containerelliando dias
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agilityelliando dias
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Librarieselliando dias
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!elliando dias
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Webelliando dias
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduinoelliando dias
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorceryelliando dias
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Designelliando dias
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makeselliando dias
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.elliando dias
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebookelliando dias
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Studyelliando dias
 

More from elliando dias (20)

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slides
 
Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScript
 
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data StructuresFunctional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structures
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de container
 
Geometria Projetiva
Geometria ProjetivaGeometria Projetiva
Geometria Projetiva
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agility
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!
 
Ragel talk
Ragel talkRagel talk
Ragel talk
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Web
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
 
Minicurso arduino
Minicurso arduinoMinicurso arduino
Minicurso arduino
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorcery
 
Rango
RangoRango
Rango
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Design
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makes
 
Hadoop + Clojure
Hadoop + ClojureHadoop + Clojure
Hadoop + Clojure
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebook
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Study
 

Desenvolvimento Guiado por Testes

  • 1. Desenvolvimento Guiado por Testes Test-Driven Development (TDD) Guilherme Chapiewski http://gc.blog.br gc@mandic.com.br
  • 2. O que é TDD?
  • 3. Regras fundamentais do TDD:  Escreva o teste da implementação ANTES de escrevê-la  Escreva somente código suficiente para o teste passar e nada além disso  Escreva testes pequenos: teste a menor quantidade possível de código de cada vez  Escreva testes muito rápidos: não devem demorar mais do que alguns segundos para serem executados
  • 4. Etapas da programação com TDD: 1. Criar um teste 2. Executar todos os testes da aplicação para ver o novo teste falhar 3. Escrever a implementação testada 4. Executar os testes para ver se todos passarão 5. Refactoring 6. Executar os testes novamente para garantir que eles continuam passando
  • 6. Tipos de testes: • Testes Unitários • Testes de Integração • Testes de Aceitação
  • 7. 1. Testes Unitários:  Testam apenas um componente do sistema  Todos os outros componentes são simulados (mock objects)  Ex. ferramentas: JUnit, JMock  Fundamental para a prática do TDD!
  • 8. 2. Testes de Integração:  Testam a integração entre componentes  Envolvem dois ou mais componentes (classes+SGBD, classes+SGBD+webservices, vários layers da aplicação, etc.)  Ex. ferramentas: JUnit, DBUnit, HSQLDB  Normalmente não utilizado em TDD
  • 9. 3. Testes de Aceitação:  Testam uma história, funcionalidade ou caso de uso  Envolvem vários componentes do sistema  Ex. ferramentas: JUnit, Selenium, Fit/FitNesse  Utilizado em TDD
  • 11. 1. Definção da interface:
  • 12. 2. Criação do teste:
  • 13. 3. Execução do teste: (deve falhar pois sequer há implementação)
  • 14. 4. Criação da classe de implementação: (somente o esqueleto da classe retornando sempre o mesmo resultado)
  • 15. 5. Execução do teste: (falhou porque a implementação desenvolvida sempre retorna FALSE)
  • 17. 7. Execução do teste: (teste passou: 100% de certeza que o código funciona!!!)
  • 19. 9. Execução do teste: (teste falhou por distração do programador: não verificou se cep é nulo!!!)
  • 20. 10. Corrigindo o refactor:
  • 21. 11. Execução do teste: (teste passou: temos 100% de certeza que o código CONTINUA funcionando e que nenhum componente que depende deste código quebrou após o refactor)
  • 27. Consequências:  Suite de regressão  Testes completos podem ser executados no build: aplicação não sobe para produção se não passar no teste de regressão  Testes também pode ser feitos na IDE  Não há necessidade de deploy da aplicação para execução dos testes  Bugs são encontrados com maior facilidade e corrigidos com maior velocidade  Bugs comprovados por testes unitários
  • 28. Consequências:  Código mais testável  Estimula um design melhor  Força que os designs antigos que são pouco testáveis sejam refatorados  Facilita o refactoring  Evita “overdesign”  Só se escreve código suficiente para o teste passar  Evita que o desenvolvedor tente adivinhar o futuro  Colabora com a documentação
  • 29. Consequências:  Integração contínua
  • 30. Consequências:  Integração contínua
  • 32. Conclusões:  Colabora para o aumento da qualidade dos sistemas  Desenvolvedores ficam mais corajosos e confiantes ao programar!  Software cresce de forma ordenada e com qualidade de design  Software se adapta com mais facilidade a mudanças
  • 33. Conclusões:  Demora mais?
  • 34. Conclusões:  Demora mais?  No início é necessário escrever muitos testes  Depois da inércia a suite de regressão está pronta e escrevem-se menos testes  Certeza de que a implementação está funcionando  Maioria dos bugs encontrados em tempo de desenvolvimento  Bugs de produção são encontrados e corrigidos com muito mais velocidade  Então no fim das contas demora-se muito menos tempo e com muito mais qualidade!
  • 36. Leitura complementar:  Introduction to TDD: http://www.agiledata.org/essays/tdd.html  Desenvolvimento Orientado a Testes: http://www.improveit.com.br/xp/praticas/tdd  Screencast TDD em ação: http://dojofloripa.wordpress.com/2007/05/21/screencast-tdd-em- acao/  Improve your unit tests by replacing your collaborators with mock objects: http://www.opensourcetutorials.com/tutorials/Server-Side- Coding/Java/java-unit-testing-with-mock-objects  Behaviour-Driven Development: http://behaviour-driven.org/