Minicurso de TDD

2,616 views
2,502 views

Published on

Slides do minicurso de TDD ministrado por Pedro H. B. Santos e William G. Comnisky durante a PHPSC Conf 2009

Published in: Technology, Business

Minicurso de TDD

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

×