SlideShare ist ein Scribd-Unternehmen logo
1 von 76
Downloaden Sie, um offline zu lesen
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
Saturday, July 9, 2011
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.




Saturday, July 9, 2011
A CRIAÇÃO DO MUNDO
                         do ponto de vista do desenvolvimento de software

Saturday, July 9, 2011
Saturday, July 9, 2011
Saturday, July 9, 2011
Saturday, July 9, 2011
Saturday, July 9, 2011
Saturday, July 9, 2011
Saturday, July 9, 2011
Saturday, July 9, 2011
Saturday, July 9, 2011
@OCriador




Saturday, July 9, 2011
@OCriador
         * Adão has joined #earth
                                    Adão
         * Eva has joined #earth
                                    Eva




Saturday, July 9, 2011
@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çã!




Saturday, July 9, 2011
@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!




Saturday, July 9, 2011
@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




Saturday, July 9, 2011
Rafael Dohms




                                                               photo credit: Eli White
        Evangelista PHP, membro ativo da Comunidade
        PHP e certificado ZCE. Ele ajudou na fundação de
        dois Grupos de Usuários de PHP ao longo do tempo
        e hoje compartilha a coordenação do PHPSP.
        Desenvolvedor, gamer e apaixonado por código ele
        também é host do primeiro podcast de PHP do
        Brasil: PHPSPCast.

        Atualmente ele trabalha na equipe SWAT do
        grupo MIH, uma equipe de experts que fornecem
        conhecimento técnico para o grupo além de trabalhar
        com P&D buscando novos nichos da internet e
        tecnologia. Seu papel como Desenvolvedor
        Sênior é codar, treinar e auxiliar outras empresas e
        se divertir enquanto faz isso.


Saturday, July 9, 2011
Sebastian
                                                                   Bergmann




                                   TESTES
                   porque você precisa deles, mas ainda não sabe

Saturday, July 9, 2011
TESTES?

    • Descrever  programaticamente um caso de uso válido e
        garantir sua funcionalidade
    • Forçar             a execução de seu código em diversos cenários
    • Objetivos

          • Garantir          funcionamento
          • Agilizar         a refatoração
    • Testes             automatizados



Saturday, July 9, 2011
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


Saturday, July 9, 2011
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

Saturday, July 9, 2011
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




Saturday, July 9, 2011
CADA SITUAÇÃO, UMA FERRAMENTA



          Frontend       Backend   PHP


        Selenium
            +            PHPUnit   PHPT
        PHPUnit




Saturday, July 9, 2011
skoop @flickr




                         ESCREVENDO TESTES
                         quando você começar, nunca mais vai parar

Saturday, July 9, 2011
MANOWARS!


    • Sistema            de Batalhas
    • Garantindo            o elemento aleatório
          • Ataque: Fixo       + Random
          • Defesa: Fixo       + Random
          • Damage: Atk/Def            * Random




Saturday, July 9, 2011
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!

Saturday, July 9, 2011
MW_MANO
                         Vamos ver de perto o código

Saturday, July 9, 2011
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

Saturday, July 9, 2011
RAIO-X DE UMA SUITE DE TESTES
         PHPUnit_Framework_TestSuite


                  AllTests




Saturday, July 9, 2011
RAIO-X DE UMA SUITE DE TESTES
         PHPUnit_Framework_TestSuite


                  AllTests
                                PHPUnit_Framework_TestCase


                                   ClassXTest
                                PHPUnit_Framework_TestCase


                                   ClassXTest
                                PHPUnit_Framework_TestCase


                                   ClassXTest




Saturday, July 9, 2011
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




Saturday, July 9, 2011
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




Saturday, July 9, 2011
EXECUÇÃO DA SUITE
                                SetUp




                                SetUp
                                          Para cada teste
                               TearDown




                                SetUp
                                          Para cada teste
                               TearDown




                                SetUp
                                          Para cada teste
                               TearDown




                               TearDown


