Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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...
   Errar é inerente a natureza humana. Precaver-se
    contra os erros é uma atitude inteligente.
   O processo de desen...
   Testes Unitários
     São utilizados para testar as unidades de software

     desenvolvidas

     Tem como objetivo...
   Porque testar?
   “Na minha máquina funciona!”

   “Mas eu testei!”

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

   “Será que vai da...
   Evita surpresas desagradáveis

   Reduz o tempo gasto com debug

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

   Aumenta...
1.   Definir a interface pública do alvo
2.   Implementar o esqueleto do alvo
3.   Definir quais métodos serão testados
4....
   Caso de testes
     Calculadora

      Operações      Valores de entrada   Resultado esperado
      add            1+...
   Escrito por Sebastian Bergmann
   Utilizado para escrever os testes
     É adequado para os níveis de teste unitário...
   Quem usa?
     eZ Systems
       ▪ eZ Components

     Zend Technolgies Ltd.
       ▪ Zend Framework

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

    class Calculadora {
             public function   add($arg...
   Implementação dos testes
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calculadora.p...
   Implementação dos testes
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calculadora.p...
   Implementação dos testes
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calculadora.p...
   Implementação dos testes
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calculadora.p...
   Classe Calculadora : implementação do alvo
    <?php

    class Calculadora {
             public function    add($arg...
   Execução
   Entendendo a execução
     “.” Exibido quando a execução do teste é bem sucedida

     “F” Exibido quando ocorre uma...
   setUp() : será executado antes de cada teste
   tearDown() : será executado depois de cada
    teste


    setUp()   ...
<?php

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

class CalculadoraTest extends PHPUn...
   markTestIncomplete($mensagem)
   markTestSkipped($mensagem)
   fail($mensagem)
   assertTrue($variavel)
   assertN...
   Como verificar se meu método lança uma exceção?

    <?php

    class Calculadora {

             //...
             p...
   Como verificar se meu método lança uma exceção?
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    requ...
   Utilizando provedores de dados
     Util quando um mesmo método deve ser testado

     com diferentes valores

     ...
   Utilizando provedores de dados
    <?php

    require_once 'PHPUnit/Framework/TestCase.php';
    require_once 'Calcula...
   Utilizando provedores de dados
        /**
          * @dataProvider dataProviderMult
          */
        public func...
   Como testar os meus testes?
   Como saber quantos por cento de meu
    código está coberto por testes?
   Como saber...
   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 explorand...
Perguntas?
Obrigado!!!
       Contato: diegotremper@gmail.com
LinkedIn: http://www.linkedin.com/in/diegotremper
       Blog: http://w...
   http://www.phpunit.de/
   http://www.xdebug.org
Qualidade no desenvolvimento de software com PHPUnit
Upcoming SlideShare
Loading in …5
×

Qualidade no desenvolvimento de software com PHPUnit

5,005 views

Published on

Palestra sobre PHPUnit apresentada no Latinoware 2008

Published in: Technology

Qualidade no desenvolvimento de software com PHPUnit

  1. 1. Latinoware 2008
  2. 2.  Diego Tremper  Zend Certified Engineer  Entusiasta PHP  Palestrante  Estudante
  3. 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. 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. 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. 6.  Porque testar?
  7. 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. 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. 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. 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. 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. 12.  Quem usa?  eZ Systems ▪ eZ Components  Zend Technolgies Ltd. ▪ Zend Framework  PHP-GTK  IBM SDO  Creole  Propel  Phing  Eu! 
  13. 13. $ pear channel-discover pear.phpunit.de $ pear install phpunit/PHPUnit
  14. 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. 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. 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. 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. 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. 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. 20.  Execução
  21. 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. 22.  setUp() : será executado antes de cada teste  tearDown() : será executado depois de cada teste setUp() test*() tearDown()
  23. 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. 24.  markTestIncomplete($mensagem)  markTestSkipped($mensagem)  fail($mensagem)  assertTrue($variavel)  assertNull($variavel)  assertEquals($esperado, $atual)  assertContains($valor, $array)  assertRegExp($padrao, $string)  assertType($tipo, $variavel)
  25. 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. 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. 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. 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. 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. 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. 31.  Utiliza a extensão xDebug $ phpunit –coverage-html ./coverage CalculadoraTest.php
  32. 32. Linhas que estão cobertas por testes Linhas que não estão cobertas por testes
  33. 33.  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!
  34. 34. Perguntas?
  35. 35. Obrigado!!! Contato: diegotremper@gmail.com LinkedIn: http://www.linkedin.com/in/diegotremper Blog: http://www.diegotremper.com
  36. 36.  http://www.phpunit.de/  http://www.xdebug.org

×