Usando PHPUnit no Codeigniter via Hooks

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.

phpunit-teste-falhou

phpunit-teste-falhou

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.

phpunit-testes-ok

phpunit-testes-ok

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!

Anúncios

2 comentários sobre “Usando PHPUnit no Codeigniter via Hooks

    • Olá André. Excelente artigo, gostei das ponderações que fez.

      Espero ter ajudado e obrigado pelo feedback, é muito importante!

      Continue acompanhando o blog, muita coisa bacana ainda está por vir.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s