0
E NO SÉTIMO DIA ELE
                         CRIOU TESTES
         TDD e o papel de testes no desenvolvimento de aplicaçõe...
Aviso

                 As referências e opiniões religiosas apresentadas
                 nesta palestra não refletem a op...
A CRIAÇÃO DO MUNDO
                    do ponto de vista do desenvolvimento de software

Friday, November 27, 2009
Friday, November 27, 2009
Friday, November 27, 2009
Friday, November 27, 2009
Friday, November 27, 2009
Friday, November 27, 2009
Friday, November 27, 2009
Friday, November 27, 2009
Friday, November 27, 2009
@OCriador




Friday, November 27, 2009
@OCriador
        * Adão has joined #earth
                                   Adão
        * Eva has joined #earth
       ...
@OCriador
        * Adão has joined #earth
                                    Adão
        * Eva has joined #earth
      ...
@OCriador
        * Adão has joined #earth
                                    Adão
        * Eva has joined #earth
      ...
@OCriador
        * Adão has joined #earth
                                                 Adão
        * Eva has joined ...
QUEM É RAFAEL DOHMS?
    Rafael Dohms é graduado Engenheiro da Computação pelo
    UniCEUB. Tem 9 anos de experiência no m...
Sebastian
                                                                  Bergmann




                                 ...
PRÓS
    • “Simulação”

         • Facilidade  de testar funções sem precisar preencher
             formulários, criar us...
CONS

    • Tempo

         • Embora você gaste mais tempo criando testes, você ganha
             tempo durante as simula...
CADA SITUAÇÃO, UMA FERRAMENTA



         Frontend           Backend   PHP


       Selenium
           +                P...
skoop @flickr




                            ESCREVENDO TESTES
                            quando você começar, nunca mais...
MANOWARS!


    • Sistema               de Batalhas
    • Garantindo               o elemento aleatório
         • Ataque:...
Mano Gil pronto para combater.
 > Atk: 10 / Def: 8
 Mano Brown pronto para combater.
 > Atk: 11 / Def: 9
                 ...
MW_MANO
                            Vamos ver de perto o código

Friday, November 27, 2009
O QUE TESTAR?
    1.O construtor esta definindo as variáveis?
    2.O health (saúde) está em 100 quando damos reset?
    3....
RAIO-X DE UMA SUITE DE TESTES
        PHPUnit_Framework_TestSuite


                AllTests




Friday, November 27, 2009
RAIO-X DE UMA SUITE DE TESTES
        PHPUnit_Framework_TestSuite


                AllTests
                             ...
RAIO-X DE UMA SUITE DE TESTES
        PHPUnit_Framework_TestSuite


                AllTests
                             ...
RAIO-X DE UMA SUITE DE TESTES
        PHPUnit_Framework_TestSuite
                                         SetUp
         ...
EXECUÇÃO DA SUITE
                                   SetUp




                                   SetUp
                  ...
ISOLAMENTO

    • Mantenha                seus testes isolados
    • Nunca                  rode testes no servidor de pro...
ESQUADRÃO LIMPEZA
  Limpe tudo o que seu teste criar!
           class CleanUpTest extends PHPUnit_Framework_TestCase
    ...
ESQUADRÃO LIMPEZA
  Limpe tudo o que seu teste criar!
           class CleanUpTest extends PHPUnit_Framework_TestCase
    ...
ESQUADRÃO LIMPEZA
  Limpe tudo o que seu teste criar!
           class CleanUpTest extends PHPUnit_Framework_TestCase
    ...
TIPOS
    • Teste                 Unitário
         • Pequeno            e pontual
         • Geralmente            testa ...
TESTANDO OS BÁSICOS


    • Estrutura             da Suite
         • AllTests.php

         • MW_Mano

              • Te...
