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!

Testes no Codeigniter com CIUnit

Olá pessoal.

Para quem já tentou utilizar TDD (Test Development Driven) no Codeigniter percebeu que sofria horrores para conseguir. Para isso Tatsuya Fukata criou uma biblioteca, a CIUnit, e a deixou disponível no Github (https://github.com/fukata/CIUnit-for-CI2). Este post vai mostrar como é bem simples fazermos testes unitários utilizando este componente.

Seu acoplamento é bastante simples:

Github - Projeto CIUnit

Github – Projeto CIUnit

Faça o download do Codeigniter e descompacte-o no seu servidor local. Após isto faça o download do projeto CIUnit e insira os arquivos do projeto no diretório “application/third_party/” da sua aplicação;

Remova o conteúdo da pasta “tests” e crie o arquivo “phpunit.xml.dist” na raíz do projeto com este conteúdo (https://gist.github.com/willmendesneto/5005522).

Agora crie o arquivo  “VerificationTests.php” dentro da pasta tests e insira este conteúdo (https://gist.github.com/willmendesneto/5005595).

Passando por estas etapas, abra a linha de comando e insira os comandos:

cd pasta-do-seu-projeto/


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 --testdox

Pronto, se tudo deu certo você verá a mensagem de tudo ok na aplicação.

Obrigado e até mais

https://github.com/fukata/CIUnit-for-CI2