Neste post vou te mostrar como essa mistura de CakePHP com PHPUnit pode contribuir para desenvolver teu site de maneira ágil e com testes precisos.
Não sabe o que é o CakePHP ou PHPUnit? Posso te explicar!
CakePHP é um framework em PHP para desenvolvimento ágil. O principal objetivo é permitir que você trabalhe em uma estrutura que possa programar de uma forma rápida e sem a perda de flexibilidade. Também possui classes e objetos adicionais que fazem o desenvolvimento em MVC(model, view, controller), com algumas pitadas de linha de código você já tem uma base precisa para o desenvolvimento.
Já o PHPUnit é uma framework que automatiza e padroniza os testes do código, toda vez que precisar fazer um debug (aquele velho "var_dump("a");die;) pense em criar um teste, pode parecer perda de tempo, mas vai te fazer ganhar muito no final. Além disso ele possui uma série de recursos próprios, por exemplo, o Code Coverage que te permite gerar relatório de cobertura de testes com quantidade de linhas executáveis, classes, funções e métodos que existem e quantos foram testadas.
Na imagem abaixo podemos ver um exemplo deste relatório:
Como funciona essa mistura?
Quando o Cake trabalha em conjunto com o PHPUnit, é quase como comprar massa de bolo pronta e só rechear. Dentro do Cake há uma ferramenta chamada Test Suit, que realiza os testes programados.
Existe uma infinidade de tipos de testes pré implementados no Suit, desde roteirizados à coisas mínimas como para login e pequenos cadastros, porém são apenas "esqueletos" que precisam ser manipulados para se encaixar na necessidade do sistema que está sendo desenvolvido.
Depois de teorias, vamos "por a mão na massa" (NO LINUX!)
* pré requisito ter o Apache (não dá pra fazer um bolo sem a forma, né?!)
- Baixe os arquivos do Cake para a pasta do apache! (Você pode baixar aqui)
- Descompacte o arquivo baixado no diretório raiz do apache
- Carregue o módulo mod_rewrite no apache, para permitir reescrita no diretório do CakePHP.
No prompt do Ubuntu basta digitar:
sudo a2enmod rewrite
Feito isso vá até o diretório /etc/apache2/sites-enable/default e verifique que o AllowOverride está configurado como All para o DocumentRoot, como mostra abaixo:
DocumentRoot /var/www
<Directory /> Options FollowSymLinks AllowOverride All </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride All #Order allow,deny #allow from all </Directory>
Pronto agora podemos colocar o PHPUnit no nosso servidor. Rode os seguintes comandos:
pear upgrade PEAR pear config-set auto_discover 1 pear install pear.phpunit.de/PHPUnit
Depois adicione os repositórios do PHPUnit e atualize-os:
pear channel-discover pear.phpunit.de pear channel-discover pear.symfony-project.com pear update-channels pear upgrade-all pear install phpunit/PHPUnit
Depois disto, "tcharam", já pode começar a desenvolver!
Dica: Aprenda a bloquear o acesso a uma página pelo navegador, usando PHP
Algumas dicas bacaninhas
Ao iniciar um projeto depois das configurações lembre de criar uma base de testes, pode fazer assim:
Na pasta app/Config/database.php acrescente as seguintes linhas:
<?php public $test = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host'=> 'dbhost', 'login'=> 'dblogin', 'password' => 'dbpassword', 'database' => 'testes' );
Quando implementar uma classe de teste no CakePHP esta tem que ter o mesmo nome da classe que vamos testar mais a palavra Test no final. Se uma classe se chama PostsController a classe de teste será PostsController Test e ela deverá estender de ControllerTestCase.
Para realizar o teste nesse método, nós devemos criar um método na classe PostsController Test chamado testIndex da seguinte forma:
public function testIndex(){ $results = $this->testAction('posts/index/'); debug($results); }
O testAction executará a ação de testes.
Por fim, os testes podem parecer demandar um alto tempo durante o desenvolvimento o que faz com que muitos programadores deixem de implementá-los, porém, quando bem executados eles diminuem esforço e retrabalho, pois ao implementar os testes você já entende o fluxo de como o sistema deve se comportar, e tanto o CakePHP quando o PHPUnit, podem te ajudar nesta tarefa.