Olá pessoal.
Já fiz um post sobre como fazer testes unitários utilizando o framework Codeigniter PHP com o CIUnit.
Uma grande pergunta que me fiz foi: “Porque utilizar componentes externos se posso simplificar esse fluxo?”
Pesquisando achei este link que fala da utilização de hooks para integração do PHPUnit e o Codeigniter de maneira mais simples (http://phpfour.com/blog/2012/01/phpunit-integration-with-codeigniter/), mas quando fui utilizá-lo via CLI tive alguns problemas, então tive que fazer algumas modificações.
Inicialmente vamos fazer o download do framework no repositório oficial da Ellislab. Feito o download descompactaremos ele no nosso servidor local. A partir daí faremos algumas modificações.
No arquivo ‘system/core/Exceptions.php’ iremos modificar os métodos “show_php_error()” e “show_error()” para que eles verifiquem se a chamada do arquivo foi feita via linha de comando. Caso positivo o erro deve ser otimizado para sua visualização via CLI. Insira este conteúdo no arquivo.
Gist: https://gist.github.com/willmendesneto/5025979
No arquivo ‘application/config/config.php’ modifique a linha 121 para que o array na posição ‘enable_hooks’ tenha agora o valor “TRUE”, assim a aplicação fica sabendo que vai utilizar algum hook
$config[‘enable_hooks’] = TRUE;
Após isso vá em ‘application/config/hooks.php e insira este conteúdo
$hook[‘display_override’] = array(
‘class’ => ‘DisplayHook’,
‘function’ => ‘captureOutput’,
‘filename’ => ‘DisplayHook.php’,
‘filepath’ => ‘hooks’
);
Gist: https://gist.github.com/willmendesneto/5025990
Vamos criar a classe que vai interagir com o evento encadeado via hook. Crie o arquivo ‘application/hooks.DisplayHook.php’ e insira o conteúdo deste gist.
Gist: https://gist.github.com/willmendesneto/5025995
Para maiores informações sobre os métodos que podem ser utilizados para os hooks, uma excelente dica é a documentação oficial do Codeigniter(http://ellislab.com/codeigniter/user-guide/general/hooks.html).
Agora iremos criar as configurações para utilizarmos os testes unitários. Crie o arquivo “phpunit.xml.dist” na raíz do projeto com este conteúdo (https://gist.github.com/willmendesneto/5026004). Logo após crie uma pasta ‘tests’ na raíz do projeto. Nesta pasta ficarão todos os arquivos de teste que utilizaremos neste exemplo. Para concluirmos a configuração do ambiente de testes, iremos criar um arquivo em ‘tests/bootstrap.php’ com este conteúdo (https://gist.github.com/willmendesneto/5026014), assim nos asseguramos que os componentes do Framework estarão inicializados e prontos para o utilização nos testes.
Estou utilizando o nome do banco dados ‘ci-phpunit’ para este exemplo. Neste banco criaremos a tabela ‘posts’ com este conteúdo:
CREATE TABLE IF NOT EXISTS `posts` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Agora sim criaremos o nosso arquivo de testes. Crie o arquivo em ‘tests/PostTest.php’ com este conteúdo.
Gist: https://gist.github.com/willmendesneto/5026017
Passando por estas etapas, abra a linha de comando e insira os comandos:
cd pasta-do-seu-projeto/
phpunit
ou
phpunit --testdox
Dica: Caso esteja usando o phpunit via composer, você pode utilizar os comandos:
cd pasta-do-seu-projeto/
php vendor/phpunit/phpunit/composer/bin/phpunit
ou
php vendor/phpunit/phpunit/composer/bin/phpunit --testdox
Inicialmente vai dar errado o teste e mostrará o html da mensagem que seria visualizado no seu navegador.
Não se espante, pois este evento já era esperado. Isto acontece porque o model Post ainda não existe. Vamos criá-lo? Inisira o model Post em ‘application/models/Post.php’ com este conteúdo(https://gist.github.com/willmendesneto/5026026) e vamos rodar o comando na linha de comando novamente.
Após o comando ser executado a mensagem que vai aparecer é esta acima, mostrando que está tudo ok! Seu teste está rodando no Codeigniter e o model Post foi testado corretamente somente com a utilização de um hook. Simples e prático.
Se você nãoo conhece muita coisa sobre Testes Unitários e TDD, aconselho a dar uma olhada neste link do tutsplus (http://net.tutsplus.com/sessions/test-driven-php/) que aborda alguns conceitos e utilizações com exemplos utilizando a linguagem PHP.
Criei um repositório no meu Github mostrando todas as etapas deste projeto e um controller com a migration para gerar a tabela ‘posts’ no seu banco de dados. Segue o link(https://github.com/willmendesneto/Codeigniter-TDD-with-Hooks)
Curtiu? Utiliza de outra forma? Dê sua opinião!
Obrigado e até mais!