SlideShare uma empresa Scribd logo
Qualidade no desenvolvimento de Software com PHPUnit
Roteiro Introdução Motivações O PHPUnit Prática Integração Contínua Desenvolvimento Orientado a Testes (TDD)‏ Perguntas
Introdução Testes Unitários São utilizados para testar as menores unidades de software desenvolvidas Tem como objetivo  encontrar falhas  de funcionamento dentro de uma pequena parte do sistema.
Motivações Porque Testar? Evita surpresas desagradáveis Reduz o tempo gasto com debug Auxilia o refactoring O código está na fresco na mente, quaisquer erros podem ser corrigidos normalmente de maneira rápida.
Motivações 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.
Motivações Atitudes 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!
O PHPUnit Escrito por Sebastian Bergmann Baseado nos conceitos do JUnit Atualmente na versão 3.2.2 Requer PHP 5
O PHPUnit Quem usa? eZ Systems eZ Components Zend Technolgies Ltd. Zend Framework PHP-GTK IBM SDO Agavi Creole Propel Phing Serendipity Eu!  
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
Prática No PHP $ vi /usr/local/php5/lib/php.ini include_path = &quot;.: /opt/phpunit &quot;
TextUI TestRunner
Nosso primeiro teste Exemplo da classe Calculadora <?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
Nosso primeiro teste Nosso TestCase <?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
Nosso primeiro teste $ phpunit <TestCase> $ phpunit <TestCase> <Arquivo>
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 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; } }
PHPUnit_Framework_Assert markTestIncomplete($mensagem) markTestSkipped($mensagem) fail() void assertTrue($variavel) void assertNull($variavel) void assertEquals($esperado, $atual)
PHPUnit_Framework_Assert void assertContains($valor, $array) void assertRegExp($padrao, $string) void assertType($typo, $variavel) ...
Skeleton
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   ; } }
Organizando seus testes Application/ Package/ Class (Application/Package/Class.php) ... ... ... Tests/ AllTests.php Package/ Package_AllTests.php ClassTest (Application/Tests/Package/ClassTest.php)
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 ; } }
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 } }
Code Coverage Como testar os meus testes? Como saber quantos por cento de meu código esta coberto por testes? Como saber quais linhas do meu código estão cobertas por testes?
Code Coverage Utiliza a extensão xDebug $ phpunit --coverage-html ./code_coverage AllTests.php
Code Coverage
Code Coverage
Integração Contínua Consiste em um ambiente onde cada membro da equipe integra pequenas partes ao software diariamente A integração destas partes é sempre verificada e testada através de builds automatizados
Integração Contínua
Integração Contínua
Integração Contínua
Integração Contínua
Desenvolvimento Orientado a Testes Do inglês Test-driven development (TDD)‏ Tem como objetivo antecipar a identificação de falhas durante o desenvolvimento Três passos Escrever o teste Escrever o código Melhorar o código
Perguntas?
Links www.diegotremper.com http://cruisecontrol.sourceforge.net/ http://www.phpunit.de/ http://www.phpunit.de/wiki/phpUnderControl http://pear.php.net/package/PHP_CodeSniffer http://www.phpdoc.org/
Obrigado!!!

Mais conteúdo relacionado

Mais procurados

TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
Osvaldo Santana Neto
 
Java primeiros-passos
Java primeiros-passosJava primeiros-passos
Java primeiros-passos
Leide Sayuri Ogasawara
 
Zephir
ZephirZephir
Zephir
Luiz Gavinho
 
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
Michael Castillo Granados
 
Rumo à Certificação PHP
Rumo à Certificação PHPRumo à Certificação PHP
Rumo à Certificação PHP
Ari Stopassola Junior
 
Aop Aspect J 1.5.4 Capitulo 02
Aop Aspect J 1.5.4 Capitulo 02Aop Aspect J 1.5.4 Capitulo 02
Aop Aspect J 1.5.4 Capitulo 02
Diego Pacheco
 
Minicurso de TDD
Minicurso de TDDMinicurso de TDD
Minicurso de TDD
William G. Comnisky
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?
Bernardo Fontes
 
Testes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e DjangoTestes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e Django
fabiocerqueira
 
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de ComandoPHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
Rafael Jaques
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Luís Cobucci
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
Osvaldo Santana Neto
 
Desenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de ComandoDesenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de Comando
garux
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
Carlos Santos
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de Software
Maurício Aniche
 
Pep8 pylint
Pep8 pylintPep8 pylint
Pep8 pylint
Leandro Severino
 
Oficina de Web Design Lecom - PHP e JavaScript
Oficina de Web Design Lecom - PHP e JavaScriptOficina de Web Design Lecom - PHP e JavaScript
Oficina de Web Design Lecom - PHP e JavaScript
Raphael Donaire Albino
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizados
Thiago Ghisi
 
The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...
The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...
The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...
Rogério Moraes de Carvalho
 
M5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-WebM5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-Web
diogoa21
 

Mais procurados (20)

TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Java primeiros-passos
Java primeiros-passosJava primeiros-passos
Java primeiros-passos
 
Zephir
ZephirZephir
Zephir
 
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
 
Rumo à Certificação PHP
Rumo à Certificação PHPRumo à Certificação PHP
Rumo à Certificação PHP
 
Aop Aspect J 1.5.4 Capitulo 02
Aop Aspect J 1.5.4 Capitulo 02Aop Aspect J 1.5.4 Capitulo 02
Aop Aspect J 1.5.4 Capitulo 02
 
Minicurso de TDD
Minicurso de TDDMinicurso de TDD
Minicurso de TDD
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?
 
Testes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e DjangoTestes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e Django
 
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de ComandoPHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Desenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de ComandoDesenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de Comando
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de Software
 
