e no sétimo dia ele escreveu testes - seminario php

73
E NO SÉTIMO DIA ELE CRIOU TESTES TDD e o papel de testes no desenvolvimento de aplicações Rafael Dohms [email protected] Friday, June 25, 2010

Upload: rafael-dohms

Post on 10-May-2015

2.320 views

Category:

Technology


1 download

DESCRIPTION

Testes e o TDD estão se tornando uma parte muito importante do nosso dia a dia como desenvolvedores. Veja como os testes se aplicam ao seu trabalho e como seus sistemas e equipe podem se beneficiar com isso. Aprenda também o que é o TDD e quais melhorias ele traz ao processo de desenvolvimento. O código fonte utilizado esta no github: http://github.com/rdohms/ManoWars Palestra ministrada no 5º Seminario PHP.

TRANSCRIPT

Page 1: E no Sétimo dia ele escreveu testes - Seminario PHP

E NO SÉTIMO DIA ELE CRIOU TESTES

TDD e o papel de testes no desenvolvimento de aplicações

Rafael [email protected]

Friday, June 25, 2010

Page 2: E no Sétimo dia ele escreveu testes - Seminario PHP

⚠Aviso

As referências e opiniões religiosas apresentadas nesta palestra não refletem a opinião do autor, e

são apresentadas puramente com intuito de ilustrar pontos-chave de forma descontraída e

humorística.

Friday, June 25, 2010

Page 3: E no Sétimo dia ele escreveu testes - Seminario PHP

A CRIAÇÃO DO MUNDOdo ponto de vista do desenvolvimento de software

Friday, June 25, 2010

Page 4: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 5: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 6: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 7: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 8: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 9: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 10: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 11: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 12: E no Sétimo dia ele escreveu testes - Seminario PHP

@OCriador

Friday, June 25, 2010

Page 13: E no Sétimo dia ele escreveu testes - Seminario PHP

@OCriador* Adão has joined #earth

* Eva has joined #earthAdão

Eva

Friday, June 25, 2010

Page 14: E no Sétimo dia ele escreveu testes - Seminario PHP

@OCriador* Adão has joined #earth

* Eva has joined #earth

Adão: Agora vou apavorar!

Eva: Primeiro post!

Eva: ah droga!

Eva: Olha! uma maçã!

Adão

Eva

Friday, June 25, 2010

Page 15: E no Sétimo dia ele escreveu testes - Seminario PHP

@OCriador* Adão has joined #earth

* Eva has joined #earth

Adão: Agora vou apavorar!

Eva: Primeiro post!

Eva: ah droga!

Eva: Olha! uma maçã!

> Eva morde a maçã

OCriador: eu avisei!

Adão

Eva

Friday, June 25, 2010

Page 16: E no Sétimo dia ele escreveu testes - Seminario PHP

@OCriador* Adão has joined #earth

* Eva has joined #earth

Adão: Agora vou apavorar!

Eva: Primeiro post!

Eva: ah droga!

Eva: Olha! uma maçã!

> Eva morde a maçã

OCriador: eu avisei!

OCriador kicks Eva

OCriador kicks Adão

OCriador adds ban on *@earth on #earth

Adão

Eva

Friday, June 25, 2010

Page 17: E no Sétimo dia ele escreveu testes - Seminario PHP

QUEM É RAFAEL DOHMS?

Rafael Dohms é graduado Engenheiro da Computação pelo UniCEUB. Tem 9 anos de experiência no mercado PHP e atualmente ocupa o cargo de Desenvolvedor Sênior e Especialista em PHP na empresa sul-africana SWAT/MIH. É certificado ZCE PHP5.

Grande agitador da comunidade PHP é co-fundador do PHPDF e atual coordenador do PHPSP. Contribui ativamente na área de testes do PHP e é Host do PHPSPCast, o primeiro podcast sobre PHP do Brazil.

Friday, June 25, 2010

Page 18: E no Sétimo dia ele escreveu testes - Seminario PHP

TESTESporque você precisa deles, mas ainda não sabe

Sebastian Bergmann