Saturday, July 9, 2011
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



Saturday, July 9, 2011
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);
                     }
Saturday, July 9, 2011
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);
                     }
Saturday, July 9, 2011
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);
                     }
Saturday, July 9, 2011
QUANDO LIMPAR?
            class CleanUpTest extends PHPUnit_Framework_TestCase
            {
                private $file = "/tmp/file";

                         protected function setUp()
                         {
                             parent::setUp();
                         }

                         protected function tearDown()
                         {
                             parent::tearDown();
                         }

                         public function testFile()
                         {
                             file_put_contents($this->file);
                             $this->assertSomething(...);
                             unlink($this->file);
                         }

Saturday, July 9, 2011
QUANDO LIMPAR?
            class CleanUpTest extends PHPUnit_Framework_TestCase
            {
                private $file = "/tmp/file";

                         protected function setUp()
                         {
                             parent::setUp();
                         }

                         protected function tearDown()
                         {
                             parent::tearDown();
                         }

                         public function testFile()
                         {
                             file_put_contents($this->file);
                             $this->assertSomething(...);
                                                               Interrompe o
                             unlink($this->file);              teste se falhar
                         }

Saturday, July 9, 2011
TESTANDO OS BÁSICOS


    • Estrutura          da Suite
          • AllTests.php

          • MW_Mano

               • Testes   do 1 ao 6




Saturday, July 9, 2011
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

Saturday, July 9, 2011
CÓDIGO DEINTESTÁVEL

    • Singletons

          • MyClass::getInstance();

    • Dependências

          • SO: exec(‘ls            -la’);
          • Recursos       externos: APIs, File System
    • Métodos            Privados
          • private          method fazTudo(){...}


Saturday, July 9, 2011
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'));
 }




Saturday, July 9, 2011
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'));
 }




Saturday, July 9, 2011
CENAS ARRISCADAS

    • Porque, às         vezes, os testes precisam de dublês
    • Removem            dependências em código externo
    • Oferecem           controle sobre resultados
    • Estratégias        comuns:
          • Dummy, Fake, Stub, Spy, Mock




Saturday, July 9, 2011
MOCK OBJECT


    • Em                 português: falso, imitação (Objeto falso)
    • Significa:                copiar, imitar ou falsificar
    • Objetivo:      trocar algo que não temos controle por
        outro do qual podemos garantir o resultado, forçando
        diferentes cenários.




Saturday, July 9, 2011
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());
  }

Saturday, July 9, 2011
DATA PROVIDERS



    • Um                 teste, muitos dados
    • Análise              completa de diferentes cenários




Saturday, July 9, 2011
CODE COVERAGE
                         Medindo a eficiência de nossos testes

    • 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>




Saturday, July 9, 2011
Saturday, July 9, 2011
Test Driven Development




                                        TDD
                         Não é sobre testes, é sobre especificações

Saturday, July 9, 2011
“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




Saturday, July 9, 2011
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




Saturday, July 9, 2011
Especificação      Análise   Codificação




        Manutenção       Deploy      Testes




     CICLO DE DESENVOLVIMENTO
                         sem TDD

Saturday, July 9, 2011
Codificação




Saturday, July 9, 2011
Codificação




Saturday, July 9, 2011
Codificação




Saturday, July 9, 2011
Codificação




Saturday, July 9, 2011
Codificação




Saturday, July 9, 2011
Codificação




Saturday, July 9, 2011
Codificação




Saturday, July 9, 2011
Codificação




Saturday, July 9, 2011
Especificação       Análise   Codificação




        Manutenção        Deploy      Testes




     CICLO DE DESENVOLVIMENTO
                         sem TDD

Saturday, July 9, 2011
Especificação       Análise     Testes




        Manutenção        Deploy    Codificação




     CICLO DE DESENVOLVIMENTO
                         sem TDD

