SlideShare uma empresa Scribd logo
1 de 37
Baixar para ler offline
Latinoware 2008
   Diego Tremper
   Zend Certified Engineer
   Entusiasta PHP
   Palestrante
   Estudante
   Introdução

   Motivação

   Vantagens

   Como funciona?

   O PHPUnit

       Instalação

       Caso de Teste

       Configurando o Teste

       PHPUnit_Framework_Assert

       Verificações de exceções

       Provedores de dados

       Code Coverage

   Perguntas
   Errar é inerente a natureza humana. Precaver-se
    contra os erros é uma atitude inteligente.
   O processo de desenvolvimento de software é sujeito
    a erros. Sendo assim, a atividade de teste é
    fundamental para se obter produtos de software com
    garantia de qualidade.
   Discordar ou ignorar a frase acima revela grande
    amadorismo.
   Testes Unitários
     São utilizados para testar as unidades de software

     desenvolvidas

     Tem como objetivo encontrar falhas de

     funcionamento dentro de uma pequena parte do
     sistema.
   Porque testar?
   “Na minha máquina funciona!”

   “Mas eu testei!”

   “Estranho!? parou de funcionar do nada!”

   “Será que vai dar problema se eu alterar
    isso?”
   Evita surpresas desagradáveis

   Reduz o tempo gasto com debug

   Auxilia o refectoring (E muito!!!!)

   Aumenta a qualidade do código

   É um dos primeiros passos para a Integração
    Contínua
1.   Definir a interface pública do alvo
2.   Implementar o esqueleto do alvo
3.   Definir quais métodos serão testados
4.   Definir os testes
5.   Projetar/implementar o caso de teste
6.   Implementar a classe alvo
7.   Executar os testes
8.   Analisar o resultado. Em caso de bugs voltar ao passo 6
9.   Avaliar a corvertura dos testes. Planejar e definir novos testes se necessário
   Caso de testes
     Calculadora

      Operações      Valores de entrada   Resultado esperado
      add            1+1                  2
      sub            7-2                  5
      div            30/3                 10
      mult           4*4                  16
      div            2/0                  Exceção???
   Escrito por Sebastian Bergmann
   Utilizado para escrever os testes
     É adequado para os níveis de teste unitário e de
      integração
     Usa asserções para testar os resultados esperados.

     Dispõem de métodos para facilitar a criação do
      ambiente de teste.
   Quem usa?
     eZ Systems
       ▪ eZ Components

     Zend Technolgies Ltd.
       ▪ Zend Framework

     PHP-GTK

     IBM SDO

     Creole

     Propel

     Phing

     Eu! 
$ pear channel-discover pear.phpunit.de
$ pear install phpunit/PHPUnit
   Classe Calculadora : definição da interface
    <?php

    class Calculadora {
             public function   add($arg1, $arg2)
             {}
             public function   sub($arg1, $arg2)
             {}
             public function   mult($arg1, $arg2)
             {}
             public function   div($arg1, $arg2)
             {}
    }
   Implementação dos testes
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calculadora.php';

    class CalculadoraTest extends PHPUnit_Framework_TestCase {
             private $calculadora;
             protected function setUp() {
                       $this->calculadora = new Calculadora ( );
             }

             public function testDiv($arg1, $arg2) {
                      $result = $this->calculadora->div ( 30, 3 );
                      $this->assertEquals ( 10, $result );
             }
    }
   Implementação dos testes
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calculadora.php';

    class CalculadoraTest extends PHPUnit_Framework_TestCase {
             private $calculadora;
             protected function setUp() {
                       $this->calculadora = new Calculadora ( );
             }

             public function testDiv($arg1, $arg2) { devem estender
                                  As classes de teste
    Caso de Teste     $result = $this->calculadora->div ( 30, 3 );
                                  a classe do framework
                      $this->assertEquals ( 10, $result );
             }
    }
   Implementação dos testes
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calculadora.php';

    class CalculadoraTest extends PHPUnit_Framework_TestCase {
             private $calculadora;
             protected function setUp() {
                       $this->calculadora = new Calculadora ( );
             }

             public function testDiv($arg1, $arg2) {
                        $result = $this->calculadora->div ( 30, 3 );
               Inicialização da classe alvo ( 10, $result );
                        $this->assertEquals
             }
    }
   Implementação dos testes
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calculadora.php';            Valores de entrada
    class CalculadoraTest extends PHPUnit_Framework_TestCase {
     Afirmação do resultado
             private $calculadora;
             protected function setUp() {
                       $this->calculadora = new Calculadora ( );
             }

             public function testDiv($arg1, $arg2) {
                      $result = $this->calculadora->div ( 30, 3 );
                      $this->assertEquals ( 10, $result );
             }
    }
   Classe Calculadora : implementação do alvo
    <?php

    class Calculadora {
             public function    add($arg1, $arg2) {
                       return   $arg1 + $arg2;
             }
             public function    sub($arg1, $arg2) {
                       return   $arg1 - $arg2;
             }
             public function    mult($arg1, $arg2) {
                       return   $arg1 * $arg2;
             }
             public function    div($arg1, $arg2) {
                       return   $arg1 / $arg2;
             }
    }
   Execução
   Entendendo a execução
     “.” Exibido quando a execução do teste é bem sucedida

     “F” Exibido quando ocorre uma falha na execução

     “E” Exibido quando ocorre um erro ao rodar o teste

     “S” Exibido quando um teste não é executado

     “I” Exibido quando um teste é marcado como imcompleto
      ou não implementado
   setUp() : será executado antes de cada teste
   tearDown() : será executado depois de cada
    teste


    setUp()           test*()       tearDown()
