SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
Padrões para Desenvolvimento
de Software Guiado por Testes

     Tech Talk Coquelux
             Mantra
      Vermelho/verde/refatorar


         Everton Rodrigues
"TDD é uma forma de administrar o
  medo durante a programação"

Quanto mais estresse voce sentir,
       menos vai testar.

 Quanto menos voce testar, mais
      erros vai acontecer.

 Quanto mais erros voce cometer,
    mais estresse vai sentir.
Questão

 Porque conhecer Padrões
para TDD, o que vai ajudar?
Padrões para TDD ajudam a
     responder as perguntas:

- O que queremos dizer com
testar?
- Quanto testamos?
- Como escolhemos que logica
testar?
- Como escolhemos quais dados
testar?
Testes isolados

 "Faça testes tão rapidos de executar que
    possa roda-los sozinho e roda-los
             frequentemente"

"Busque testes em pequena escala em vez
     de buscar na aplicação inteira"
Lista de testes

Antes de começar, escreva uma lista de
 todos os testes que sabe que tera que
               escrever.

Se eu conseguir pensar em um teste que
 pode não funcionar, faze-lo funcionar é
mais importante que liberar meu codigo.
Teste primeiro

 Quando voce deveria escrever seus
             testes?

Antes de escrever o codigo que vai ser
              testado.
A asserção deve vir primeiro
        (Assert first)
Quando eu deveria escrever as asserções?

     Escreva-as primeiro pensando:
        Qual é a resposta certa?
        Como eu vou verificar?

       Ex: assertTrue, assertEquals.
   testIfRunBackup, testIfExportArchive
Dados de teste
      (Test data)

Use dados que façam os testes
    faceis de ler e seguir.

A alternativa mais indicada para
Dados de teste é o uso de Dados
            realistas.
Padrões de Barra Vermelha
quando e onde escreve e para de escrever testes

              - One Step Test
                 - Starter Test
            - Explanation Test
               - Learning Test
                - Another Test
            - Regression Test
              - Break (Pausa)
        - Do Over (Faça de novo)
        - Cheap Desk, Nice Chair
Teste de aprendizado
    (Learning test)
Quando voce escreve testes para
software produzido externamente?

Antes da primeira vez que você vai
  usar algum componente deste
          pacote externo.

Ex: escreva um teste que verifica
       se a API funciona.
Teste de regressão
      (Regression test)
   Qual a primeira coisa que voce faz
    quando um defeito é informado?

Escreva o menor teste possivel que falhe
e que, uma vez rodado, sera refatorado.
Faça de novo (Do Over)

   O que voce faz quando se sente
              perdido?

Jogue o codigo fora e comece de novo.
Padrões de Teste
são tecnicas mais detalhadas para escrever testes




            - Teste filho (child test)
      - Objeto simulado (mock object)
           - Autodesvio (self shunt)
        - String de registro (log string)
       - Modelo de teste de acidentes
       - Teste quebrado (broken test)
     - Check-in limpo (clean check-in)
Objeto Simulado (Mock
         Object)

  Como voce testa um objeto que se
   baseia em um recurso caro ou
           complicado?

Crie uma versão faz de conta do recurso
     que responde com constantes.

        Ex: mockar o database
String de registro (Log String)

 Como você testa se a sequencia em que
as mensagens são chamadas esta correta?

Mantenha um registro em um string (log) e,
  quando uma mensagem for chamada,
         acrescente-a à string.

     Ex: conectou selecionou alterou
              desconectou
Modelo de teste de acidentes

  Como voce testa codigo de erro que
  provavelmente sera pouco invocado?

   Invoque-o de qualquer forma com um
objeto especial que lança uma exceção em
        vez de fazer o trabalho real.

Ex: testar o que acontece com o filesystem
                   cheio
Teste quebrado
   Como voce deixa uma sessão de
programação quando esta programando
             sozinho?

    Deixe o ultimo teste quebrado.
Padrões de Barra Verde
padrões para fazer o codigo funcionar



    - Fazer de conta (Fake it)
    - Triangular (Triangulate)
- Implementação obvia (Obvious
         Implementation)
- Um para muitos (One to many)
Fazer de conta (Fake it)

Qual é sua primeira implementação uma vez
   que tem um teste que não funciona?

  Retorne uma constante. Depois de ter o
 teste rodando, gradualmente transforme a
   constante em uma expressão usando
                 variaveis.

  Ex: validar CSV gerado dinamicamente