Saturday, July 9, 2011
Especificação       Análise     Testes




        Manutenção        Deploy    Codificação




     CICLO DE DESENVOLVIMENTO
                         sem TDD

Saturday, July 9, 2011
Testes

               O que desejamos que <método> faça?
               Quais são os cenários que ele precisa estar preparado
               para lidar?



       Codificação

               Como <método> fará o que precisa?

              Sem formulários, teste direto o backend com os dados


Saturday, July 9, 2011
Especificação         Análise      Testes




        Manutenção          Deploy     Codificação




     CICLO DE DESENVOLVIMENTO
                         sem com TDD

Saturday, July 9, 2011
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

Saturday, July 9, 2011
RINSE AND REPEAT
                  Automatize seus testes e garanta qualidade da equipe

Saturday, July 9, 2011
CONTINUOS INTEGRATION

    • “Integração        contínua”
          • Processo     automatizado
          • Executado     após cada commit
          • Identifica    falhas
          • Identifica    culpados
          • Controla     qualidade



Saturday, July 9, 2011
Saturday, July 9, 2011
FERRAMENTAS
  • phpUnderControl                          • Hudson

       • baseado          no CruiseControl    • Resultados    de Testes
       • Versão          atual já formata:    • PHP    Code Sniffer
             • Resultados      de Testes      • Code    Coverage
             • PHP       Code Sniffer         • phpDoc

             • Code       Coverage           • Arbit
             • phpDoc                         • PHP!

                                              • Integração   Contínua
                                              • Bug Tracker


Saturday, July 9, 2011
Saturday, July 9, 2011
Saturday, July 9, 2011
DÚVIDAS?
Saturday, July 9, 2011
Obrigado!
                                 http://doh.ms
                                 rafael@doh.ms




       Slides: http://slides.doh.ms
       Código: https://github.com/rdohms/ManoWars


                  Avalie essa palestra: http://joind.in/3571
Saturday, July 9, 2011

Weitere ähnliche Inhalte

Ähnlich wie TDC 2011 - E no sétimo dia ele escreveu testes

Fun driven development com Ruby
Fun driven development com RubyFun driven development com Ruby
Fun driven development com RubySuccesSoft LTDA
 
Test Driven Development - Trabalhe tranquilo e maximize sua produtividade
Test Driven Development - Trabalhe tranquilo e maximize sua produtividadeTest Driven Development - Trabalhe tranquilo e maximize sua produtividade
Test Driven Development - Trabalhe tranquilo e maximize sua produtividadeFlávio Ribeiro
 
Desafios ria-classe-mundial
Desafios ria-classe-mundialDesafios ria-classe-mundial
Desafios ria-classe-mundialMarc Pires
 
Usabilidade 7-8 - Teste de Usabilidade
Usabilidade 7-8 - Teste de UsabilidadeUsabilidade 7-8 - Teste de Usabilidade
Usabilidade 7-8 - Teste de UsabilidadeMarcello Cardoso
 
Django Object factory
Django Object factoryDjango Object factory
Django Object factoryitalomaia
 
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQL
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQLFISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQL
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQLMaxwell Dayvson Da Silva
 
Designer ♥ Developer
Designer ♥ DeveloperDesigner ♥ Developer
Designer ♥ DeveloperClaus Wahlers
 
iOS, APIs e sincronização de dados
iOS, APIs e sincronização de dadosiOS, APIs e sincronização de dados
iOS, APIs e sincronização de dadosMaurício Linhares
 
Desenvolvimento orientado à introspecção
Desenvolvimento orientado à introspecçãoDesenvolvimento orientado à introspecção
Desenvolvimento orientado à introspecçãoSuccesSoft LTDA
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitAdolfo Neto
 
In tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisIn tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisAna Paula Gomes
 
TDD com LEGO #PHPExperience2016
TDD com LEGO #PHPExperience2016TDD com LEGO #PHPExperience2016
TDD com LEGO #PHPExperience2016Simone Pittner
 