<?php

require_once 'PHPUnit/Framework/TestCase.php';
require_once 'Calculadora.php';

class CalculadoraTest extends PHPUnit_Framework_TestCase {

         private $calculadora;

         protected function setUp() {
                  $this->calculadora = new Calculadora ( );
         }

         public function testDiv() {}
         public function testMult() {}

         protected function tearDown() {
                  $this->calculadora = null;
         }
}
   markTestIncomplete($mensagem)
   markTestSkipped($mensagem)
   fail($mensagem)
   assertTrue($variavel)
   assertNull($variavel)
   assertEquals($esperado, $atual)
   assertContains($valor, $array)
   assertRegExp($padrao, $string)
   assertType($tipo, $variavel)
   Como verificar se meu método lança uma exceção?

    <?php

    class Calculadora {

             //...
             public function div($arg1, $arg2) {
               if (0 == $arg2)
                 throw new ArithmeticException('Somente Chuck Norris pode
                                                  dividir por zero!');
               return $arg1 / $arg2;
             }
             //...
    }
   Como verificar se meu método lança uma exceção?
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calculadora.php';

    class CalculadoraTest extends PHPUnit_Framework_TestCase {

             //...
             /**
              * @expectedException ArithmeticException
              */
             public function testDiv() {
               $this->calculadora->div(2, 0);
             }
             //...
    }
   Utilizando provedores de dados
     Util quando um mesmo método deve ser testado

     com diferentes valores

     Elimina a necessidade de ter vários testes apenas

     com os valores de entrada e/ou resultado
     esperado diferente
   Utilizando provedores de dados
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calculadora.php';

    class CalculadoraTest extends PHPUnit_Framework_TestCase {

        public function testAdd1() {
            $this->assertEquals( 4, $this->calculadora->mult(2, 2));
        }
        public function testAdd2() {
            $this->assertEquals( 9, $this->calculadora->mult(3, 3));
        }
        public function testAdd3() {
            $this->assertEquals( 16, $this->calculadora->mult(4, 4));
        }
    }
   Utilizando provedores de dados
        /**
          * @dataProvider dataProviderMult
          */
        public function testAddWithDataProvider($arg1, $arg2, $expected) {
             $this->assertEquals ( $expected,
                 $this->calculadora->add ( $arg1, $arg2 )
             );
        }
        /**
          * @return array(array)
          */
          public static function dataProviderMult() {
              return array (
                  // array ( argumento 1 , argumento 2 , resultado esperado )
                             array ( 2 , 2 , 4 ),
                             array ( 3 , 3 , 9 )
                     );
          }
    }
   Como testar os meus testes?
   Como saber quantos por cento de meu
    código está coberto por testes?
   Como saber quais linhas do meu código estão
    cobertas por testes?
   Utiliza a extensão xDebug
$ phpunit –coverage-html ./coverage CalculadoraTest.php
Linhas que estão cobertas
  por testes




Linhas que não estão cobertas
por testes
   Testar é uma atividade destrutiva!
   Pense de forma negativa quando estiver
    criando planos de teste ou explorando o
    software!
   Explore funcionalidades, pense no que não foi
    pensado!
Perguntas?
Obrigado!!!
       Contato: diegotremper@gmail.com