Friday, June 25, 2010

Page 19: E no Sétimo dia ele escreveu testes - Seminario PHP

PRÓS• “Simulação”

• Facilidade de testar funções sem precisar preencher formulários, criar usuários

• Tudo fica centralizado no teste e é feito apenas uma vez

• “Certeza”

• Testes podem simular todas situações possíveis e garantir que seu código funciona como esperado

• “Garantia”

• Com um sistema coberto de testes você tem certeza que sua alteração não vai quebrar outra área do sistema

Friday, June 25, 2010

Page 20: E no Sétimo dia ele escreveu testes - Seminario PHP

CONS

• Tempo

• Embora você gaste mais tempo criando testes, você ganha tempo durante as simulações e na manutenção

• Gerência

• Convencer os responsáveis pelo projeto de que testes irão trazer lucro é geralmente complicado

Friday, June 25, 2010

Page 21: E no Sétimo dia ele escreveu testes - Seminario PHP

CADA SITUAÇÃO, UMA FERRAMENTA

Frontend Backend PHP

Selenium+

PHPUnit PHPUnit PHPT

Friday, June 25, 2010

Page 22: E no Sétimo dia ele escreveu testes - Seminario PHP

ESCREVENDO TESTESquando você começar, nunca mais vai parar

skoop @flickr

Friday, June 25, 2010

Page 23: E no Sétimo dia ele escreveu testes - Seminario PHP

MANOWARS!

• Sistema de Batalhas

• Garantindo o elemento aleatório

• Ataque: Fixo + Random

• Defesa: Fixo + Random

• Damage: Atk/Def * Random

Friday, June 25, 2010

Page 24: E no Sétimo dia ele escreveu testes - Seminario PHP

UMA BATALHA!Mano Gil pronto para combater. > Atk: 10 / Def: 8Mano Brown pronto para combater. > Atk: 11 / Def: 9Round 1Fight!Gil took 3 damage from BrownGil did 13 damage on BrownGil did 10 damage on BrownGil did 1 damage on BrownGil took 12 damage from BrownGil did 13 damage on BrownGil did 2 damage on BrownGil did 0 damage on BrownGil took 7 damage from BrownGil did 13 damage on BrownGil did 10 damage on BrownGil did 0 damage on BrownGil took 13 damage from BrownGil took 1 damage from BrownGil took 10 damage from BrownGil took 10 damage from BrownGil did 14 damage on BrownGil took 9 damage from BrownGil took 7 damage from BrownGil did 6 damage on BrownGil did 8 damage on BrownGil did 2 damage on BrownGil did 12 damage on BrownGil won!

Friday, June 25, 2010

Page 25: E no Sétimo dia ele escreveu testes - Seminario PHP

MW_MANOVamos ver de perto o código

Friday, June 25, 2010

Page 26: E no Sétimo dia ele escreveu testes - Seminario PHP

O QUE TESTAR?1.O construtor esta definindo as variáveis?

2.O health (saúde) está em 100 quando damos reset?

3.Quando ele se machuca, o health diminui?

4.Quando vivo, ele diz “tô vivo”?

5.Quando morto, ele morre?

6.Ele se defende com o valor de defesa esperado?

7.Ele ganha bonus de defesa?

8.Qual o resultado de um ataque (sem bônus), quando:

8.1.Atk > Def

8.2.Def > Atk

8.3.Atk = Def

Friday, June 25, 2010

Page 27: E no Sétimo dia ele escreveu testes - Seminario PHP

RAIO-X DE UMA SUITE DE TESTES

AllTests

PHPUnit_Framework_TestSuite

Friday, June 25, 2010

Page 28: E no Sétimo dia ele escreveu testes - Seminario PHP

RAIO-X DE UMA SUITE DE TESTES

AllTests

PHPUnit_Framework_TestSuite

ClassXTest

PHPUnit_Framework_TestCase

ClassXTest

PHPUnit_Framework_TestCase

ClassXTest

PHPUnit_Framework_TestCase

Friday, June 25, 2010

Page 29: E no Sétimo dia ele escreveu testes - Seminario PHP