Pep8 pylint
Pep8 pylintPep8 pylint
Pep8 pylint
 
Oficina de Web Design Lecom - PHP e JavaScript
Oficina de Web Design Lecom - PHP e JavaScriptOficina de Web Design Lecom - PHP e JavaScript
Oficina de Web Design Lecom - PHP e JavaScript
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizados
 
The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...
The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...
The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...
 
M5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-WebM5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-Web
 

Semelhante a Qualidade no desenvolvimento de software com PHPUnit

Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
Michael Castillo Granados
 
Testes de unidade na prática
Testes de unidade na práticaTestes de unidade na prática
Testes de unidade na prática
Tiago Furtado
 
PHPSP TestFest 2009
PHPSP TestFest 2009PHPSP TestFest 2009
PHPSP TestFest 2009
Rafael Dohms
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
Elton Minetto
 
Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
Everaldo Wanderlei Uavniczak
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizados
Cristian R. Silva
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Claudinei Brito Junior
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
Marcelo Rodrigo
 
Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009
silva.edgar
 
Doctrine for dummies
Doctrine for dummiesDoctrine for dummies
Doctrine for dummies
Ari Stopassola Junior
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
Armando Daniel
 
JUnit
JUnitJUnit
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
Pablo Dall'Oglio
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
Denis L Presciliano
 
Java 12
Java 12Java 12
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
Jaime Neto
 
Testes com JUnit
Testes com JUnitTestes com JUnit
Testes com JUnit
elliando dias
 
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANTAutomação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
elliando dias
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
grupoweblovers
 
Frameworks para C 3º DeSif
Frameworks para C 3º DeSifFrameworks para C 3º DeSif
Frameworks para C 3º DeSif
Gleison Rodrigues
 

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

Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
Testes de unidade na prática
Testes de unidade na práticaTestes de unidade na prática
Testes de unidade na prática
 
PHPSP TestFest 2009
PHPSP TestFest 2009PHPSP TestFest 2009
PHPSP TestFest 2009
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizados
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009
 
Doctrine for dummies
Doctrine for dummiesDoctrine for dummies
Doctrine for dummies
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
JUnit
JUnitJUnit
JUnit
 
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
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Java 12
Java 12Java 12
Java 12
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
 
Testes com JUnit
Testes com JUnitTestes com JUnit
Testes com JUnit
 
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANTAutomação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Frameworks para C 3º DeSif
Frameworks para C 3º DeSifFrameworks para C 3º DeSif
Frameworks para C 3º DeSif
 

Qualidade no desenvolvimento de software com PHPUnit

  • 1. Qualidade no desenvolvimento de Software com PHPUnit
  • 2. Roteiro Introdução Motivações O PHPUnit Prática Integração Contínua Desenvolvimento Orientado a Testes (TDD)‏ Perguntas
  • 3. Introdução Testes Unitários São utilizados para testar as menores unidades de software desenvolvidas Tem como objetivo encontrar falhas de funcionamento dentro de uma pequena parte do sistema.
  • 4. Motivações Porque Testar? Evita surpresas desagradáveis Reduz o tempo gasto com debug Auxilia o refactoring O código está na fresco na mente, quaisquer erros podem ser corrigidos normalmente de maneira rápida.
  • 5. Motivações 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.
  • 6. Motivações Atitudes 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!
  • 7. O PHPUnit Escrito por Sebastian Bergmann Baseado nos conceitos do JUnit Atualmente na versão 3.2.2 Requer PHP 5
  • 8. O PHPUnit Quem usa? eZ Systems eZ Components Zend Technolgies Ltd. Zend Framework PHP-GTK IBM SDO Agavi Creole Propel Phing Serendipity Eu! 
  • 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. Prática No PHP $ vi /usr/local/php5/lib/php.ini include_path = &quot;.: /opt/phpunit &quot;
  • 12. Nosso primeiro teste Exemplo da classe Calculadora <?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. Nosso primeiro teste Nosso TestCase <?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. Nosso primeiro teste $ phpunit <TestCase> $ phpunit <TestCase> <Arquivo>
  • 15. 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
  • 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. PHPUnit_Framework_Assert markTestIncomplete($mensagem) markTestSkipped($mensagem) fail() void assertTrue($variavel) void assertNull($variavel) void assertEquals($esperado, $atual)
  • 18. PHPUnit_Framework_Assert void assertContains($valor, $array) void assertRegExp($padrao, $string) void assertType($typo, $variavel) ...
  • 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. Organizando seus testes Application/ Package/ Class (Application/Package/Class.php) ... ... ... Tests/ AllTests.php Package/ Package_AllTests.php ClassTest (Application/Tests/Package/ClassTest.php)
  • 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. 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. Code Coverage Como testar os meus testes? Como saber quantos por cento de meu código esta coberto por testes? Como saber quais linhas do meu código estão cobertas por testes?
  • 25. Code Coverage Utiliza a extensão xDebug $ phpunit --coverage-html ./code_coverage AllTests.php
  • 28. Integração Contínua Consiste em um ambiente onde cada membro da equipe integra pequenas partes ao software diariamente A integração destas partes é sempre verificada e testada através de builds automatizados
  • 33. Desenvolvimento Orientado a Testes Do inglês Test-driven development (TDD)‏ Tem como objetivo antecipar a identificação de falhas durante o desenvolvimento Três passos Escrever o teste Escrever o código Melhorar o código
  • 35. Links www.diegotremper.com http://cruisecontrol.sourceforge.net/ http://www.phpunit.de/ http://www.phpunit.de/wiki/phpUnderControl http://pear.php.net/package/PHP_CodeSniffer http://www.phpdoc.org/