Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Testando sua App PHP através de TDD

Testando sua App PHP através de TDD

Palestra apresentada no Darkmira Tour PHP 2016

Daniela Pitta

March 20, 2016
Tweet

More Decks by Daniela Pitta

Other Decks in Programming

Transcript

  1. Hello! Sou Daniela Pitta Estou aqui para falar sobre TDD

    aplicado ao código PHP. Você pode me achar por @dlpitta
  2. 60 bilhões de dólares Custo de bugs a economia dos

    EUA por ano 78% Desenvolvedores enxergam TDD como melhoria de produtividade 300% Projetos ágeis são mais sucedidos do que os não-ágeis Fonte: TypeMock
 Dados de 2011
  3. POR QUE NÃO TESTAMOS? É impossível testar tudo. É suicídio

    não testar nada. Você deve testar coisas que podem quebrar. !
  4. TESTES AUTOMATIZADOS E TDD Testes automatizados permitem: • Testar o

    sistema de maneira contínua a um preço justo. • Descobrir o problema mais cedo. • Aumentar a produtividade (caso a medida seja linhas de código sem defeito).
  5. TDD A ideia é escrever testes automatizados ao longo do

    desenvolvimento do sistema, mas TDD sugere que o teste seja feito antes da implementação.
  6. TESTES DE UNIDADES Testes de unidade permitem: • Testar uma

    unidade do sistema. • Garantir que uma parte do sistema funcione. Desenvolvedores quando pensam em teste de software, geralmente imaginam um teste que cobre o sistema inteiro.
  7. GATOTEST.PHP use PHPUnit_Framework_TestCase as PHPUnit; require_once '../../../src/Application/gato.php'; class GatoTest extends

    PHPUnit { public function testCalculaDosagem() { $gato = new Gato("Joy", 2, 40, "SRD"); $this->assertEquals(40, $gato->calculaDosagem()); }
  8. GATO.PHP class Gato { private $nome; private $peso; private $altura;

    private $raca; public function __construct($nome, $peso, $altura, $raca) { $this->nome = $nome; $this->peso = $peso; $this->altura = $altura; $this->raca = $raca; } public function calculaDosagem() { $dosagem = ($this->peso - 1) * $this->altura; return $dosagem; } }
  9. GATOTEST.PHP public function testVerificaPossibilidadeDoenca() { $gato = new Gato("Joy", 2,

    40, "SRD"); $gato->calculaDosagem(); $gato->verificaPossibilidadeDoenca(); }
  10. GATO.PHP public function verificaPossilidadeDoenca() { if ($dosagem < 5) {

    return true; } else ($dosagem > 5) { return false; } }
  11. REFLETINDO SOBRE O QUE FOI FEITO O ciclo do processo

    realizado foi:
 • Escrevemos um teste de unidade para uma nova funcionalidade.
 • Vimos o teste falhar.
 • Implementamos um código mais simples para resolver o problema.
  12. EVOLUINDO NOS TESTES Cenário: Em um sistema veterinário precisamos saber

    se qual doença um gato pode desenvolver apenas pela sua raça.
  13. BABY STEPS A ideia de sempre tomar o passo mais

    simples que resolva o problema naquela momento (e faça o teste passar).
  14. BABY STEPS OU PASSOS DE BEBÊ O ciclo do processo

    realizado foi:
 • No início foi implementada alterações mais simples.
 • Mas foi feito tantas vezes que ficou longe da implementação ideal.
 • O desenvolvedor deve buscar uma solução mais simples e não uma modificação mais simples.
  15. BOAS PRÁTICAS Todas as boas práticas que o desenvolvedor utiliza

    no código de produção podem ser utilizadas no código de teste também.
  16. REPETIÇÃO DE CÓDIGO ENTRE TESTES Análise: • Observe na quantidade

    de código repetido no testes.
 • Pense se houver alguma modificação no código de produção você terá trabalho para aplicar isso nos testes.
  17. COM APENAS 3 TESTES O CÓDIGO SE REPETE. public function

    testDeveRetornar0SeGatoSaudavel { $gato = new Gato("Luke", 3, 60, "SRD"); //Código de Verificação } public function testDeveRetornar1SeGatoDoente { $gato = new Gato("Fred", 4, 55, "SRD"); //Código de Verificação } public function testDeveRetornar2SeGatoEstavel { $gato = new Gato("Atom", 3, 55, "SRD"); //Código de Verificação }
  18. A SOLUÇÃO PORTANTO É ESCREVER ESSE CÓDIGO EM APENAS UM

    LUGAR. private $gato; protected function setUp() { $this->gato = new Gato(); parent::setUp(); } public function testDeveRetornar0SeGatoSaudavel { //Código de Verificação } public function testDeveRetornar1SeGatoDoente { //Código de Verificação } public function testDeveRetornar2SeGatoEstavel { //Código de Verificação }
  19. NOMENCLATURA DE ARQUIVOS Toda classe deve ter seu par para

    teste: • nomeClasse.php • <nomeClasse>Test.php
  20. NOMENCLATURA DE ARQUIVOS Escrever o caso de teste usando o

    pós-fixo test: • A classe tem o método algumaCoisa()
 • Deve-se criar o método testAlgumaCoisa()
  21. UNDERSCORE NO NOME DO TESTE Pode-se usar underscore no nome

    dos testes: • test_deve_retornar_zer o_se_gato_saudavel()
  22. TESTES REPETIDOS Faz sentido apagar um teste? • Se a

    funcionalidade foi removida, o desenvolvedor, deve atualizar a bateria de testes e apagar todos os testes relacionados a ela.
  23. ESCREVENDO BOAS ASSERÇÕES Como garantir que testes falhem na hora

    certa? • Utilização do método assertEquals()
 • Para que ele exiba a mensagem de erro correta, o desenvolvedor deve passar os parâmetros na ordem.
  24. SEPARANDO AS CLASSES DE TESTE Onde guardar as classes de

    teste? • A sugestão é separar as classes de produção e as classes de teste respectivamente separadas nas pastas src e tests.
  25. QUANDO NÃO USAR TDD Vimos diversas vantagens em escrita de

    testes de unidade e TDD, mas será que devemos fazer uso da prática 100% do tempo?
  26. EM MOMENTOS NOS QUAIS O DESENVOLVEDOR JÁ SABE COMO RESOLVER

    O PROBLEMA, TANTO NA IMPLEMENTAÇÃO E DESIGN. !
  27. “ Caso o desenvolvedor opte por não usar TDD, espera-se

    que ele, após a implementação, escreva testes para aquela funcionalidade, sejam eles de unidade ou integração.
  28. ERROS COMUNS EM TDD Ao praticar TDD, alguns desenvolvedores cometem

    alguns deslizes que podem prejudicar o feedback da prática.