RAIO-X DE UMA SUITE DE TESTES

AllTests

PHPUnit_Framework_TestSuite

ClassXTest

PHPUnit_Framework_TestCase

ClassXTest

PHPUnit_Framework_TestCase

ClassXTest

PHPUnit_Framework_TestCase

testX

testY

...testX

testY

...testX

testY

...

Friday, June 25, 2010

Page 30: E no Sétimo dia ele escreveu testes - Seminario PHP

RAIO-X DE UMA SUITE DE TESTES

AllTests

PHPUnit_Framework_TestSuite

ClassXTest

PHPUnit_Framework_TestCase

ClassXTest

PHPUnit_Framework_TestCase

ClassXTest

PHPUnit_Framework_TestCase

SetUp

TearDown

SetUp

TearDown

SetUp

TearDown

SetUp

TearDown

testX

testY

...testX

testY

...testX

testY

...

Friday, June 25, 2010

Page 31: E no Sétimo dia ele escreveu testes - Seminario PHP

EXECUÇÃO DA SUITESetUp

TearDown

SetUp

TearDown

SetUp

TearDown

SetUp

TearDown

Para cada teste

Para cada teste

Para cada teste

Friday, June 25, 2010

Page 32: E no Sétimo dia ele escreveu testes - Seminario PHP

ISOLAMENTO

• Mantenha seus testes isolados

• Nunca rode testes no servidor de produção!

• Soluções

• Crie uma base separada

• Use pastas separadas para arquivos

• Sempre destrua tudo que seu teste construiu

Friday, June 25, 2010

Page 33: E no Sétimo dia ele escreveu testes - Seminario PHP

ESQUADRÃO LIMPEZALimpe tudo o que seu teste criar!

