TDD+PHP Pedro H. B. Santos William G. Comnisky
Qualidade de Software “ Totalidade de características de uma entidade que lhe confere a capacidade de satisfazer a necessidades explícitas e implícitas ”. Conformidade a: Requisitos funcionais e de desempenho; Padrões e convenções de desenvolvimento pré-estabelecidos; Atributos implícitos que todo software desenvolvido profissionalmente deve possuir.
Como garantir a qualidade? Aplicação de métodos e ferramentas técnicas; Realização de revisões técnicas e inspeções; Atividades de testes; Aplicação de padrões;
Por que surgem falhas? Alterações; Tempo; Complexidade;
O que são testes? “ O teste consiste em executar o programa com a intenção de encontrar erros”. (Myers, 1979) Principais objetivos dos testes: Foco na prevenção de erros; Descobrir sintomas causados por erros; Fornecer diagnósticos claros para que os erros sejam facilmente corrigidos;
Teste vs. Depuração Objetivos do teste:  mostrar que o software tem erros.   Objetivos da depuração:  encontrar a causa do erro detectado no teste, e projetar e implementar as modificações no programa para correção do erro.
Tipos de testes Estrutural; Funcional; De sistema; De regressão; De aceitação; Unitário;
Teste Unitário “ Procedimento automático usado para validar se uma pequena parte do código  funciona corretamente ”.
Teste Unitário: quando testar? Antes e durante o desenvolvimento:  quando é necessário adicionar novas funcionalidades ao sistema; Após o desenvolvimento:  quando o erro é detectado no sistema em produção;
Teste Unitário: como testar? São independentes: Do código já testado; Da ordem de execução; Do ambiente; Devem ser: Fáceis de escrever; Fáceis de executar; Fáceis de compreender; Desenvolvidos paralelamente ao código;
Teste Unitário: como funciona? <?php  class Calculator { public function add ($a, $b) { return $a + $b; } } ?>
Teste Unitário: como funciona? <?php  $fixture = new Calculator(); print  $fixture->add (0, 1 ) ;  $fixture = new Calculator(); print  $fixture->add (1, 0  );  ?> 1 1
Teste Unitário: como funciona? <?php  $fixture = new Calculator(); print  $fixture->add (0, 1 ) == 1 ? 'Passou' : 'Falhou';  $fixture = new Calculator(); print  $fixture->add (1, 0  ) == 1 ? 'Passou' : 'Falhou';   ?> Passou Passou
Teste Unitário: como funciona? <?php  function assertTrue($expressao) {      if(!$expressao)        throw new Exception  ('Falhou');   } $fixture = new Calculator(); assertTrue ($fixture->add (0, 1 ) == 1);    $fixture = new Calculator(); assertTrue ($fixture->add (1, 0  ) == 1); ?>
Teste Unitário: desculpas mais comuns Requer tempo, e meus projetos são “pra ontem”; É perda de tempo, pois se mudar minha classe, tenho que alterar os testes; Está “funcionando” em produção faz tempo; Não preciso de teste, meu código é sólido como uma pedra; Depois eu faço; Os testes ficam para a próxima etapa;
Teste Unitário: benefícios Reduz a quantidade de erros do código; Diminui a manutenção do sistema; Testes automatizados podem ser executados quando necessário; Fácil de alterar e refatorar o código;  As classes são modularizadas; São uma forma de documentação do código; Testes Unitários são divertidos!
TDD – Test-Driven Development “ Desenvolvimento guiado por testes ”. “ TDD se popularizou através da  Extreme Programming (XP) por Kent Beck ”.
TDD: princípios Primeiro o teste, depois a implementação; O teste define o que a classe deve fazer; Nunca alterar um teste para facilitar que outro passe; Simplicidade  KISS – Keep It Simple Stupid DRY – Don’t Repeat Yourself YAGNI – You Ain’t Gonna Need It
TDD: ciclo
PHPUnit “ O PHPUnit é um framework que auxilia a criação e a execução automática de testes unitários sobre classes PHP ”. Fácil integração com IDEs (Netbeans, Eclipse PDT); Integração com frameworks de desenvolvimento (Symfony, Zend Framework);
PHPUnit: exemplo <?php require_once 'PHPUnit/Framework.php';  class ArrayTest extends PHPUnit_Framework_TestCase {     public function testNewArrayIsEmpty()     {         // Cria um array.         $array = array();           // Verifica se o tamanho do array é igual a 0.         $this->assertEquals(0, sizeof($array));     }      public function testArrayContainsAnElement()     {          // Cria um array.         $array = array();           // Adiciona um elemento ao array         $array[] = 'Element';           // Verifica se o tamanho do array é igual a 1.         $this->assertEquals(1, sizeof($array));     }   }
PHPUnit: exemplo <?php require_once 'PHPUnit/Framework.php';  class ArrayTest extends PHPUnit_Framework_TestCase {     public function testNewArrayIsEmpty()     {         // Cria um array.         $array = array();           // Verifica se o tamanho do array é igual a 0.         $this->assertEquals(0, sizeof($array));     }      public function testArrayContainsAnElement()     {          // Cria um array.         $array = array();           // Adiciona um elemento ao array         $array[] = 'Element';           // Verifica se o tamanho do array é igual a 1.         $this->assertEquals(1, sizeof($array));     }   }
Coding Dojo “ É uma técnica de treinamento que remete as artes marciais. O dojô é o local onde os movimentos da luta são repetidos a exaustão, sempre fazendo pequenas melhorias a cada repetição. No nosso caso, o treino deve reunir pessoas para resolver um problema simples de programação em conjunto, usando apenas um computador ligado a um projetor ”. (dojofloripa.wordpress.com)
Aprendizado contínuo; Ambiente: Não-competitivo; Colaborativo; Inclusivo; Falha e Redundância; Baby steps; dojorio .wordpress.com Coding Dojo: princípios
Computador + projetor; Par + platéia;  TDD; Todos devem entender; Sempre começar do zero; Coding Dojo: regras gerais
Ao final da sessão: O que aprendemos? O que gostamos? O que podemos melhorar? Comentários? Coding Dojo: retrospectiva
Kata: Apresentação da solução do problema; Todos devem conseguir reproduzir; Interrupções permitidas para tirar dúvidas; Coding Dojo: formatos
Randori: Programação em par; Turnos “time-boxed”; Após o turno: O co-piloto vira piloto; O piloto volta pra platéia; Um novo co-piloto é convidado da platéia; Comentários e críticas somente no  verde ; Silêncio no  vermelho ; Coding Dojo: formatos
Coding Dojo: prática Vamos aos códigos..
Links e referências http://www.phpunit.de http://www.simpletest.org http://www.agiledata.org http://www.improveit.com.br http://c2.com/cgi/wiki? TestDrivenDevelopment   http://www.infoq.com/br http://blog.agilephp.com http://www.slideshare.net/sebastian_bergmann http://dojofloripa.wordpress.com http://dojorio.wordpress.com http://agilesoftwaredevelopment.com   http://misko.hevery.com http://martinfowler.com http://www.testdriven.com http://www.lastcraft.com/blog
Contato Pedro H. B. Santos [email_address] http://blog.pedrohsantos.eti.br William G. Comnisky [email_address] http://blog.will.eti.br
TATFT! Test All The F*in’ Time

Minicurso de TDD

  • 1.
    TDD+PHP Pedro H.B. Santos William G. Comnisky
  • 2.
    Qualidade de Software“ Totalidade de características de uma entidade que lhe confere a capacidade de satisfazer a necessidades explícitas e implícitas ”. Conformidade a: Requisitos funcionais e de desempenho; Padrões e convenções de desenvolvimento pré-estabelecidos; Atributos implícitos que todo software desenvolvido profissionalmente deve possuir.
  • 3.
    Como garantir aqualidade? Aplicação de métodos e ferramentas técnicas; Realização de revisões técnicas e inspeções; Atividades de testes; Aplicação de padrões;
  • 4.
    Por que surgemfalhas? Alterações; Tempo; Complexidade;
  • 5.
    O que sãotestes? “ O teste consiste em executar o programa com a intenção de encontrar erros”. (Myers, 1979) Principais objetivos dos testes: Foco na prevenção de erros; Descobrir sintomas causados por erros; Fornecer diagnósticos claros para que os erros sejam facilmente corrigidos;
  • 6.
    Teste vs. DepuraçãoObjetivos do teste: mostrar que o software tem erros. Objetivos da depuração: encontrar a causa do erro detectado no teste, e projetar e implementar as modificações no programa para correção do erro.
  • 7.
    Tipos de testesEstrutural; Funcional; De sistema; De regressão; De aceitação; Unitário;
  • 8.
    Teste Unitário “Procedimento automático usado para validar se uma pequena parte do código funciona corretamente ”.
  • 9.
    Teste Unitário: quandotestar? Antes e durante o desenvolvimento: quando é necessário adicionar novas funcionalidades ao sistema; Após o desenvolvimento: quando o erro é detectado no sistema em produção;
  • 10.
    Teste Unitário: comotestar? São independentes: Do código já testado; Da ordem de execução; Do ambiente; Devem ser: Fáceis de escrever; Fáceis de executar; Fáceis de compreender; Desenvolvidos paralelamente ao código;
  • 11.
    Teste Unitário: comofunciona? <?php class Calculator { public function add ($a, $b) { return $a + $b; } } ?>
  • 12.
    Teste Unitário: comofunciona? <?php $fixture = new Calculator(); print  $fixture->add (0, 1 ) ; $fixture = new Calculator(); print  $fixture->add (1, 0  ); ?> 1 1
  • 13.
    Teste Unitário: comofunciona? <?php $fixture = new Calculator(); print  $fixture->add (0, 1 ) == 1 ? 'Passou' : 'Falhou'; $fixture = new Calculator(); print  $fixture->add (1, 0  ) == 1 ? 'Passou' : 'Falhou';  ?> Passou Passou
  • 14.
    Teste Unitário: comofunciona? <?php  function assertTrue($expressao) {     if(!$expressao)       throw new Exception  ('Falhou');  } $fixture = new Calculator(); assertTrue ($fixture->add (0, 1 ) == 1);   $fixture = new Calculator(); assertTrue ($fixture->add (1, 0  ) == 1); ?>
  • 15.
    Teste Unitário: desculpasmais comuns Requer tempo, e meus projetos são “pra ontem”; É perda de tempo, pois se mudar minha classe, tenho que alterar os testes; Está “funcionando” em produção faz tempo; Não preciso de teste, meu código é sólido como uma pedra; Depois eu faço; Os testes ficam para a próxima etapa;
  • 16.
    Teste Unitário: benefíciosReduz a quantidade de erros do código; Diminui a manutenção do sistema; Testes automatizados podem ser executados quando necessário; Fácil de alterar e refatorar o código; As classes são modularizadas; São uma forma de documentação do código; Testes Unitários são divertidos!
  • 17.
    TDD – Test-DrivenDevelopment “ Desenvolvimento guiado por testes ”. “ TDD se popularizou através da Extreme Programming (XP) por Kent Beck ”.
  • 18.
    TDD: princípios Primeiroo teste, depois a implementação; O teste define o que a classe deve fazer; Nunca alterar um teste para facilitar que outro passe; Simplicidade  KISS – Keep It Simple Stupid DRY – Don’t Repeat Yourself YAGNI – You Ain’t Gonna Need It
  • 19.
  • 20.
    PHPUnit “ OPHPUnit é um framework que auxilia a criação e a execução automática de testes unitários sobre classes PHP ”. Fácil integração com IDEs (Netbeans, Eclipse PDT); Integração com frameworks de desenvolvimento (Symfony, Zend Framework);
  • 21.
    PHPUnit: exemplo <?phprequire_once 'PHPUnit/Framework.php';  class ArrayTest extends PHPUnit_Framework_TestCase {     public function testNewArrayIsEmpty()     {         // Cria um array.         $array = array();           // Verifica se o tamanho do array é igual a 0.         $this->assertEquals(0, sizeof($array));     }      public function testArrayContainsAnElement()     {          // Cria um array.         $array = array();           // Adiciona um elemento ao array         $array[] = 'Element';           // Verifica se o tamanho do array é igual a 1.         $this->assertEquals(1, sizeof($array));     } }
  • 22.
    PHPUnit: exemplo <?phprequire_once 'PHPUnit/Framework.php';  class ArrayTest extends PHPUnit_Framework_TestCase {     public function testNewArrayIsEmpty()     {         // Cria um array.         $array = array();           // Verifica se o tamanho do array é igual a 0.         $this->assertEquals(0, sizeof($array));     }      public function testArrayContainsAnElement()     {          // Cria um array.         $array = array();           // Adiciona um elemento ao array         $array[] = 'Element';           // Verifica se o tamanho do array é igual a 1.         $this->assertEquals(1, sizeof($array));     } }
  • 23.
    Coding Dojo “É uma técnica de treinamento que remete as artes marciais. O dojô é o local onde os movimentos da luta são repetidos a exaustão, sempre fazendo pequenas melhorias a cada repetição. No nosso caso, o treino deve reunir pessoas para resolver um problema simples de programação em conjunto, usando apenas um computador ligado a um projetor ”. (dojofloripa.wordpress.com)
  • 24.
    Aprendizado contínuo; Ambiente:Não-competitivo; Colaborativo; Inclusivo; Falha e Redundância; Baby steps; dojorio .wordpress.com Coding Dojo: princípios
  • 25.
    Computador + projetor;Par + platéia; TDD; Todos devem entender; Sempre começar do zero; Coding Dojo: regras gerais
  • 26.
    Ao final dasessão: O que aprendemos? O que gostamos? O que podemos melhorar? Comentários? Coding Dojo: retrospectiva
  • 27.
    Kata: Apresentação dasolução do problema; Todos devem conseguir reproduzir; Interrupções permitidas para tirar dúvidas; Coding Dojo: formatos
  • 28.
    Randori: Programação empar; Turnos “time-boxed”; Após o turno: O co-piloto vira piloto; O piloto volta pra platéia; Um novo co-piloto é convidado da platéia; Comentários e críticas somente no verde ; Silêncio no vermelho ; Coding Dojo: formatos
  • 29.
    Coding Dojo: práticaVamos aos códigos..
  • 30.
    Links e referênciashttp://www.phpunit.de http://www.simpletest.org http://www.agiledata.org http://www.improveit.com.br http://c2.com/cgi/wiki? TestDrivenDevelopment http://www.infoq.com/br http://blog.agilephp.com http://www.slideshare.net/sebastian_bergmann http://dojofloripa.wordpress.com http://dojorio.wordpress.com http://agilesoftwaredevelopment.com http://misko.hevery.com http://martinfowler.com http://www.testdriven.com http://www.lastcraft.com/blog
  • 31.
    Contato Pedro H.B. Santos [email_address] http://blog.pedrohsantos.eti.br William G. Comnisky [email_address] http://blog.will.eti.br
  • 32.
    TATFT! Test AllThe F*in’ Time