LinkedIn: http://www.linkedin.com/in/diegotremper
       Blog: http://www.diegotremper.com
   http://www.phpunit.de/
   http://www.xdebug.org

Mais conteúdo relacionado

Mais procurados

Testes Unitários com GTest e Catch
Testes Unitários com GTest e CatchTestes Unitários com GTest e Catch
Testes Unitários com GTest e CatchUilian Ries
 
Dojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarDojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarLuiz Ribeiro
 
Atividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em JavaAtividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em Javaaceiro
 
Exercícios da Aula de LAB 02
Exercícios da Aula de LAB 02Exercícios da Aula de LAB 02
Exercícios da Aula de LAB 02thomasdacosta
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009silva.edgar
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYraquelcarsi
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesCarlos Santos
 
Aula 6 1 linguagem pascal-parte_1
Aula 6   1 linguagem pascal-parte_1Aula 6   1 linguagem pascal-parte_1
Aula 6 1 linguagem pascal-parte_1Duane Bertoldo
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de RefactoringRodrigo Branas
 
Testes automatizados
Testes automatizadosTestes automatizados
Testes automatizadosRodrigo Maia
 
Testes unitários e de integração: Quando e Porque
Testes unitários e de integração: Quando e PorqueTestes unitários e de integração: Quando e Porque
Testes unitários e de integração: Quando e PorqueTiago Albineli Motta
 

Mais procurados (20)

Testes Unitários com GTest e Catch
Testes Unitários com GTest e CatchTestes Unitários com GTest e Catch
Testes Unitários com GTest e Catch
 
Series lab
Series labSeries lab
Series lab
 
Dojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarDojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCar
 
Atividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em JavaAtividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em Java
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Exercícios da Aula de LAB 02
Exercícios da Aula de LAB 02Exercícios da Aula de LAB 02
Exercícios da Aula de LAB 02
 
Php 08 Oo
Php 08 OoPhp 08 Oo
Php 08 Oo
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009
 
Java 16 Jdbc
Java 16 JdbcJava 16 Jdbc
Java 16 Jdbc
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITY
 
Solid
SolidSolid
Solid
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - Funções
 
Aula 6 1 linguagem pascal-parte_1
Aula 6   1 linguagem pascal-parte_1Aula 6   1 linguagem pascal-parte_1
Aula 6 1 linguagem pascal-parte_1
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de Refactoring
 
Testes automatizados
Testes automatizadosTestes automatizados
Testes automatizados
 
Testes unitários e de integração: Quando e Porque
Testes unitários e de integração: Quando e PorqueTestes unitários e de integração: Quando e Porque
Testes unitários e de integração: Quando e Porque
 
GUI Aplicações Gráficas
GUI Aplicações Gráficas GUI Aplicações Gráficas
GUI Aplicações Gráficas
 
SubProgramas
SubProgramasSubProgramas
SubProgramas
 
Labs Jogos Java
Labs Jogos JavaLabs Jogos Java
Labs Jogos Java
 

Semelhante a Qualidade no desenvolvimento de software com PHPUnit

Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
Testes de unidade na prática
Testes de unidade na práticaTestes de unidade na prática
Testes de unidade na práticaTiago Furtado
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que pareceImpacta Eventos
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação WebDalton Martins
 
JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitárioselliando dias
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010rafaelferreira
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnitelliando dias
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizadosCristian R. Silva
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Programação web ii aulas 06 e 07
Programação web ii   aulas 06 e 07Programação web ii   aulas 06 e 07
Programação web ii aulas 06 e 07Yuri Bispo
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Exercícios java 20 02
Exercícios java 20   02Exercícios java 20   02
Exercícios java 20 02julyesersantos
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 

Semelhante a Qualidade no desenvolvimento de software com PHPUnit (20)

Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Testes de unidade na prática
Testes de unidade na práticaTestes de unidade na prática
Testes de unidade na prática
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Aula5
Aula5Aula5
Aula5
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação Web
 
JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitários
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizados
 
PowerShell
PowerShellPowerShell
PowerShell
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Frameworks para C 3º DeSif
Frameworks para C 3º DeSifFrameworks para C 3º DeSif
Frameworks para C 3º DeSif
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Javascript
JavascriptJavascript
Javascript
 
Programação web ii aulas 06 e 07
Programação web ii   aulas 06 e 07Programação web ii   aulas 06 e 07
Programação web ii aulas 06 e 07
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Exercícios java 20 02
Exercícios java 20   02Exercícios java 20   02
Exercícios java 20 02
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 