Triangular
Como você conduz abstração com testes de
       forma mais conservadora?

Abstraia apenas quando tiver dois ou mais
               exemplos.

      Ex: assertEquals(4, soma(1,3))
       assertEquals (7, soma(3,4))

             Outro exemplo?
Padrões xUnit
 xUnit frameworks

     - Assertion
       - Fixture
 - Fixture externa
   - Test method
  - Exception test
       All tests
Asserção

   Como voce verifica que os testes
     funcionaram corretamente?

  Escreva expressões booleanas que
automatizem seu julgamento sobre se o
       codigo funcionou ou não.

     Ex: assertTrue, assertFalse,
   assertInternalType, assertEquals

           Outro exemplo?
Fixture

     Como voce cria objetos comuns
     necessarios para varios testes?

Converta as variaveis locais nos testes em
   variaveis de instancia. Sobrescreva
  setUp() e inicialize aquelas variaveis.

 Ex: Dados especificos no banco dados
Fixture externa

Como voce libera recursos externos na
               fixture?

 Sobrescreva tearDown() e libere os
             recursos.

          Ex: fopen.close()

          Outro exemplo?
Metodo de teste

Como voce representa um unico caso de
               teste?

Como um metodo cujo nome começa com
               "test".

   Ex: testIfArrayGreaterThanOne(),
              testIsString()

           Outro exemplo?
Teste de exceção
    Como voce testa exceções inesperadas?

   Pegue exceções esperadas e ignore-as,
falhando apenas se a exceção não é lançada.
1. exchange->addRate("USD","GBP",2);

2. function testMissingRate() {
   try {
      exchange->findRate("USD", "GBP");
      fail(); //exceção lançada
   } catch (Exception $e) {
   // exception
   }
}
Todos os testes

    Como rodar todos os testes juntos?

Faça uma suite de todas as suites de testes,
agregando os pacotes de testes da aplicação
                  inteira.
O Programador Sem Medo

"São os testes de unidade que mantem seus
 codigos flexiveis, reutilizaveis e passiveis de
manutenção. A razão é simples. Se você tiver
testes, não tera medo de alterar codigo! Sem
  os testes, cada modificação pode gerar um
bug! Com os testes esse medo praticamente
            some" Robert C. Martin
Referencias

    Test Driven Development: By
        Example - Kent Beck

   Clean Code - Robert C. Martin

A Relação Entre TDD e Qualidade de
         Software - InfoQ
www.infoq.com/br/articles/relacao-tdd-qualidade

Mais conteúdo relacionado

Mais procurados

Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Thiago Faria de Andrade
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitAdolfo Neto
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddCarlos Santana
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de SoftwareMaurício Aniche
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnitelliando dias
 
TDD no Community Launch 2010 - Christian Cunha
TDD no Community Launch 2010 - Christian CunhaTDD no Community Launch 2010 - Christian Cunha
TDD no Community Launch 2010 - Christian CunhaChristian Cunha
 
Qualidade de Código
Qualidade de CódigoQualidade de Código
Qualidade de CódigoJoberto Diniz
 
Por que automatizar testes de software?
Por que automatizar testes de software?Por que automatizar testes de software?
Por que automatizar testes de software?Samuel Lourenço
 

Mais procurados (20)

Testes de Sofware
Testes de SofwareTestes de Sofware
Testes de Sofware
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...
 
Testes com JUnit
Testes com JUnitTestes com JUnit
Testes com JUnit
 
JUnit
JUnitJUnit
JUnit
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com Junit
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tdd
 
Junit
JunitJunit
Junit
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de Software
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
TDD Primeiro Contato
TDD Primeiro ContatoTDD Primeiro Contato
TDD Primeiro Contato
 
Palestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnitPalestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnit
 
TDD no Community Launch 2010 - Christian Cunha
TDD no Community Launch 2010 - Christian CunhaTDD no Community Launch 2010 - Christian Cunha
TDD no Community Launch 2010 - Christian Cunha
 
Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
Qualidade de Código
Qualidade de CódigoQualidade de Código
Qualidade de Código
 
Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
Apresentacao teste
Apresentacao testeApresentacao teste
Apresentacao teste
 
Java 12
Java 12Java 12
Java 12
 