PHP Experience 2016 - [Workshop] Agile: Test Driven Development
PHP Experience 2016 - [Workshop] Agile: Test Driven DevelopmentPHP Experience 2016 - [Workshop] Agile: Test Driven Development
PHP Experience 2016 - [Workshop] Agile: Test Driven DevelopmentiMasters
 
Coding Dojo - Funcionamento
Coding Dojo - FuncionamentoCoding Dojo - Funcionamento
Coding Dojo - Funcionamentothiagodp
 

Ähnlich wie TDC 2011 - E no sétimo dia ele escreveu testes (20)

Suite de Testes
Suite de TestesSuite de Testes
Suite de Testes
 
Fun driven development com Ruby
Fun driven development com RubyFun driven development com Ruby
Fun driven development com Ruby
 
Test Driven Development - Trabalhe tranquilo e maximize sua produtividade
Test Driven Development - Trabalhe tranquilo e maximize sua produtividadeTest Driven Development - Trabalhe tranquilo e maximize sua produtividade
Test Driven Development - Trabalhe tranquilo e maximize sua produtividade
 
Além do java
Além do javaAlém do java
Além do java
 
Desafios ria-classe-mundial
Desafios ria-classe-mundialDesafios ria-classe-mundial
Desafios ria-classe-mundial
 
Usabilidade 7-8 - Teste de Usabilidade
Usabilidade 7-8 - Teste de UsabilidadeUsabilidade 7-8 - Teste de Usabilidade
Usabilidade 7-8 - Teste de Usabilidade
 
Django Object factory
Django Object factoryDjango Object factory
Django Object factory
 
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQL
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQLFISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQL
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQL
 
Designer ♥ Developer
Designer ♥ DeveloperDesigner ♥ Developer
Designer ♥ Developer
 
iOS, APIs e sincronização de dados
iOS, APIs e sincronização de dadosiOS, APIs e sincronização de dados
iOS, APIs e sincronização de dados
 
Desenvolvimento orientado à introspecção
Desenvolvimento orientado à introspecçãoDesenvolvimento orientado à introspecção
Desenvolvimento orientado à introspecção
 
Usabilidade 1 - Conceitos
Usabilidade 1 - ConceitosUsabilidade 1 - Conceitos
Usabilidade 1 - Conceitos
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com Junit
 
Coding Dojo Techday
Coding Dojo TechdayCoding Dojo Techday
Coding Dojo Techday
 
In tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisIn tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e mais
 
Extreme Programming - XP
Extreme Programming - XPExtreme Programming - XP
Extreme Programming - XP
 
Somos jardineiros
Somos jardineirosSomos jardineiros
Somos jardineiros
 
TDD com LEGO #PHPExperience2016
TDD com LEGO #PHPExperience2016TDD com LEGO #PHPExperience2016
TDD com LEGO #PHPExperience2016
 
PHP Experience 2016 - [Workshop] Agile: Test Driven Development
PHP Experience 2016 - [Workshop] Agile: Test Driven DevelopmentPHP Experience 2016 - [Workshop] Agile: Test Driven Development
PHP Experience 2016 - [Workshop] Agile: Test Driven Development
 
Coding Dojo - Funcionamento
Coding Dojo - FuncionamentoCoding Dojo - Funcionamento
Coding Dojo - Funcionamento
 

Mehr von Rafael Dohms

The Individual Contributor Path - DPC2024
The Individual Contributor Path - DPC2024The Individual Contributor Path - DPC2024
The Individual Contributor Path - DPC2024Rafael Dohms
 
Application Metrics - IPC2023
Application Metrics - IPC2023Application Metrics - IPC2023
Application Metrics - IPC2023Rafael Dohms
 