public function attack(MW_Mano $victim)
    {
        $atk = $this->getAtk() + trim(file_get_contents('URL'));
        $de...
CÓDIGO DEINTESTÁVEL

    • Singletons

         • MyClass::getInstance();

    • Dependências

         • SO: exec(‘ls    ...
public function attack(MW_Mano $victim)
 {
     $atk = $this->getAtk() + $this->getRandom();
     $def = $victim->defend()...
NINJA TESTING

    • Porque, às            vezes, os testes precisam de dublês
         • Dummy

         • Fake

        ...
RANDOM SEM O RANDOM
 public function testDefendWithoutLuck()
 {
     //Obter Mock
     $manoMock = $this->getMock('MW_Mano...
DATA PROVIDERS



    •1       teste, muitos dados
    • Análise               completa de diferentes quadros




Friday, ...
CODE COVERAGE
    • phpunit.xml

    <phpunit colors="true" verbose="true">

        <logging>
            <log type="cove...
Friday, November 27, 2009
Test Driven Development




                                           TDD
                            Não é sobre testes,...
“TDD é uma forma de projetar software,
      não apenas uma forma de testar software.”
                            Sebasti...
TDD


    • Escrever   testes que definem o comportamento de sua
        aplicação antes de escrever código.
    • Testar  ...
Especificação          Análise   Codificação




       Manutenção           Deploy      Testes




     CICLO DE DESENVOLVI...
Codificação




Friday, November 27, 2009
Codificação




Friday, November 27, 2009
Codificação




Friday, November 27, 2009
Codificação




Friday, November 27, 2009
Codificação




Friday, November 27, 2009
Codificação




Friday, November 27, 2009
Codificação




Friday, November 27, 2009
Codificação




Friday, November 27, 2009
Especificação           Análise   Codificação




       Manutenção            Deploy      Testes




     CICLO DE DESENVOL...
Especificação           Análise     Testes




       Manutenção            Deploy    Codificação




     CICLO DE DESENVOL...
Especificação           Análise     Testes




       Manutenção            Deploy    Codificação




     CICLO DE DESENVOL...
Testes

              O que desejamos que <método> faça?
              Massa de dados para Teste




      Codificação

   ...
Especificação             Análise      Testes




       Manutenção              Deploy     Codificação




     CICLO DE DE...
Manutenção


    • Processo               de correção de bugs

         • Identificar          erro

         • Escrever   ...
RINSE AND REPEAT
                 Automatize seus testes e garanta qualidade da equipe

Friday, November 27, 2009
CONTINUOS INTEGRATION

    • “Integração           contínua”
         • Processo         automatizado
         • Executado...
Friday, November 27, 2009
FERRAMENTAS

    • phpUnderControl

         • baseado           no CruiseControl
         • Versão           atual já for...
Friday, November 27, 2009
Friday, November 27, 2009
DÚVIDAS?
Friday, November 27, 2009
www.rafaeldohms.com.br
                                        rafael@rafaeldohms.com.br



                              ...
Upcoming SlideShare
Loading in...5
×

E no Sétimo dia ele escreveu testes

1,840

Published on

O TDD (Test Driven Development) se torna mais comum a cada dia, mas porque você deve ligar para testes na sua aplicação. Vamos nos aprofundar num mundo de testes cobrindo desde testar o próprio PHP até os testes de sua aplicação. Descubra os benefícios e aprenda a lidar como choque cultural.

Published in: Technology, Spiritual
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,840
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
53
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

Transcript of "E no Sétimo dia ele escreveu testes"

  1. 1. E NO SÉTIMO DIA ELE CRIOU TESTES TDD e o papel de testes no desenvolvimento de aplicações Rafael Dohms rafael@rafaeldohms.com.br Friday, November 27, 2009
  2. 2. Aviso As referências e opiniões religiosas apresentadas nesta palestra não refletem a opinião do autor, e são apresentadas puramente com intuito de ilustrar pontos-chave de forma descontraída e humorística. Friday, November 27, 2009
  3. 3. A CRIAÇÃO DO MUNDO do ponto de vista do desenvolvimento de software Friday, November 27, 2009
  4. 4. Friday, November 27, 2009
  5. 5. Friday, November 27, 2009
  6. 6. Friday, November 27, 2009
  7. 7. Friday, November 27, 2009
  8. 8. Friday, November 27, 2009
  9. 9. Friday, November 27, 2009
  10. 10. Friday, November 27, 2009
  11. 11. Friday, November 27, 2009
  12. 12. @OCriador Friday, November 27, 2009
  13. 13. @OCriador * Adão has joined #earth Adão * Eva has joined #earth Eva Friday, November 27, 2009
  14. 14. @OCriador * Adão has joined #earth Adão * Eva has joined #earth Eva Adão: Agora vou apavorar! Eva: Primeiro post! Eva: ah droga! Eva: Olha! uma maçã! Friday, November 27, 2009
  15. 15. @OCriador * Adão has joined #earth Adão * Eva has joined #earth Eva Adão: Agora vou apavorar! Eva: Primeiro post! Eva: ah droga! Eva: Olha! uma maçã! > Eva morde a maçã OCriador: eu avisei! Friday, November 27, 2009
  16. 16. @OCriador * Adão has joined #earth Adão * Eva has joined #earth Eva Adão: Agora vou apavorar! Eva: Primeiro post! Eva: ah droga! Eva: Olha! uma maçã! > Eva morde a maçã OCriador: eu avisei! OCriador kicks Eva OCriador kicks Adão OCriador adds ban on *@earth on #earth Friday, November 27, 2009
  17. 17. QUEM É RAFAEL DOHMS? Rafael Dohms é graduado Engenheiro da Computação pelo UniCEUB. Tem 9 anos de experiência no mercado PHP e atualmente ocupa o cargo de Desenvolvedor Sênior e Especialista em PHP na empresa sul-africana SWAT/MIH. É certificado ZCE PHP5. Grande agitador da comunidade PHP é co-fundador do PHPDF e atual coordenador do PHPSP. Contribui ativamente na área de testes do PHP e é Host do PHPSPCast, o primeiro podcast sobre PHP do Brazil. Friday, November 27, 2009
  18. 18. Sebastian Bergmann TESTES porque você precisa deles, mas ainda não sabe Friday, November 27, 2009
  19. 19. PRÓS • “Simulação” • Facilidade de testar funções sem precisar preencher formulários, criar usuários • Tudo fica centralizado no teste e é feito apenas uma vez • “Certeza” • Testes podem simular todas situações possíveis e garantir que seu código funciona como esperado • “Garantia” • Com um sistema coberto de testes você tem certeza que sua alteração não vai quebrar outra área do sistema Friday, November 27, 2009
  20. 20. CONS • Tempo • Embora você gaste mais tempo criando testes, você ganha tempo durante as simulações e na manutenção • Gerência • Convencer os responsáveis pelo projeto de que testes irão trazer lucro é geralmente complicado Friday, November 27, 2009
  21. 21. CADA SITUAÇÃO, UMA FERRAMENTA Frontend Backend PHP Selenium + PHPUnit PHPT PHPUnit Friday, November 27, 2009
  22. 22. skoop @flickr ESCREVENDO TESTES quando você começar, nunca mais vai parar Friday, November 27, 2009
  23. 23. MANOWARS! • Sistema de Batalhas • Garantindo o elemento aleatório • Ataque: Fixo + Random • Defesa: Fixo + Random • Damage: Atk/Def * Random Friday, November 27, 2009
  24. 24. Mano Gil pronto para combater. > Atk: 10 / Def: 8 Mano Brown pronto para combater. > Atk: 11 / Def: 9 UMA BATALHA! Round 1 Fight! Gil took 3 damage from Brown Gil did 13 damage on Brown Gil did 10 damage on Brown Gil did 1 damage on Brown Gil took 12 damage from Brown Gil did 13 damage on Brown Gil did 2 damage on Brown Gil did 0 damage on Brown Gil took 7 damage from Brown Gil did 13 damage on Brown Gil did 10 damage on Brown Gil did 0 damage on Brown Gil took 13 damage from Brown Gil took 1 damage from Brown Gil took 10 damage from Brown Gil took 10 damage from Brown Gil did 14 damage on Brown Gil took 9 damage from Brown Gil took 7 damage from Brown Gil did 6 damage on Brown Gil did 8 damage on Brown Gil did 2 damage on Brown Gil did 12 damage on Brown Gil won! Friday, November 27, 2009
  25. 25. MW_MANO Vamos ver de perto o código Friday, November 27, 2009
  26. 26. O QUE TESTAR? 1.O construtor esta definindo as variáveis? 2.O health (saúde) está em 100 quando damos reset? 3.Quando ele se machuca, o health diminui? 4.Quando vivo, ele diz “tô vivo”? 5.Quando morto, ele morre? 6.Ele se defende com o valor de defesa esperado? 7.Ele ganha bonus de defesa? 8.Qual o resultado de um ataque (sem bônus), quando: 8.1.Atk > Def 8.2.Def > Atk 8.3.Atk = Def Friday, November 27, 2009
  27. 27. RAIO-X DE UMA SUITE DE TESTES PHPUnit_Framework_TestSuite AllTests Friday, November 27, 2009
  28. 28. RAIO-X DE UMA SUITE DE TESTES PHPUnit_Framework_TestSuite AllTests PHPUnit_Framework_TestCase ClassXTest PHPUnit_Framework_TestCase ClassXTest PHPUnit_Framework_TestCase ClassXTest Friday, November 27, 2009
  29. 29. RAIO-X DE UMA SUITE DE TESTES PHPUnit_Framework_TestSuite AllTests PHPUnit_Framework_TestCase testX ClassXTest ... testY PHPUnit_Framework_TestCase testX ClassXTest ... testY PHPUnit_Framework_TestCase testX ClassXTest ... testY Friday, November 27, 2009
  30. 30. RAIO-X DE UMA SUITE DE TESTES PHPUnit_Framework_TestSuite SetUp AllTests TearDown PHPUnit_Framework_TestCase SetUp testX ClassXTest ... TearDown testY PHPUnit_Framework_TestCase SetUp testX ClassXTest ... TearDown testY PHPUnit_Framework_TestCase SetUp testX ClassXTest ... TearDown testY Friday, November 27, 2009
  31. 31. EXECUÇÃO DA SUITE SetUp SetUp Para cada teste TearDown SetUp Para cada teste TearDown SetUp Para cada teste TearDown TearDown Friday, November 27, 2009
  32. 32. ISOLAMENTO • Mantenha seus testes isolados • Nunca rode testes no servidor de produção! • Soluções • Crie uma base separada • Use pastas separadas para arquivos • Sempre destrua tudo que seu teste construiu Friday, November 27, 2009
  33. 33. ESQUADRÃO LIMPEZA Limpe tudo o que seu teste criar! class CleanUpTest extends PHPUnit_Framework_TestCase { private $file = "/tmp/file"; protected function setUp() { parent::setUp(); } protected function tearDown() { unlink($this->file); parent::tearDown(); } public function testFile() { file_put_contents($this->file); } Friday, November 27, 2009
  34. 34. ESQUADRÃO LIMPEZA Limpe tudo o que seu teste criar! class CleanUpTest extends PHPUnit_Framework_TestCase { private $file = "/tmp/file"; protected function setUp() { parent::setUp(); } protected function tearDown() { unlink($this->file); parent::tearDown(); } public function testFile() Everything { must be clean! file_put_contents($this->file); } Friday, November 27, 2009
  35. 35. ESQUADRÃO LIMPEZA Limpe tudo o que seu teste criar! class CleanUpTest extends PHPUnit_Framework_TestCase { private $file = "/tmp/file"; protected function setUp() { parent::setUp(); } protected function tearDown() { Arquivos, Banco de unlink($this->file); Dados, etc... parent::tearDown(); } public function testFile() Everything { must be clean! file_put_contents($this->file); } Friday, November 27, 2009
  36. 36. TIPOS • Teste Unitário • Pequeno e pontual • Geralmente testa a entrada/saída de uma função • Teste Funcional • Verifica a funcionalidade de interfaces • End-to-End • Verifica o processo do início ao fim • Analisa o fluxo de sua aplicação Friday, November 27, 2009
  37. 37. TESTANDO OS BÁSICOS • Estrutura da Suite • AllTests.php • MW_Mano • Testes do 1 ao 6 Friday, November 27, 2009
  38. 38. public function attack(MW_Mano $victim) { $atk = $this->getAtk() + trim(file_get_contents('URL')); $def = $victim->defend(); $dmgMultiplier = (trim(file_get_contents('URL')))/100; if ($atk > $def){ $dmg = round($atk * $dmgMultiplier); $victim->hurt( $dmg ); $action = "%s did %d damage on %s"; }else{ $dmg = round($def * $dmgMultiplier); $this->hurt( $dmg ); $action = "%s took %d damage from %s"; } return sprintf($action, $this->getName(), $dmg, $victim->getName()); } Para Facilitar leitura: [URL] => http://www.random.org/integers/?num=1&min=0&max=100&col=1&base=10&format=plain&rnd=new Friday, November 27, 2009
  39. 39. CÓDIGO DEINTESTÁVEL • Singletons • MyClass::getInstance(); • Dependências • SO: exec(‘ls -la’); • Recursos externos: APIs, File System • Métodos Privados • private method fazTudo(){...} Friday, November 27, 2009
  40. 40. public function attack(MW_Mano $victim) { $atk = $this->getAtk() + $this->getRandom(); $def = $victim->defend(); $dmgMultiplier = $this->getRandom(1,100)/100; if ($atk > $def){ $dmg = round($atk * $dmgMultiplier); $victim->hurt( $dmg ); $action = "%s did %d damage on %s"; }else{ $dmg = round($def * $dmgMultiplier); $this->hurt( $dmg ); $action = "%s took %d damage from %s"; } return sprintf($action, $this->getName(), $dmg, $victim->getName()); } public function getRandom($min = 1, $max = 10) { return trim(file_get_contents('http://www.random.org/integers/?num=1&min='. $min.'&max='.$max.'&col=1&base=10&format=plain&rnd=new')); } Friday, November 27, 2009
  41. 41. NINJA TESTING • Porque, às vezes, os testes precisam de dublês • Dummy • Fake • Stub • Spy • Mock Friday, November 27, 2009
  42. 42. RANDOM SEM O RANDOM public function testDefendWithoutLuck() { //Obter Mock $manoMock = $this->getMock('MW_Mano',array('getRandom'), array('John')); //Definir que o objeto retorne zero. $manoMock->expects($this->any()) ->method('getRandom') ->will($this->returnValue(0)); //Definir defesa $manoMock->setDef(5); //Verificar que defesa nao se altera $this->assertEquals(5, $manoMock->defend()); } Friday, November 27, 2009
  43. 43. DATA PROVIDERS •1 teste, muitos dados • Análise completa de diferentes quadros Friday, November 27, 2009
  44. 44. CODE COVERAGE • phpunit.xml <phpunit colors="true" verbose="true"> <logging> <log type="coverage-html" target="_reports" charset="UTF-8" yui="true" highlight="true" /> </logging> <filter> <blacklist> <directory suffix=".php">../libs/Zend</directory> </blacklist> <whitelist> <directory suffix=".php">../libs/MW</directory> </whitelist> </filter> </phpunit> Friday, November 27, 2009
  45. 45. Friday, November 27, 2009
  46. 46. Test Driven Development TDD Não é sobre testes, é sobre especificações Friday, November 27, 2009
  47. 47. “TDD é uma forma de projetar software, não apenas uma forma de testar software.” Sebastian Bergmann - criador do PHPUnit “It's about figuring out what you are trying to do before you run off half-cocked to try to do it.” Dave Astels - autor de livros sobre TDD Friday, November 27, 2009
  48. 48. TDD • Escrever testes que definem o comportamento de sua aplicação antes de escrever código. • Testar comportamento, não apenas funcionamento • Especificar e não apenas validar Friday, November 27, 2009
  49. 49. Especificação Análise Codificação Manutenção Deploy Testes CICLO DE DESENVOLVIMENTO sem TDD Friday, November 27, 2009
  50. 50. Codificação Friday, November 27, 2009
  51. 51. Codificação Friday, November 27, 2009
  52. 52. Codificação Friday, November 27, 2009
  53. 53. Codificação Friday, November 27, 2009
  54. 54. Codificação Friday, November 27, 2009
  55. 55. Codificação Friday, November 27, 2009
  56. 56. Codificação Friday, November 27, 2009
  57. 57. Codificação Friday, November 27, 2009
  58. 58. Especificação Análise Codificação Manutenção Deploy Testes CICLO DE DESENVOLVIMENTO sem TDD Friday, November 27, 2009
  59. 59. Especificação Análise Testes Manutenção Deploy Codificação CICLO DE DESENVOLVIMENTO sem TDD Friday, November 27, 2009
  60. 60. Especificação Análise Testes Manutenção Deploy Codificação CICLO DE DESENVOLVIMENTO sem TDD Friday, November 27, 2009
  61. 61. Testes O que desejamos que <método> faça? Massa de dados para Teste Codificação Como <método> fará o que precisa? Sem formulários, teste direto o backend com os dados Friday, November 27, 2009
  62. 62. Especificação Análise Testes Manutenção Deploy Codificação CICLO DE DESENVOLVIMENTO sem com TDD Friday, November 27, 2009
  63. 63. Manutenção • Processo de correção de bugs • Identificar erro • Escrever teste que cause falha • Corrigir código • Rodar teste novamente • Verificar que o teste passou Friday, November 27, 2009
  64. 64. RINSE AND REPEAT Automatize seus testes e garanta qualidade da equipe Friday, November 27, 2009
  65. 65. CONTINUOS INTEGRATION • “Integração contínua” • Processo automatizado • Executado após cada commit • Identifica falhas • Identifica culpados • Controla qualidade Friday, November 27, 2009
  66. 66. Friday, November 27, 2009
  67. 67. FERRAMENTAS • phpUnderControl • baseado no CruiseControl • Versão atual já formata: • Resultados de Testes • PHP Code Sniffer • Code Coverage • phpDoc Friday, November 27, 2009
  68. 68. Friday, November 27, 2009
  69. 69. Friday, November 27, 2009
  70. 70. DÚVIDAS? Friday, November 27, 2009
  71. 71. www.rafaeldohms.com.br rafael@rafaeldohms.com.br Obrigado! Avalie essa palestra: http://joind.in/1168 Friday, November 27, 2009
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×