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

4,945 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

×