How'd we get here? A guide to Architectural Decision Records
How'd we get here? A guide to Architectural Decision RecordsHow'd we get here? A guide to Architectural Decision Records
How'd we get here? A guide to Architectural Decision RecordsRafael Dohms
 
Architectural Decision Records - PHPConfBR
Architectural Decision Records - PHPConfBRArchitectural Decision Records - PHPConfBR
Architectural Decision Records - PHPConfBRRafael Dohms
 
Application Metrics (with Prometheus examples)
Application Metrics (with Prometheus examples)Application Metrics (with Prometheus examples)
Application Metrics (with Prometheus examples)Rafael Dohms
 
Application metrics - Confoo 2019
Application metrics - Confoo 2019Application metrics - Confoo 2019
Application metrics - Confoo 2019Rafael Dohms
 
Writing code you won’t hate tomorrow - PHPCE18
Writing code you won’t hate tomorrow - PHPCE18Writing code you won’t hate tomorrow - PHPCE18
Writing code you won’t hate tomorrow - PHPCE18Rafael Dohms
 
Application Metrics (with Prometheus examples) #PHPDD18
Application Metrics (with Prometheus examples) #PHPDD18Application Metrics (with Prometheus examples) #PHPDD18
Application Metrics (with Prometheus examples) #PHPDD18Rafael Dohms
 
Application metrics with Prometheus - DPC18
Application metrics with Prometheus - DPC18Application metrics with Prometheus - DPC18
Application metrics with Prometheus - DPC18Rafael Dohms
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonfRafael Dohms
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...Rafael Dohms
 
Composer The Right Way - 010PHP
Composer The Right Way - 010PHPComposer The Right Way - 010PHP
Composer The Right Way - 010PHPRafael Dohms
 
Writing Code That Lasts - #Magento2Seminar, Utrecht
Writing Code That Lasts - #Magento2Seminar, UtrechtWriting Code That Lasts - #Magento2Seminar, Utrecht
Writing Code That Lasts - #Magento2Seminar, UtrechtRafael Dohms
 
Composer the Right Way - PHPSRB16
Composer the Right Way - PHPSRB16Composer the Right Way - PHPSRB16
Composer the Right Way - PHPSRB16Rafael Dohms
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - #PHPSRB16
“Writing code that lasts” … or writing code you won’t hate tomorrow. - #PHPSRB16“Writing code that lasts” … or writing code you won’t hate tomorrow. - #PHPSRB16
“Writing code that lasts” … or writing code you won’t hate tomorrow. - #PHPSRB16Rafael Dohms
 
Composer the Right Way - MM16NL
Composer the Right Way - MM16NLComposer the Right Way - MM16NL
Composer the Right Way - MM16NLRafael Dohms
 
Composer The Right Way - PHPUGMRN
Composer The Right Way - PHPUGMRNComposer The Right Way - PHPUGMRN
Composer The Right Way - PHPUGMRNRafael Dohms
 
Composer the Right Way - PHPBNL16
Composer the Right Way - PHPBNL16Composer the Right Way - PHPBNL16
Composer the Right Way - PHPBNL16Rafael Dohms
 
“Writing code that lasts” … or writing code you won’t hate tomorrow.
“Writing code that lasts” … or writing code you won’t hate tomorrow.“Writing code that lasts” … or writing code you won’t hate tomorrow.
“Writing code that lasts” … or writing code you won’t hate tomorrow.Rafael Dohms
 
A Journey into your Lizard Brain - PHP Conference Brasil 2015
A Journey into your Lizard Brain - PHP Conference Brasil 2015A Journey into your Lizard Brain - PHP Conference Brasil 2015
A Journey into your Lizard Brain - PHP Conference Brasil 2015Rafael Dohms
 

Mehr von Rafael Dohms (20)

The Individual Contributor Path - DPC2024
The Individual Contributor Path - DPC2024The Individual Contributor Path - DPC2024
The Individual Contributor Path - DPC2024
 