1° Madrugada de Testes
1° Madrugada de Testes1° Madrugada de Testes
1° Madrugada de Testes
 
Por que automatizar testes de software?
Por que automatizar testes de software?Por que automatizar testes de software?
Por que automatizar testes de software?
 

Semelhante a Padrões TDD ajudam a escrever testes de forma estruturada

Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Diego Pacheco
 
Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?Alex Tercete
 
Paletra sobre TDD, ocorrida no #DevDojo
Paletra sobre TDD, ocorrida no #DevDojoPaletra sobre TDD, ocorrida no #DevDojo
Paletra sobre TDD, ocorrida no #DevDojoflavio1110
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Claudinei Brito Junior
 
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
 
Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesCamilo Ribeiro
 
Pensando em java univali turbinando seus testes
Pensando em java univali   turbinando seus testesPensando em java univali   turbinando seus testes
Pensando em java univali turbinando seus testesSandro Giacomozzi
 
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
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislAdriano Petrich
 

Semelhante a Padrões TDD ajudam a escrever testes de forma estruturada (20)

Introdução ao design de teste de software
Introdução ao design de teste de softwareIntrodução ao design de teste de software
Introdução ao design de teste de software
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?
 
Paletra sobre TDD, ocorrida no #DevDojo
Paletra sobre TDD, ocorrida no #DevDojoPaletra sobre TDD, ocorrida no #DevDojo
Paletra sobre TDD, ocorrida no #DevDojo
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
 
Testes - Para que?
Testes - Para que?Testes - Para que?
Testes - Para que?
 
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
 
Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por Testes
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Pensando em java univali turbinando seus testes
Pensando em java univali   turbinando seus testesPensando em java univali   turbinando seus testes
Pensando em java univali turbinando seus testes
 
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
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
TDD na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
O que é Teste de Software?
O que é Teste de Software?O que é Teste de Software?
O que é Teste de Software?
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
 
Python com TDD
Python com TDDPython com TDD
Python com TDD
 
Minicurso de TDD
Minicurso de TDDMinicurso de TDD
Minicurso de TDD
 

