Qualidade no desenvolvimento de Software com PHPUnit
Roteiro <ul><li>Introdução </li></ul><ul><li>Motivações </li></ul><ul><li>O PHPUnit </li></ul><ul><li>Prática </li></ul><u...
Introdução <ul><li>Testes Unitários </li></ul><ul><ul><li>São utilizados para testar as menores unidades de software desen...
Motivações <ul><li>Porque Testar? </li></ul><ul><ul><li>Evita surpresas desagradáveis </li></ul></ul><ul><ul><li>Reduz o t...
Motivações <ul><li>Diagnosticar e resolver problemas após a entrega é freqüentemente 100 vezes mais caro do que fazê-lo du...
Motivações <ul><li>Atitudes </li></ul><ul><ul><li>Testar é uma  atividade destrutiva ! </li></ul></ul><ul><ul><li>Pense de...
O PHPUnit <ul><li>Escrito por Sebastian Bergmann </li></ul><ul><li>Baseado nos conceitos do JUnit </li></ul><ul><li>Atualm...
O PHPUnit <ul><li>Quem usa? </li></ul><ul><ul><li>eZ Systems </li></ul></ul><ul><ul><ul><li>eZ Components </li></ul></ul><...
Instalação $ wget http://pear.phpunit.de/get/PHPUnit-3.2.2.tgz $ tar zxf PHPUnit-3.2.2.tgz $ cd PHPUnit-3.2.2 $ mv pear-ph...
Prática No PHP $ vi /usr/local/php5/lib/php.ini include_path = &quot;.: /opt/phpunit &quot;
TextUI TestRunner
Nosso primeiro teste <ul><li>Exemplo da classe Calculadora </li></ul><?php class   Calculadora { public   function   somar...
Nosso primeiro teste <ul><li>Nosso TestCase </li></ul><?php require_once ( 'PHPUnit/Framework/TestCase.php' ); require_onc...
Nosso primeiro teste $ phpunit <TestCase> $ phpunit <TestCase> <Arquivo>
Entendendo a execução <ul><li>“ .” Exibido quando a execução do teste é bem sucedida </li></ul><ul><li>“ F” Exibido quando...
setUp e tearDown class   LinkedListTest   extends   PHPUnit_Framework_TestCase { private   $dados ; protected   function  ...
PHPUnit_Framework_Assert <ul><li>markTestIncomplete($mensagem) </li></ul><ul><li>markTestSkipped($mensagem) </li></ul><ul>...
PHPUnit_Framework_Assert <ul><li>void assertContains($valor, $array) </li></ul><ul><li>void assertRegExp($padrao, $string)...
Skeleton
Skeleton <?php class   Calculadora   { /**   *   * @assert (2,3) == 5   */ public   function   somar   (   $arg1   ,   $ar...
Organizando seus testes Application/ Package/ Class (Application/Package/Class.php) ... ... ... Tests/ AllTests.php Packag...
Organizando seus testes <?php require_once ( 'PHPUnit/Framework/TestSuite.php' ); /** * inclue suites de testes que estão ...
Organizando seus testes <?php require_once   ( 'PHPUnit/Framework/TestSuite.php' )   ; require_once   (dirname   (   __FIL...
Code Coverage <ul><li>Como testar os meus testes? </li></ul><ul><li>Como saber quantos por cento de meu código esta cobert...
Code Coverage <ul><li>Utiliza a extensão xDebug </li></ul>$ phpunit --coverage-html ./code_coverage AllTests.php
Code Coverage
Code Coverage
Integração Contínua <ul><li>Consiste em um ambiente onde cada membro da equipe integra pequenas partes ao software diariam...
Integração Contínua
Integração Contínua
Integração Contínua
Integração Contínua
Desenvolvimento Orientado a Testes <ul><li>Do inglês Test-driven development (TDD)‏ </li></ul><ul><li>Tem como objetivo an...
Perguntas?
Links <ul><li>www.diegotremper.com </li></ul><ul><li>http://cruisecontrol.sourceforge.net/ </li></ul><ul><li>http://www.ph...
Obrigado!!!
Upcoming SlideShare
Loading in …5
×

Qualidade no desenvolvimento de software com PHPUnit

3,977 views

Published on

Palestra apresentada por Diego Tremper em dezembro de 2007 no PHP Conference Brasil 2007.
Osasco/SP

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,977
On SlideShare
0
From Embeds
0
Number of Embeds
68
Actions
Shares
0
Downloads
127
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Qualidade no desenvolvimento de software com PHPUnit

  1. 1. Qualidade no desenvolvimento de Software com PHPUnit
  2. 2. Roteiro <ul><li>Introdução </li></ul><ul><li>Motivações </li></ul><ul><li>O PHPUnit </li></ul><ul><li>Prática </li></ul><ul><li>Integração Contínua </li></ul><ul><li>Desenvolvimento Orientado a Testes (TDD)‏ </li></ul><ul><li>Perguntas </li></ul>
  3. 3. Introdução <ul><li>Testes Unitários </li></ul><ul><ul><li>São utilizados para testar as menores unidades de software desenvolvidas </li></ul></ul><ul><ul><li>Tem como objetivo encontrar falhas de funcionamento dentro de uma pequena parte do sistema. </li></ul></ul>
  4. 4. Motivações <ul><li>Porque Testar? </li></ul><ul><ul><li>Evita surpresas desagradáveis </li></ul></ul><ul><ul><li>Reduz o tempo gasto com debug </li></ul></ul><ul><ul><li>Auxilia o refactoring </li></ul></ul><ul><ul><li>O código está na fresco na mente, quaisquer erros podem ser corrigidos normalmente de maneira rápida. </li></ul></ul>
  5. 5. Motivações <ul><li>Diagnosticar e resolver problemas após a entrega é freqüentemente 100 vezes mais caro do que fazê-lo durante as fases de análise de requisitos, arquitetura e projeto. </li></ul>
  6. 6. Motivações <ul><li>Atitudes </li></ul><ul><ul><li>Testar é uma atividade destrutiva ! </li></ul></ul><ul><ul><li>Pense de forma negativa quando estiver criando planos de teste ou explorando o software! </li></ul></ul><ul><ul><li>Explore funcionalidades, pense no que não foi pensado! </li></ul></ul>
  7. 7. O PHPUnit <ul><li>Escrito por Sebastian Bergmann </li></ul><ul><li>Baseado nos conceitos do JUnit </li></ul><ul><li>Atualmente na versão 3.2.2 </li></ul><ul><li>Requer PHP 5 </li></ul>
  8. 8. O PHPUnit <ul><li>Quem usa? </li></ul><ul><ul><li>eZ Systems </li></ul></ul><ul><ul><ul><li>eZ Components </li></ul></ul></ul><ul><ul><li>Zend Technolgies Ltd. </li></ul></ul><ul><ul><ul><li>Zend Framework </li></ul></ul></ul><ul><ul><li>PHP-GTK </li></ul></ul><ul><ul><li>IBM SDO </li></ul></ul><ul><ul><li>Agavi </li></ul></ul><ul><ul><li>Creole </li></ul></ul><ul><ul><li>Propel </li></ul></ul><ul><ul><li>Phing </li></ul></ul><ul><ul><li>Serendipity </li></ul></ul><ul><ul><li>Eu!  </li></ul></ul>
  9. 9. Instalação $ wget http://pear.phpunit.de/get/PHPUnit-3.2.2.tgz $ tar zxf PHPUnit-3.2.2.tgz $ cd PHPUnit-3.2.2 $ mv pear-phpunit phpunit $ cd .. $ cp -fR PHPUnit-3.2.2 /opt/ $ cd /opt $ ln -s PHPUnit-3.2.2/ phpunit $ vi /opt/phpunit/phpunit #! @php_bin@ -d safe_mode=Off #! /usr/bin/php -d safe_mode=Off <--substituir @php_bin@ $ chmod +x /opt/phpunit/phpunit
  10. 10. Prática No PHP $ vi /usr/local/php5/lib/php.ini include_path = &quot;.: /opt/phpunit &quot;
  11. 11. TextUI TestRunner
  12. 12. Nosso primeiro teste <ul><li>Exemplo da classe Calculadora </li></ul><?php class Calculadora { public function somar( $arg1 , $arg2 )‏ { return $arg1 + $arg2 ; } } Classe que testaremos Criaremos um teste para afirmar que o método Calculadora::somar() realmente soma corretamente os dois argumentos passados
  13. 13. Nosso primeiro teste <ul><li>Nosso TestCase </li></ul><?php require_once ( 'PHPUnit/Framework/TestCase.php' ); require_once ( 'Calculadora.php' ); class CalculadoraTest extends PHPUnit_Framework_TestCase { public function testS omar()‏ { $calculadora = new Calculadora(); $resultado = $calculadora ->somar( 5 , 3 ); $this ->assertEquals( 8 , $resultado ); } } Classes de teste devem estender a classe PHPUnit_Framework_TestCase método que ira testar a soma
  14. 14. Nosso primeiro teste $ phpunit <TestCase> $ phpunit <TestCase> <Arquivo>
  15. 15. Entendendo a execução <ul><li>“ .” Exibido quando a execução do teste é bem sucedida </li></ul><ul><li>“ F” Exibido quando ocorre uma falha na execução </li></ul><ul><li>“ E” Exibido quando ocorre um erro ao rodar o teste </li></ul><ul><li>“ S” Exibido quando um teste não é executado </li></ul><ul><li>“ I” Exibido quando um teste é marcado como imcompleto ou não implementado </li></ul>
  16. 16. setUp e tearDown class LinkedListTest extends PHPUnit_Framework_TestCase { private $dados ; protected function setUp() { parent ::setUp(); $this ->dados = array ( &quot;PHP&quot; , &quot;Java&quot; , &quot;Ruby&quot; , &quot;Python&quot; ); } protected function tearDown() { parent ::tearDown(); $this ->dados = null; } }
  17. 17. PHPUnit_Framework_Assert <ul><li>markTestIncomplete($mensagem) </li></ul><ul><li>markTestSkipped($mensagem) </li></ul><ul><li>fail() </li></ul><ul><li>void assertTrue($variavel) </li></ul><ul><li>void assertNull($variavel) </li></ul><ul><li>void assertEquals($esperado, $atual) </li></ul>
  18. 18. PHPUnit_Framework_Assert <ul><li>void assertContains($valor, $array) </li></ul><ul><li>void assertRegExp($padrao, $string) </li></ul><ul><li>void assertType($typo, $variavel) </li></ul><ul><li>... </li></ul>
  19. 19. Skeleton
  20. 20. Skeleton <?php class Calculadora { /** * * @assert (2,3) == 5 */ public function somar ( $arg1 , $arg2 ) { return $arg1 + $arg2 ; } /** * * @assert (10,2) == 8 * @assert (12,2) == 10 * @assert (100,97) == 3 * @assert (5,3) == 2 */ public function subtrair ( $arg1 , $arg2 ) { return $arg1 - $arg2 ; } }
  21. 21. Organizando seus testes Application/ Package/ Class (Application/Package/Class.php) ... ... ... Tests/ AllTests.php Package/ Package_AllTests.php ClassTest (Application/Tests/Package/ClassTest.php)
  22. 22. Organizando seus testes <?php require_once ( 'PHPUnit/Framework/TestSuite.php' ); /** * inclue suites de testes que estão em um nível inferior */ require_once (dirname(__FILE__). '/Lista/AllTests.php' ); /** * inclue classes de teste no mesmo diretório */ require_once (dirname(__FILE__). '/CalculadoraTest.php' ); class AllTests { public static function suite() { $suite = new PHPUnit_Framework_TestSuite( 'PHP Conference' ); $suite ->addTest(Lista_AllTests::suite()); $suite ->addTestSuite( &quot;CalculadoraTest&quot; ); return $suite ; } }
  23. 23. Organizando seus testes <?php require_once ( 'PHPUnit/Framework/TestSuite.php' ) ; require_once (dirname ( __FILE__ ) . '/LinkedListTest.php' ) ; class Lista_AllTests extends PHPUnit_Framework_TestSuite { protected function setUp () { //-- criando ambiente } public static function suite () { $suite = new PHPUnit_Framework_TestSuite ( 'PHP Conference - Listas' ) ; $suite ->addTestSuite ( 'LinkedListTest' ) ; return $suite ; } protected function tearDown () { //-- desfazendo ambiente } }
  24. 24. Code Coverage <ul><li>Como testar os meus testes? </li></ul><ul><li>Como saber quantos por cento de meu código esta coberto por testes? </li></ul><ul><li>Como saber quais linhas do meu código estão cobertas por testes? </li></ul>
  25. 25. Code Coverage <ul><li>Utiliza a extensão xDebug </li></ul>$ phpunit --coverage-html ./code_coverage AllTests.php
  26. 26. Code Coverage
  27. 27. Code Coverage
  28. 28. Integração Contínua <ul><li>Consiste em um ambiente onde cada membro da equipe integra pequenas partes ao software diariamente </li></ul><ul><li>A integração destas partes é sempre verificada e testada através de builds automatizados </li></ul>
  29. 29. Integração Contínua
  30. 30. Integração Contínua
  31. 31. Integração Contínua
  32. 32. Integração Contínua
  33. 33. Desenvolvimento Orientado a Testes <ul><li>Do inglês Test-driven development (TDD)‏ </li></ul><ul><li>Tem como objetivo antecipar a identificação de falhas durante o desenvolvimento </li></ul><ul><li>Três passos </li></ul><ul><ul><li>Escrever o teste </li></ul></ul><ul><ul><li>Escrever o código </li></ul></ul><ul><ul><li>Melhorar o código </li></ul></ul>
  34. 34. Perguntas?
  35. 35. Links <ul><li>www.diegotremper.com </li></ul><ul><li>http://cruisecontrol.sourceforge.net/ </li></ul><ul><li>http://www.phpunit.de/ </li></ul><ul><li>http://www.phpunit.de/wiki/phpUnderControl </li></ul><ul><li>http://pear.php.net/package/PHP_CodeSniffer </li></ul><ul><li>http://www.phpdoc.org/ </li></ul>
  36. 36. Obrigado!!!

×