Application Metrics - IPC2023
Application Metrics - IPC2023Application Metrics - IPC2023
Application Metrics - IPC2023
 
How'd we get here? A guide to Architectural Decision Records
How'd we get here? A guide to Architectural Decision RecordsHow'd we get here? A guide to Architectural Decision Records
How'd we get here? A guide to Architectural Decision Records
 
Architectural Decision Records - PHPConfBR
Architectural Decision Records - PHPConfBRArchitectural Decision Records - PHPConfBR
Architectural Decision Records - PHPConfBR
 
Application Metrics (with Prometheus examples)
Application Metrics (with Prometheus examples)Application Metrics (with Prometheus examples)
Application Metrics (with Prometheus examples)
 
Application metrics - Confoo 2019
Application metrics - Confoo 2019Application metrics - Confoo 2019
Application metrics - Confoo 2019
 
Writing code you won’t hate tomorrow - PHPCE18
Writing code you won’t hate tomorrow - PHPCE18Writing code you won’t hate tomorrow - PHPCE18
Writing code you won’t hate tomorrow - PHPCE18
 
Application Metrics (with Prometheus examples) #PHPDD18
Application Metrics (with Prometheus examples) #PHPDD18Application Metrics (with Prometheus examples) #PHPDD18
Application Metrics (with Prometheus examples) #PHPDD18
 
Application metrics with Prometheus - DPC18
Application metrics with Prometheus - DPC18Application metrics with Prometheus - DPC18
Application metrics with Prometheus - DPC18
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
 
Composer The Right Way - 010PHP
Composer The Right Way - 010PHPComposer The Right Way - 010PHP
Composer The Right Way - 010PHP
 
Writing Code That Lasts - #Magento2Seminar, Utrecht
Writing Code That Lasts - #Magento2Seminar, UtrechtWriting Code That Lasts - #Magento2Seminar, Utrecht
Writing Code That Lasts - #Magento2Seminar, Utrecht
 
Composer the Right Way - PHPSRB16
Composer the Right Way - PHPSRB16Composer the Right Way - PHPSRB16
Composer the Right Way - PHPSRB16
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - #PHPSRB16
“Writing code that lasts” … or writing code you won’t hate tomorrow. - #PHPSRB16“Writing code that lasts” … or writing code you won’t hate tomorrow. - #PHPSRB16
“Writing code that lasts” … or writing code you won’t hate tomorrow. - #PHPSRB16
 
Composer the Right Way - MM16NL
Composer the Right Way - MM16NLComposer the Right Way - MM16NL
Composer the Right Way - MM16NL
 
Composer The Right Way - PHPUGMRN
Composer The Right Way - PHPUGMRNComposer The Right Way - PHPUGMRN
Composer The Right Way - PHPUGMRN
 
Composer the Right Way - PHPBNL16
Composer the Right Way - PHPBNL16Composer the Right Way - PHPBNL16
Composer the Right Way - PHPBNL16
 
“Writing code that lasts” … or writing code you won’t hate tomorrow.
“Writing code that lasts” … or writing code you won’t hate tomorrow.“Writing code that lasts” … or writing code you won’t hate tomorrow.
“Writing code that lasts” … or writing code you won’t hate tomorrow.
 
A Journey into your Lizard Brain - PHP Conference Brasil 2015
A Journey into your Lizard Brain - PHP Conference Brasil 2015A Journey into your Lizard Brain - PHP Conference Brasil 2015
A Journey into your Lizard Brain - PHP Conference Brasil 2015
 

