You are on page 1of 8

The Grumpy Programmers Guia para criao

de aplicaes testveis em PHP


Chris Hartjes e Nanderson Castro
Esse livro est venda em http://leanpub.com/grumpy-testing-br-pt
Essa verso foi publicada em 2014-09-14

This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing
process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and
many iterations to get reader feedback, pivot until you have the right book and build traction once
you do.
2014 Chris Hartjes e Nanderson Castro

Contedo
Agradecimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Contruir aplicaes testveis em PHP! Uma tarefa difcil . . . . . . . . . . . . . . . . . . .

Agradecimentos
Em primeiro lugar, eu gostaria de agradecer meus revisores tcnicos. Eles conseguiram pegar todos
os detalhes que passaram desapercebidos por mim e fizeram deste guia o que ele . Obrigado tambm
(sem ordem especifica) a Peter Meth, Joel Perras, Matthew Turland e Remi Woler pela ajuda de todos.
Bons guias iniciam a partir da ajuda de todos.
Em segundo lugar, eu gostaria de agradecer a todos da comunidade PHP que esto sempre levando
adiante, em alto e bom som, a importncia de se seguir as melhores prticas e contribuem para
o crescimento da mesma. Aqueles que sempre me inspiram a continuar escrevendo e falando de
assuntos que me interessam e espero que lhe interesse tambm. Eu posso me sentir, muitas vezes,
fora de sincronia com a comunidade mainstream PHP mas se o meu trabalho online e delirante
inspira outros programadores em seus trabalhos, ento sou muito grato pelo impacto que alcancei.
Finalmente, eu agradeo a minha esposa Claire por estar sempre comigo nessa minha viagem de
um programador recm-formado a um bem preparado, extremamente mal-humorado que sou hoje.
Obrigado pelas longas horas de aturao na qual um programador passa olhando para telas ao invez
de olhar para seus lindos olhos. Minha esposa minha parceira em tudo que fao.
Como sempre, seus comentrios so muito bem vindos neste guia, voc deve ter inmeras dvidas
ou apenas deseja obter meus pensamentos sobre o vasto mundo que a programao. E baseball
tambm.
Este guia foi produzido com a ajuda de incrivis pessoas na Leanpub. Minha deciso inicial ao fazer
o guia como texto com algumas marcaes AsciiDoc tornou as coisas fceis ao converte-las para o
Markdown como o Leanpub requer. Eu tambm usei Pandoc para ajuste dos trs bnus que incluir
neste guia.
Infelizmente este guia no visa o programador iniciante, escrever aplicaes testveis um coisa bem
difcil e requer uma base bem slida em programao. Este guia destinado aos programadores intermedirios que tiveram algum contato com a escrita de testes e desejam melhorar sua habilidades,
passando para um prximo nvel.
Se voc est procurar por um guia introdutrio para escrita de testes unitrios eu recomendo
fortemente o PHPUnit documentation. Ele ir cobris o bsico necessrio.
Voc pode me encontrar via email chartjes@littlehart.net e tambm no Twitter @grmpyprogrammer. Eu mantenho um blog em http://www.littlehart.net/atthekeyboard. Obrigado pelo tempo gasto
http://leanpub.com
http://www.methods.co.nz/asciidoc/
https://en.wikipedia.org/wiki/Markdown
http://johnmacfarlane.net/pandoc/
http://www.phpunit.de/manual/3.6/en/phpunit-book.html

Agradecimentos

ao analisar o guia, espero que voc possa encontrar as dicas necessrias para melhorar sua capacidade
ao criar aplicaes testveis com PHP.

Contruir aplicaes testveis em PHP!


Uma tarefa difcil
Se voc desenvolvedor PHP a muito tempo voc muito provavelmente j encontrou algum que
fale sobre os benefcios dos testes em seus cdigos. Test-Driven Development (TDD), BehaviourDriven Development (BDD) e Functional Testing so apenas algumas das estratgias que voc pode
usar. Porm deixar de testar seu cdigo no deve ser uma opo.
Eu j passei por isso tambm: Eu no acreditava no valor de escrever testes para meu cdigo. Estou
familiarizado com todas as desculpas que as pessoas podem dar:
Irei me atrasar ao escrever testes
Por que no podemos simplesmente testar manualmente a aplicao no browser?
Eu j teria implementado as novidades se eu no tivesse que escrever os testes
Realmente, elas so s desculpas. Dadas as ferramentas disponveis para os desenvolvedores PHP
essas no so razes para no escrever testes para seu aplicativo. At mesmo aplicativos que resistem
aos seus esforos para refatorar componentes individuais e envolver testes de unidade em torno deles,
o temido o aplicativo no testvel, pode ser testado em um ambiente automatizado.
As razes pelas quais voc deve investir em testes automatizados so bvias: qualquer bug
capturado antes de sua aplicao ir para produo custa menos em termos de recursos(tempo de
desenvolvimento, dinheiro) para corrigir, do que o fazer em produo. Em um estudo que a Microsoft
e IBM conduziram sobre TDD eles encontraram algumas informaes interessantes. Um projeto
usando TDD levaria de 20 a 40% mais tempo do que um que no use TDD. Porm, as aplicaes
resultantes continham de 40 a 90% menos bugs, que apenas foram descobertos em produo. Se voc
ajustar as estatsticas apenas para a direita, como pode 20% de tempo extra e 90% com menos bugs?
Como algum pode dizer no a isso?
PHPUnit, a bala de prata para testes em cdigos PHP, facilmente integrado a qualquer projeto.
Instale via Composer, crie um diretrio para seus testes em sua aplicao e inicie as escritas. Porm,
nem sempre isso ser to simples. Nem toda aplicao estar pronta ou configurada para testes.
Voc usa um sistema de autenticao de usurios de terceiros? Voc ter que descobrir como simular
as respostas deste sistema. Voc tm valores embutidos para conversar com servios da web? Voc
https://en.wikipedia.org/wiki/Test-driven_development
https://en.wikipedia.org/wiki/Behaviour_driven_development
https://en.wikipedia.org/wiki/Functional_testing
http://www.infoq.com/news/2009/03/TDD-Improves-Quality
https://github.com/sebastianbergmann/phpunit/
https://getcomposer.org