class CleanUpTest extends PHPUnit_Framework_TestCase{ private $file = "/tmp/file";

protected function setUp() { parent::setUp(); }

protected function tearDown() { unlink($this->file); parent::tearDown(); }

public function testFile() { file_put_contents($this->file); }

Friday, June 25, 2010

Page 34: E no Sétimo dia ele escreveu testes - Seminario PHP

ESQUADRÃO LIMPEZALimpe tudo o que seu teste criar!

Everything must be clean!

class CleanUpTest extends PHPUnit_Framework_TestCase{ private $file = "/tmp/file";

protected function setUp() { parent::setUp(); }

protected function tearDown() { unlink($this->file); parent::tearDown(); }

public function testFile() { file_put_contents($this->file); }

Friday, June 25, 2010

Page 35: E no Sétimo dia ele escreveu testes - Seminario PHP

ESQUADRÃO LIMPEZALimpe tudo o que seu teste criar!

Everything must be clean!

class CleanUpTest extends PHPUnit_Framework_TestCase{ private $file = "/tmp/file";

protected function setUp() { parent::setUp(); }

protected function tearDown() { unlink($this->file); parent::tearDown(); }

public function testFile() { file_put_contents($this->file); }

Arquivos, Banco de Dados, etc...

Friday, June 25, 2010

Page 36: E no Sétimo dia ele escreveu testes - Seminario PHP

TIPOS

• Teste Unitário

• Pequeno e pontual

• Geralmente testa a entrada/saída de uma função

• Teste Funcional

• Verifica a funcionalidade de interfaces

• End-to-End

• Verifica o processo do início ao fim

• Analisa o fluxo de sua aplicação

Friday, June 25, 2010

Page 37: E no Sétimo dia ele escreveu testes - Seminario PHP

TESTANDO OS BÁSICOS

• Estrutura da Suite

• AllTests.php

• MW_Mano

• Testes do 1 ao 6

Friday, June 25, 2010

Page 38: E no Sétimo dia ele escreveu testes - Seminario PHP

public function attack(MW_Mano $victim){ $atk = $this->getAtk() + trim(file_get_contents('URL')); $def = $victim->defend(); $dmgMultiplier = (trim(file_get_contents('URL')))/100; if ($atk > $def){ $dmg = round($atk * $dmgMultiplier); $victim->hurt( $dmg ); $action = "%s did %d damage on %s"; }else{ $dmg = round($def * $dmgMultiplier); $this->hurt( $dmg ); $action = "%s took %d damage from %s"; } return sprintf($action, $this->getName(), $dmg, $victim->getName());}

Para Facilitar leitura:[URL] => http://www.random.org/integers/?num=1&min=0&max=100&col=1&base=10&format=plain&rnd=new

Friday, June 25, 2010

Page 39: E no Sétimo dia ele escreveu testes - Seminario PHP

CÓDIGO DEINTESTÁVEL

• Singletons

•MyClass::getInstance();

• Dependências

• SO: exec(‘ls -la’);

• Recursos externos: APIs, File System

• Métodos Privados

•private method fazTudo(){...}

Friday, June 25, 2010

Page 40: E no Sétimo dia ele escreveu testes - Seminario PHP

public function attack(MW_Mano $victim){ $atk = $this->getAtk() + $this->getRandom(); $def = $victim->defend(); $dmgMultiplier = $this->getRandom(1,100)/100; if ($atk > $def){ $dmg = round($atk * $dmgMultiplier); $victim->hurt( $dmg ); $action = "%s did %d damage on %s"; }else{ $dmg = round($def * $dmgMultiplier); $this->hurt( $dmg ); $action = "%s took %d damage from %s"; } return sprintf($action, $this->getName(), $dmg, $victim->getName());}

public function getRandom($min = 1, $max = 10){ return trim(file_get_contents('http://www.random.org/integers/?num=1&min='.$min.'&max='.$max.'&col=1&base=10&format=plain&rnd=new'));}

Friday, June 25, 2010

Page 41: E no Sétimo dia ele escreveu testes - Seminario PHP

NINJA TESTING

• Porque, às vezes, os testes precisam de dublês

• Dummy

• Fake

• Stub

• Spy

• Mock

Friday, June 25, 2010

Page 42: E no Sétimo dia ele escreveu testes - Seminario PHP

RANDOM SEM O RANDOMpublic function testDefendWithoutLuck(){ //Obter Mock $manoMock = $this->getMock('MW_Mano',array('getRandom'), array('John')); //Definir que o objeto retorne zero. $manoMock->expects($this->any()) ->method('getRandom') ->will($this->returnValue(0)); //Definir defesa $manoMock->setDef(5); //Verificar que defesa nao se altera $this->assertEquals(5, $manoMock->defend());}

Friday, June 25, 2010

Page 43: E no Sétimo dia ele escreveu testes - Seminario PHP

DATA PROVIDERS

• 1 teste, muitos dados

• Análise completa de diferentes quadros

Friday, June 25, 2010

Page 44: E no Sétimo dia ele escreveu testes - Seminario PHP

CODE COVERAGE• phpunit.xml

<phpunit colors="true" verbose="true">

<logging> <log type="coverage-html" target="_reports" charset="UTF-8" yui="true" highlight="true" /> </logging>

<filter> <blacklist> <directory suffix=".php">../libs/Zend</directory> </blacklist> <whitelist> <directory suffix=".php">../libs/MW</directory> </whitelist> </filter> </phpunit>

Friday, June 25, 2010

Page 45: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 46: E no Sétimo dia ele escreveu testes - Seminario PHP

TDDNão é sobre testes, é sobre especificações

Test Driven Development

Friday, June 25, 2010

Page 47: E no Sétimo dia ele escreveu testes - Seminario PHP

“TDD é uma forma de projetar software, não apenas uma forma de testar software.”

Sebastian Bergmann - criador do PHPUnit

“It's about figuring out what you are trying to do before you run off half-cocked to try

to do it.”Dave Astels - autor de livros sobre TDD

Friday, June 25, 2010

Page 48: E no Sétimo dia ele escreveu testes - Seminario PHP

TDD

• Escrever testes que definem o comportamento de sua aplicação antes de escrever código.

• Testar comportamento, não apenas funcionamento

• Especificar e não apenas validar

Friday, June 25, 2010

Page 49: E no Sétimo dia ele escreveu testes - Seminario PHP

CICLO DE DESENVOLVIMENTOsem TDD

Especificação Análise Codificação

TestesDeployManutenção

Friday, June 25, 2010

Page 50: E no Sétimo dia ele escreveu testes - Seminario PHP

Codificação

Friday, June 25, 2010

Page 51: E no Sétimo dia ele escreveu testes - Seminario PHP

Codificação

Friday, June 25, 2010

Page 52: E no Sétimo dia ele escreveu testes - Seminario PHP

Codificação

Friday, June 25, 2010

Page 53: E no Sétimo dia ele escreveu testes - Seminario PHP

Codificação

Friday, June 25, 2010

Page 54: E no Sétimo dia ele escreveu testes - Seminario PHP

Codificação

Friday, June 25, 2010

Page 55: E no Sétimo dia ele escreveu testes - Seminario PHP

Codificação

Friday, June 25, 2010

Page 56: E no Sétimo dia ele escreveu testes - Seminario PHP

Codificação

Friday, June 25, 2010

Page 57: E no Sétimo dia ele escreveu testes - Seminario PHP

Codificação

Friday, June 25, 2010

Page 58: E no Sétimo dia ele escreveu testes - Seminario PHP

CICLO DE DESENVOLVIMENTOsem TDD

Especificação Análise Codificação

TestesDeployManutenção

Friday, June 25, 2010

Page 59: E no Sétimo dia ele escreveu testes - Seminario PHP

CICLO DE DESENVOLVIMENTOsem TDD

Especificação Análise

Codificação

Testes

DeployManutenção

Friday, June 25, 2010

Page 60: E no Sétimo dia ele escreveu testes - Seminario PHP

CICLO DE DESENVOLVIMENTOsem TDD

Especificação Análise

Codificação

Testes

DeployManutenção

Friday, June 25, 2010

Page 61: E no Sétimo dia ele escreveu testes - Seminario PHP

Codificação

Testes

O que desejamos que <método> faça?

Como <método> fará o que precisa?

Massa de dados para Teste

Sem formulários, teste direto o backend com os dados

Friday, June 25, 2010

Page 62: E no Sétimo dia ele escreveu testes - Seminario PHP

CICLO DE DESENVOLVIMENTOsem com TDD

Especificação Análise

DeployManutenção Codificação

Testes

Friday, June 25, 2010

Page 63: E no Sétimo dia ele escreveu testes - Seminario PHP

Manutenção

•Processo de correção de bugs

• Identificar erro

•Escrever teste que cause falha

•Corrigir código

•Rodar teste novamente

•Verificar que o teste passou

Friday, June 25, 2010

Page 64: E no Sétimo dia ele escreveu testes - Seminario PHP

RINSE AND REPEATAutomatize seus testes e garanta qualidade da equipe

Friday, June 25, 2010

Page 65: E no Sétimo dia ele escreveu testes - Seminario PHP

CONTINUOS INTEGRATION

• “Integração contínua”

• Processo automatizado

• Executado após cada commit

• Identifica falhas

• Identifica culpados

• Controla qualidade

Friday, June 25, 2010

Page 66: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 67: E no Sétimo dia ele escreveu testes - Seminario PHP

FERRAMENTAS• phpUnderControl

• baseado no CruiseControl

• Versão atual já formata:

• Resultados de Testes

• PHP Code Sniffer

• Code Coverage

• phpDoc

• Hudson

• Resultados de Testes

• PHP Code Sniffer

• Code Coverage

• phpDoc

• Arbit

• PHP!

• Integração Contínua

• Bug Tracker

Friday, June 25, 2010

Page 68: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 69: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 70: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 71: E no Sétimo dia ele escreveu testes - Seminario PHP

Friday, June 25, 2010

Page 72: E no Sétimo dia ele escreveu testes - Seminario PHP

DÚVIDAS?

Friday, June 25, 2010

Page 73: E no Sétimo dia ele escreveu testes - Seminario PHP

Avalie essa palestra: http://joind.in/1705

[email protected]

Obrigado!

Friday, June 25, 2010