TDC 2011 - E no sétimo dia ele escreveu testes

  • 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 Saturday, July 9, 2011
  • 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. Saturday, July 9, 2011
  • 3. A CRIAÇÃO DO MUNDO do ponto de vista do desenvolvimento de software Saturday, July 9, 2011
  • 13. @OCriador * Adão has joined #earth Adão * Eva has joined #earth Eva Saturday, July 9, 2011
  • 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çã! Saturday, July 9, 2011
  • 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! Saturday, July 9, 2011
  • 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 Saturday, July 9, 2011
  • 17. Rafael Dohms photo credit: Eli White Evangelista PHP, membro ativo da Comunidade PHP e certificado ZCE. Ele ajudou na fundação de dois Grupos de Usuários de PHP ao longo do tempo e hoje compartilha a coordenação do PHPSP. Desenvolvedor, gamer e apaixonado por código ele também é host do primeiro podcast de PHP do Brasil: PHPSPCast. Atualmente ele trabalha na equipe SWAT do grupo MIH, uma equipe de experts que fornecem conhecimento técnico para o grupo além de trabalhar com P&D buscando novos nichos da internet e tecnologia. Seu papel como Desenvolvedor Sênior é codar, treinar e auxiliar outras empresas e se divertir enquanto faz isso. Saturday, July 9, 2011
  • 18. Sebastian Bergmann TESTES porque você precisa deles, mas ainda não sabe Saturday, July 9, 2011
  • 19. TESTES? • Descrever programaticamente um caso de uso válido e garantir sua funcionalidade • Forçar a execução de seu código em diversos cenários • Objetivos • Garantir funcionamento • Agilizar a refatoração • Testes automatizados Saturday, July 9, 2011
  • 20. 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 Saturday, July 9, 2011
  • 21. 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 Saturday, July 9, 2011
  • 22. 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 Saturday, July 9, 2011
  • 23. CADA SITUAÇÃO, UMA FERRAMENTA Frontend Backend PHP Selenium + PHPUnit PHPT PHPUnit Saturday, July 9, 2011
  • 24. skoop @flickr ESCREVENDO TESTES quando você começar, nunca mais vai parar Saturday, July 9, 2011
  • 25. MANOWARS! • Sistema de Batalhas • Garantindo o elemento aleatório • Ataque: Fixo + Random • Defesa: Fixo + Random • Damage: Atk/Def * Random Saturday, July 9, 2011
  • 26. 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! Saturday, July 9, 2011
  • 27. MW_MANO Vamos ver de perto o código Saturday, July 9, 2011
  • 28. 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 Saturday, July 9, 2011
  • 29. RAIO-X DE UMA SUITE DE TESTES PHPUnit_Framework_TestSuite AllTests Saturday, July 9, 2011
  • 30. RAIO-X DE UMA SUITE DE TESTES PHPUnit_Framework_TestSuite AllTests PHPUnit_Framework_TestCase ClassXTest PHPUnit_Framework_TestCase ClassXTest PHPUnit_Framework_TestCase ClassXTest Saturday, July 9, 2011
  • 31. 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 Saturday, July 9, 2011
  • 32. 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 Saturday, July 9, 2011
  • 33. EXECUÇÃO DA SUITE SetUp SetUp Para cada teste TearDown SetUp Para cada teste TearDown SetUp Para cada teste TearDown TearDown Saturday, July 9, 2011
  • 34. 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 Saturday, July 9, 2011
  • 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() { unlink($this->file); parent::tearDown(); } public function testFile() { file_put_contents($this->file); } Saturday, July 9, 2011
  • 36. 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); } Saturday, July 9, 2011
  • 37. 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); } Saturday, July 9, 2011
  • 38. QUANDO LIMPAR? class CleanUpTest extends PHPUnit_Framework_TestCase { private $file = "/tmp/file"; protected function setUp() { parent::setUp(); } protected function tearDown() { parent::tearDown(); } public function testFile() { file_put_contents($this->file); $this->assertSomething(...); unlink($this->file); } Saturday, July 9, 2011
  • 39. QUANDO LIMPAR? class CleanUpTest extends PHPUnit_Framework_TestCase { private $file = "/tmp/file"; protected function setUp() { parent::setUp(); } protected function tearDown() { parent::tearDown(); } public function testFile() { file_put_contents($this->file); $this->assertSomething(...); Interrompe o unlink($this->file); teste se falhar } Saturday, July 9, 2011
  • 40. TESTANDO OS BÁSICOS • Estrutura da Suite • AllTests.php • MW_Mano • Testes do 1 ao 6 Saturday, July 9, 2011
  • 41. 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 Saturday, July 9, 2011
  • 42. CÓDIGO DEINTESTÁVEL • Singletons • MyClass::getInstance(); • Dependências • SO: exec(‘ls -la’); • Recursos externos: APIs, File System • Métodos Privados • private method fazTudo(){...} Saturday, July 9, 2011
  • 43. 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')); } Saturday, July 9, 2011
  • 44. 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')); } Saturday, July 9, 2011
  • 45. CENAS ARRISCADAS • Porque, às vezes, os testes precisam de dublês • Removem dependências em código externo • Oferecem controle sobre resultados • Estratégias comuns: • Dummy, Fake, Stub, Spy, Mock Saturday, July 9, 2011
  • 46. MOCK OBJECT • Em português: falso, imitação (Objeto falso) • Significa: copiar, imitar ou falsificar • Objetivo: trocar algo que não temos controle por outro do qual podemos garantir o resultado, forçando diferentes cenários. Saturday, July 9, 2011
  • 47. 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()); } Saturday, July 9, 2011
  • 48. DATA PROVIDERS • Um teste, muitos dados • Análise completa de diferentes cenários Saturday, July 9, 2011
  • 49. CODE COVERAGE Medindo a eficiência de nossos testes • 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> Saturday, July 9, 2011
  • 51. Test Driven Development TDD Não é sobre testes, é sobre especificações Saturday, July 9, 2011
  • 52. “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 Saturday, July 9, 2011
  • 53. 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 Saturday, July 9, 2011
  • 54. Especificação Análise Codificação Manutenção Deploy Testes CICLO DE DESENVOLVIMENTO sem TDD Saturday, July 9, 2011
  • 63. Especificação Análise Codificação Manutenção Deploy Testes CICLO DE DESENVOLVIMENTO sem TDD Saturday, July 9, 2011
  • 64. Especificação Análise Testes Manutenção Deploy Codificação CICLO DE DESENVOLVIMENTO sem TDD Saturday, July 9, 2011
  • 65. Especificação Análise Testes Manutenção Deploy Codificação CICLO DE DESENVOLVIMENTO sem TDD Saturday, July 9, 2011
  • 66. Testes O que desejamos que <método> faça? Quais são os cenários que ele precisa estar preparado para lidar? Codificação Como <método> fará o que precisa? Sem formulários, teste direto o backend com os dados Saturday, July 9, 2011
  • 67. Especificação Análise Testes Manutenção Deploy Codificação CICLO DE DESENVOLVIMENTO sem com TDD Saturday, July 9, 2011
  • 68. 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 Saturday, July 9, 2011
  • 69. RINSE AND REPEAT Automatize seus testes e garanta qualidade da equipe Saturday, July 9, 2011
  • 70. CONTINUOS INTEGRATION • “Integração contínua” • Processo automatizado • Executado após cada commit • Identifica falhas • Identifica culpados • Controla qualidade Saturday, July 9, 2011
  • 72. FERRAMENTAS • phpUnderControl • Hudson • baseado no CruiseControl • Resultados de Testes • Versão atual já formata: • PHP Code Sniffer • Resultados de Testes • Code Coverage • PHP Code Sniffer • phpDoc • Code Coverage • Arbit • phpDoc • PHP! • Integração Contínua • Bug Tracker Saturday, July 9, 2011
  • 76. Obrigado! http://doh.ms rafael@doh.ms Slides: http://slides.doh.ms Código: https://github.com/rdohms/ManoWars Avalie essa palestra: http://joind.in/3571 Saturday, July 9, 2011