Qualidade no desenvolvimento de software com PHPUnit

  • 2. Diego Tremper  Zend Certified Engineer  Entusiasta PHP  Palestrante  Estudante
  • 3. Introdução  Motivação  Vantagens  Como funciona?  O PHPUnit  Instalação  Caso de Teste  Configurando o Teste  PHPUnit_Framework_Assert  Verificações de exceções  Provedores de dados  Code Coverage  Perguntas
  • 4. Errar é inerente a natureza humana. Precaver-se contra os erros é uma atitude inteligente.  O processo de desenvolvimento de software é sujeito a erros. Sendo assim, a atividade de teste é fundamental para se obter produtos de software com garantia de qualidade.  Discordar ou ignorar a frase acima revela grande amadorismo.
  • 5. Testes Unitários  São utilizados para testar as unidades de software desenvolvidas  Tem como objetivo encontrar falhas de funcionamento dentro de uma pequena parte do sistema.
  • 6. Porque testar?
  • 7. “Na minha máquina funciona!”  “Mas eu testei!”  “Estranho!? parou de funcionar do nada!”  “Será que vai dar problema se eu alterar isso?”
  • 8. Evita surpresas desagradáveis  Reduz o tempo gasto com debug  Auxilia o refectoring (E muito!!!!)  Aumenta a qualidade do código  É um dos primeiros passos para a Integração Contínua
  • 9. 1. Definir a interface pública do alvo 2. Implementar o esqueleto do alvo 3. Definir quais métodos serão testados 4. Definir os testes 5. Projetar/implementar o caso de teste 6. Implementar a classe alvo 7. Executar os testes 8. Analisar o resultado. Em caso de bugs voltar ao passo 6 9. Avaliar a corvertura dos testes. Planejar e definir novos testes se necessário
  • 10. Caso de testes  Calculadora Operações Valores de entrada Resultado esperado add 1+1 2 sub 7-2 5 div 30/3 10 mult 4*4 16 div 2/0 Exceção???
  • 11. Escrito por Sebastian Bergmann  Utilizado para escrever os testes  É adequado para os níveis de teste unitário e de integração  Usa asserções para testar os resultados esperados.  Dispõem de métodos para facilitar a criação do ambiente de teste.
  • 12. Quem usa?  eZ Systems ▪ eZ Components  Zend Technolgies Ltd. ▪ Zend Framework  PHP-GTK  IBM SDO  Creole  Propel  Phing  Eu! 
  • 13. $ pear channel-discover pear.phpunit.de $ pear install phpunit/PHPUnit
  • 14. Classe Calculadora : definição da interface <?php class Calculadora { public function add($arg1, $arg2) {} public function sub($arg1, $arg2) {} public function mult($arg1, $arg2) {} public function div($arg1, $arg2) {} }
  • 15. Implementação dos testes <?php require_once 'PHPUnit/Framework/TestCase.php'; require_once 'Calculadora.php'; class CalculadoraTest extends PHPUnit_Framework_TestCase { private $calculadora; protected function setUp() { $this->calculadora = new Calculadora ( ); } public function testDiv($arg1, $arg2) { $result = $this->calculadora->div ( 30, 3 ); $this->assertEquals ( 10, $result ); } }
  • 16. Implementação dos testes <?php require_once 'PHPUnit/Framework/TestCase.php'; require_once 'Calculadora.php'; class CalculadoraTest extends PHPUnit_Framework_TestCase { private $calculadora; protected function setUp() { $this->calculadora = new Calculadora ( ); } public function testDiv($arg1, $arg2) { devem estender As classes de teste Caso de Teste $result = $this->calculadora->div ( 30, 3 ); a classe do framework $this->assertEquals ( 10, $result ); } }
  • 17. Implementação dos testes <?php require_once 'PHPUnit/Framework/TestCase.php'; require_once 'Calculadora.php'; class CalculadoraTest extends PHPUnit_Framework_TestCase { private $calculadora; protected function setUp() { $this->calculadora = new Calculadora ( ); } public function testDiv($arg1, $arg2) { $result = $this->calculadora->div ( 30, 3 ); Inicialização da classe alvo ( 10, $result ); $this->assertEquals } }
  • 18. Implementação dos testes <?php require_once 'PHPUnit/Framework/TestCase.php'; require_once 'Calculadora.php'; Valores de entrada class CalculadoraTest extends PHPUnit_Framework_TestCase { Afirmação do resultado private $calculadora; protected function setUp() { $this->calculadora = new Calculadora ( ); } public function testDiv($arg1, $arg2) { $result = $this->calculadora->div ( 30, 3 ); $this->assertEquals ( 10, $result ); } }
  • 19. Classe Calculadora : implementação do alvo <?php class Calculadora { public function add($arg1, $arg2) { return $arg1 + $arg2; } public function sub($arg1, $arg2) { return $arg1 - $arg2; } public function mult($arg1, $arg2) { return $arg1 * $arg2; } public function div($arg1, $arg2) { return $arg1 / $arg2; } }
  • 20. Execução
  • 21. Entendendo a execução  “.” Exibido quando a execução do teste é bem sucedida  “F” Exibido quando ocorre uma falha na execução  “E” Exibido quando ocorre um erro ao rodar o teste  “S” Exibido quando um teste não é executado  “I” Exibido quando um teste é marcado como imcompleto ou não implementado
  • 22. setUp() : será executado antes de cada teste  tearDown() : será executado depois de cada teste setUp() test*() tearDown()
  • 23. <?php require_once 'PHPUnit/Framework/TestCase.php'; require_once 'Calculadora.php'; class CalculadoraTest extends PHPUnit_Framework_TestCase { private $calculadora; protected function setUp() { $this->calculadora = new Calculadora ( ); } public function testDiv() {} public function testMult() {} protected function tearDown() { $this->calculadora = null; } }
  • 24. markTestIncomplete($mensagem)  markTestSkipped($mensagem)  fail($mensagem)  assertTrue($variavel)  assertNull($variavel)  assertEquals($esperado, $atual)  assertContains($valor, $array)  assertRegExp($padrao, $string)  assertType($tipo, $variavel)
  • 25. Como verificar se meu método lança uma exceção? <?php class Calculadora { //... public function div($arg1, $arg2) { if (0 == $arg2) throw new ArithmeticException('Somente Chuck Norris pode dividir por zero!'); return $arg1 / $arg2; } //... }
  • 26. Como verificar se meu método lança uma exceção? <?php require_once 'PHPUnit/Framework/TestCase.php'; require_once 'Calculadora.php'; class CalculadoraTest extends PHPUnit_Framework_TestCase { //... /** * @expectedException ArithmeticException */ public function testDiv() { $this->calculadora->div(2, 0); } //... }
  • 27. Utilizando provedores de dados  Util quando um mesmo método deve ser testado com diferentes valores  Elimina a necessidade de ter vários testes apenas com os valores de entrada e/ou resultado esperado diferente
  • 28. Utilizando provedores de dados <?php require_once 'PHPUnit/Framework/TestCase.php'; require_once 'Calculadora.php'; class CalculadoraTest extends PHPUnit_Framework_TestCase { public function testAdd1() { $this->assertEquals( 4, $this->calculadora->mult(2, 2)); } public function testAdd2() { $this->assertEquals( 9, $this->calculadora->mult(3, 3)); } public function testAdd3() { $this->assertEquals( 16, $this->calculadora->mult(4, 4)); } }
  • 29. Utilizando provedores de dados /** * @dataProvider dataProviderMult */ public function testAddWithDataProvider($arg1, $arg2, $expected) { $this->assertEquals ( $expected, $this->calculadora->add ( $arg1, $arg2 ) ); } /** * @return array(array) */ public static function dataProviderMult() { return array ( // array ( argumento 1 , argumento 2 , resultado esperado ) array ( 2 , 2 , 4 ), array ( 3 , 3 , 9 ) ); } }
  • 30. Como testar os meus testes?  Como saber quantos por cento de meu código está coberto por testes?  Como saber quais linhas do meu código estão cobertas por testes?
  • 31. Utiliza a extensão xDebug $ phpunit –coverage-html ./coverage CalculadoraTest.php
  • 32.
  • 33. Linhas que estão cobertas por testes Linhas que não estão cobertas por testes
  • 34. Testar é uma atividade destrutiva!  Pense de forma negativa quando estiver criando planos de teste ou explorando o software!  Explore funcionalidades, pense no que não foi pensado!
  • 36. Obrigado!!! Contato: diegotremper@gmail.com LinkedIn: http://www.linkedin.com/in/diegotremper Blog: http://www.diegotremper.com
  • 37. http://www.phpunit.de/  http://www.xdebug.org