Primeiros Passos No PHPUnit

Categorias: desenvolvimento, php

Fala pessoal!

Hoje vamos cobrir os primeiros passos de uma ferramenta super importante para quem quer avançar no desenvolvimento PHP, o PHPUnit. Não vamos passar aqui pela instalação e configuração dele, sendo que já temos vários artigos sobre isso internet a fora seja lá qual for seu sistema operacional. Eu estarei demonstrando os exemplos aqui no Mac OS X mas você pode seguir normalmente no seu sistema.

Para quem não sabe PHPUnit é um framework que nos ajuda a desenvolver testes unitários em PHP. Esse unitário se refere literalmente a unidade, pequenas partes. Logo, testes unitários são testes para pequenas partes de código. No objetivo geral, testando cada unidade vamos saber se toda nossa aplicação está funcionando corretamente, e se não está, qual parte (unidade) está falhando. Pense em um portal onde uma equipe grande trabalha e tem várias alterações de código diariamente para melhorias e correções. Os testes tem que estar sempre ok antes de algo ir para o ar, uma maneira rápida certeira de conferir se nada foi quebrado no código.

Após instalar e configurar o PHPUnit a primeira coisa a fazer é testar se está tudo ok.
Para isso vá até o seu console e digite o comando phpunit.
A saída esperada é um helper como na imagem abaixo:
testando phpunit

Caso você tenha problemas é hora de checar a sua instalação.
Se você usa sistema unix e instalou o PHPUnit via PEAR aqui vão algumas dicas para tentar resolver isso:

  • Pode ser que esteja tudo instalado corretamente, mas o console não esteja localizando o comando do PHPUnit. Para resolver isso primeiro verifique se a PEAR está instalada tentando digitar o comando pear. Se sim, entre com o comando pear config-get bin_dir para saber o diretório do bin do PHPUnit. Confira se a saída está no seu PATH de comandos, com o comando echo $PATH. Caso não esteja use o comando export para adicionar esse caminho.
  • Se você tem certeza que o PEAR está instalado corretamente, execute o seguinte comando para reinstalar o PHPUnit pear install –alldeps –force phpunit/PHPUnit.

Com tudo ok podemos seguir em frente.
Daqui em diante conto que você saiba pelo menos um mínimo de Orientação a Objetos para que acompanhe os exemplos abaixo.
Para que a gente entenda o que esperar do PHPUnit, vamos primeiro criar uma classe com pelo menos um atributo e seus métodos get() e set().
Que tal a tradicional classe Carro com uma propiedade de cor?

/**
 * Classe Carro
 *
 **/
class Carro
{
    private $_cor;

    public function getCor()
    {
        return $this->_cor;
    }

    public function setCor($cor)
    {
        $this->_cor = $cor;
    }

}

Com a classe principal criada vamos agora preparar nossa classe de testes.
Vamos chamar nossa classe de testes de CarroTeste.php.

require_once "Carro.php";

/**
 * Classe Carro Teste
 **/
class CarroTeste extends PHPUnit_Framework_Testcase
{

}

Repare em duas coisas no código acima:

  • Sua classe de testes deve conhecer a classe que vai ser testada (use require, include ou autoload).
  • Sua classe de testes precisa extender o framework PHP_Unit. Para extender o PHPUnit da mesma forma como no código acima, configure corretamente o seu include_path no seu arquivo de configuração do PHP (php.ini). Não sabe onde está seu arquivo php.ini? Utilize o comando php –ini. Procure por include_path dentro desse arquivo e adicione o caminho para o framework PHPUnit. **A instalação via PEAR constuma adicionar esse caminho para você no php.ini. Confira o arquivo se for caso.

Finalmente vamos ao nosso teste em si. Vamos testar se nossos métodos get() e set() estão realmente fazendo o que se espera. Get() tem de retornar o mesmo valor passado para set(). Para verificar isso vamos usar o método assertEquals do PHPUnit, veja o exemplo:

require_once "Carro.php";

/**
 * Classe Carro Teste
 **/
class CarroTeste extends PHPUnit_Framework_Testcase
{
    public function testeCor()
    {
        $carro = new Carro();
        $carro->setCor("Azul");

        $this->assertEquals("Azul", $carro->getCor());
    }
}

Criamos um método testeCor em nossa classe de testes.
Dentro dele instanciamos a classe carro e atribuímos para a propiedade cor o valor Azul.
O método AssertEquals do PHPUnit vai comparar se os dois parâmetros passados são iguais.

Vamos rodar nosso teste?
Em seu console execute o comando phpunit passando para ele o caminho da sua classe de testes. O resultado deve ser similar a esse:
Rodando o primeiro teste

Na imagem você percebe abaixo da linha de descrição da versão do PHPUnit um . (ponto). Em seguida uma descrição do tempo de execução e memória utilizada e abaixo um OK. Isso indica que nosso teste teve sucesso. O ponto que falamos acima indica que um teste teve sucesso, em caso de falha teremos um F no lugar do ponto. Para cada teste irá ser adicionado um . pontoou um F.

Vamos forçar um erro no teste para ver o que acontece? Vamos trocar os parâmetros do nosso AssertEquals e dizer que estamos esperando o resultado Amarelo invés de Azul.

require_once "Carro.php";

/**
 * Classe Carro Teste
 **/
class CarroTeste extends PHPUnit_Framework_Testcase
{
    public function testeCor()
    {
        $carro = new Carro();
        $carro->setCor("Azul");

        $this->assertEquals("Amarelo", $carro->getCor());
    }
}

Rodando nosso teste agora temos a seguinte saída:
Falha no PHPUnit

No lugar do ponto anterior que indicava sucesso, temos agora um F indicando a falha. Junto a isso o PHPUnit nos traz detalhes da falha com o nome do teste que falhou, o que era esperado e o que foi retornado.

A ideia por trás do PHPUnit e suas funções é bem similar ao que foi demonstrado acima, com o detalhe que algumas funções podem ter mais parâmetros ou esperar tipos diferentes de dados. Que tal descobrir mais métodos do PHPUnit e criar novos testes? Visite o capítulo 4 do manual do PHPUnit e teste outras funções do framework. Segue o link para o manual: http://www.phpunit.de/manual/current/en/writing-tests-for-phpunit.html.

Grande Abraço!


Comments