Contruir aplicaes testveis em PHP! Uma tarefa difcil

ter que extrair tais coisas e coloca-las em um arquivo de configurao. A verdade que diversas
aplicaes precisam ser refatoradas antes sequer de voc poder test-las.
Neste guia irei mostrar como voc pode construir uma aplicao que facilmente testvel. claro,
ns estamos comeando do zero ento isto ser fcil mas tambm irei mostrar alternativas para
refatorao de cdigo que no sero to amigveis assim!
Em cada capitulo ns iremos abordar diferentes tpicos que iro incrementar suas habilidades
na criao de aplicaes que voc poder facilmente testar. Alguns dos problemas que voc vai
encontrar so bastante fceis de se resolver enquanto outros podem exigir algumas mudanas
intrusivas para que isso acontea.
Para ilustrar algumas, das que considero, boas prticas para criao de aplicaes facilmente
testveis, irei criar uma aplicao exemplo que utiliza muitas das dicas que eu passarei aqui. Voc
pode encontrar o cdigo da aplicao em meu Github.
Nossa aplicao companheira baseada em um website que simula uma liga de baseball. Estou
na Internet Baseball League desde 1997 e criei esta verso do site usando uma verso muito
desatualizada do CakePHP. Eu certamente pego o trabalho feito mas tenho vontade de limpar
as coisas que esto acontecendo por baixo do cap e tirar proveito de algumas caractersticas do
PHP 5.3+
Ao invs de duplicar toda a aplicao, eu extrair as partes que geram a pgina principal do site. Esta
provavelmente a parte mais complicada do site voltada para o pblico. incorporado o uso de
mltiplos models e bastante complicado o uso de templates.Um excelente candidato para realar
o valor dos testes para verificar suas funcionalidades.
Apesar de ter adquirido uma reputao ao logo dos anos como sendo um Mister Framework, ns
no usaremos nenhum framework aqui. Eu achei importante mostrar a voc que, apesar dos maiores
frameworks do mundo dos frameworks php serem mais fceis de se escrever testes para aplicaes
usando os mesmos, voc pode facilmente cobrir qualquer aplicao com testes.
Estou usando uma combinao de caractersticas e padres de projeto. Embora eu no seja viciado
em padres, eu acredito nas solues certas para os problemas certos. Vamos dar uma olhada no que
estamos usando:

PHP 5.3.8 instalado no OS-X 10.7.2 via Homebrew


A extenso Xdebug para code-coverage reports
A extenso APC para impulsionar a performance PHP
Twig para templates

https://github.com/chartjes/building-testable-applications
http://www.ibl.org
http://www.cakephp.org
http://notfornoone.com/2010/07/install-php53-homebrew-snow-leopard/
http://www.xdebug.org
http://www.php.net/apc
http://twig.sensiolabs.org

Contruir aplicaes testveis em PHP! Uma tarefa difcil

Postgres como banco de dados


Pimple, um container de injeo de dependncias que usado como um registro de objetos
e valores necessrios para outras partes da aplicao
Eu tambm testei esta aplicao em um Ubuntu 10.04 (Lucid) usando uma mquina virtual em meu
MacBook. Mais informaes sobre o papel das mquinas virtuais em testes, abordaremos em um
capitulo posterior.
Para a arquitetura da aplicao, eu decidi usar uma estrutura de Page Controller para cada sesso
da aplicao. Se voc est usando um framework provavelmente voc estar usando um Front
Controller. Isto significa que todas as requisies iro passar por um nico arquivo e em seguida
o framework ir interpretar os pedidos e determinar qual par de controller e ao precisaro ser
executados.
Um padro Data Mapper como descrito no incrvel livro do Jason Sweats sobre Design Patterns
usado para prover o acesso a base de dados. Se voc precisar mudar seu provedor de dados, se ele
estiver crescendo para uma soluo em cluster ou a mudana ser para algum dos NoSQL disponveis
no mercado, um Data Mapper ir ajudar voc nesta mudana tornando esse trabalho mais fcil.
Neste guia eu apenas dei uma olhada nos testes que acompanham o nosso artigo companheiro. Por
favor, baixe uma cpia do cdigo e brinque com seus prprios testes. O cdigo pode ser encontrado
em https://github.com/chartjes/building-testable-applications, o cdigo em mos tornar mais fcil
a compreenso dos conceitos descritos neste guia.

http://www.postgresql.org
http://pimple.sensiolabs.org
http://www.phparch.com/books/phparchitects-guide-to-php-design-patterns/
https://github.com/chartjes/building-testable-applications

You might also like