Padrões TDD ajudam a escrever testes de forma estruturada

  • 1. Padrões para Desenvolvimento de Software Guiado por Testes Tech Talk Coquelux Mantra Vermelho/verde/refatorar Everton Rodrigues
  • 2. "TDD é uma forma de administrar o medo durante a programação" Quanto mais estresse voce sentir, menos vai testar. Quanto menos voce testar, mais erros vai acontecer. Quanto mais erros voce cometer, mais estresse vai sentir.
  • 3. Questão Porque conhecer Padrões para TDD, o que vai ajudar?
  • 4. Padrões para TDD ajudam a responder as perguntas: - O que queremos dizer com testar? - Quanto testamos? - Como escolhemos que logica testar? - Como escolhemos quais dados testar?
  • 5. Testes isolados "Faça testes tão rapidos de executar que possa roda-los sozinho e roda-los frequentemente" "Busque testes em pequena escala em vez de buscar na aplicação inteira"
  • 6. Lista de testes Antes de começar, escreva uma lista de todos os testes que sabe que tera que escrever. Se eu conseguir pensar em um teste que pode não funcionar, faze-lo funcionar é mais importante que liberar meu codigo.
  • 7. Teste primeiro Quando voce deveria escrever seus testes? Antes de escrever o codigo que vai ser testado.
  • 8. A asserção deve vir primeiro (Assert first) Quando eu deveria escrever as asserções? Escreva-as primeiro pensando: Qual é a resposta certa? Como eu vou verificar? Ex: assertTrue, assertEquals. testIfRunBackup, testIfExportArchive
  • 9. Dados de teste (Test data) Use dados que façam os testes faceis de ler e seguir. A alternativa mais indicada para Dados de teste é o uso de Dados realistas.
  • 10. Padrões de Barra Vermelha quando e onde escreve e para de escrever testes - One Step Test - Starter Test - Explanation Test - Learning Test - Another Test - Regression Test - Break (Pausa) - Do Over (Faça de novo) - Cheap Desk, Nice Chair
  • 11. Teste de aprendizado (Learning test) Quando voce escreve testes para software produzido externamente? Antes da primeira vez que você vai usar algum componente deste pacote externo. Ex: escreva um teste que verifica se a API funciona.
  • 12. Teste de regressão (Regression test) Qual a primeira coisa que voce faz quando um defeito é informado? Escreva o menor teste possivel que falhe e que, uma vez rodado, sera refatorado.
  • 13. Faça de novo (Do Over) O que voce faz quando se sente perdido? Jogue o codigo fora e comece de novo.
  • 14. Padrões de Teste são tecnicas mais detalhadas para escrever testes - Teste filho (child test) - Objeto simulado (mock object) - Autodesvio (self shunt) - String de registro (log string) - Modelo de teste de acidentes - Teste quebrado (broken test) - Check-in limpo (clean check-in)
  • 15. Objeto Simulado (Mock Object) Como voce testa um objeto que se baseia em um recurso caro ou complicado? Crie uma versão faz de conta do recurso que responde com constantes. Ex: mockar o database
  • 16. String de registro (Log String) Como você testa se a sequencia em que as mensagens são chamadas esta correta? Mantenha um registro em um string (log) e, quando uma mensagem for chamada, acrescente-a à string. Ex: conectou selecionou alterou desconectou
  • 17. Modelo de teste de acidentes Como voce testa codigo de erro que provavelmente sera pouco invocado? Invoque-o de qualquer forma com um objeto especial que lança uma exceção em vez de fazer o trabalho real. Ex: testar o que acontece com o filesystem cheio
  • 18. Teste quebrado Como voce deixa uma sessão de programação quando esta programando sozinho? Deixe o ultimo teste quebrado.
  • 19. Padrões de Barra Verde padrões para fazer o codigo funcionar - Fazer de conta (Fake it) - Triangular (Triangulate) - Implementação obvia (Obvious Implementation) - Um para muitos (One to many)
  • 20. Fazer de conta (Fake it) Qual é sua primeira implementação uma vez que tem um teste que não funciona? Retorne uma constante. Depois de ter o teste rodando, gradualmente transforme a constante em uma expressão usando variaveis. Ex: validar CSV gerado dinamicamente
  • 21. Triangular Como você conduz abstração com testes de forma mais conservadora? Abstraia apenas quando tiver dois ou mais exemplos. Ex: assertEquals(4, soma(1,3)) assertEquals (7, soma(3,4)) Outro exemplo?
  • 22. Padrões xUnit xUnit frameworks - Assertion - Fixture - Fixture externa - Test method - Exception test All tests
  • 23. Asserção Como voce verifica que os testes funcionaram corretamente? Escreva expressões booleanas que automatizem seu julgamento sobre se o codigo funcionou ou não. Ex: assertTrue, assertFalse, assertInternalType, assertEquals Outro exemplo?
  • 24. Fixture Como voce cria objetos comuns necessarios para varios testes? Converta as variaveis locais nos testes em variaveis de instancia. Sobrescreva setUp() e inicialize aquelas variaveis. Ex: Dados especificos no banco dados
  • 25. Fixture externa Como voce libera recursos externos na fixture? Sobrescreva tearDown() e libere os recursos. Ex: fopen.close() Outro exemplo?
  • 26. Metodo de teste Como voce representa um unico caso de teste? Como um metodo cujo nome começa com "test". Ex: testIfArrayGreaterThanOne(), testIsString() Outro exemplo?
  • 27. Teste de exceção Como voce testa exceções inesperadas? Pegue exceções esperadas e ignore-as, falhando apenas se a exceção não é lançada. 1. exchange->addRate("USD","GBP",2); 2. function testMissingRate() { try { exchange->findRate("USD", "GBP"); fail(); //exceção lançada } catch (Exception $e) { // exception } }
  • 28. Todos os testes Como rodar todos os testes juntos? Faça uma suite de todas as suites de testes, agregando os pacotes de testes da aplicação inteira.
  • 29. O Programador Sem Medo "São os testes de unidade que mantem seus codigos flexiveis, reutilizaveis e passiveis de manutenção. A razão é simples. Se você tiver testes, não tera medo de alterar codigo! Sem os testes, cada modificação pode gerar um bug! Com os testes esse medo praticamente some" Robert C. Martin
  • 30.
  • 31. Referencias Test Driven Development: By Example - Kent Beck Clean Code - Robert C. Martin A Relação Entre TDD e Qualidade de Software - InfoQ www.infoq.com/br/articles/relacao-tdd-qualidade