+6

Testando suas classes com PHPUnit

criado por Alex Weber em 25/05/2009 6:01pm
O test seguinte usa a função assertEquals() para checar o retorno de um método:

// Especifique o caminho do PHPUnit
require_once
'/usr/share/php/PHPUnit/Framework.php';
// Especifique o caminho da classe a ser testada
require_once
'Classe2.php';

class Classe2Test extends PHPUnit_Framework_TestCase
{
   
public function testCumprimentarSemParametro()
   
{
       
// O comportamento esperado é que retorne "Olá fulano", testa esta afirmação
        $this
->assertEquals('Olá fulano', $foo->cumprimentar());
   
}

   
public function testCumprimentarComParametro()
   
{
       
// Instancia a classe e passa "Alex" ao construtor
        $foo
= new Classe2('Alex');
       
// O comportamento esperado é que retorne "Olá Alex", testa esta afirmação
        $this
->assertEquals('Olá Alex', $foo->cumprimentar());
   
}
   
       
// Funções de teste também podem ser identificados pela anotação @test no DocBlock
       
/**
         * @test
         */

         
public function vaiDarErrado()
         
{
                 
// Instancia a classe e passa "ciclano" ao construtor
                $foo
= new Classe2('ciclano');
               
// O comportamento esperado é que retorne "Olá ciclano", mas vamos afirmar que retornará outro valor para forçar um erro
                $this
->assertEquals('Olá Alex', $foo->cumprimentar());
         
}
}

Outro teste simples que retorna o seguinte:
PHPUnit 3.3.16 by Sebastian Bergmann.

..F

Time: 0 seconds

There was 1 failure:

1) vaiDarErrado(Classe2Test)
Failed asserting that two strings are equal.
expected
string <Olá Alex>
difference      
<     xxxx???>
got
string      <Olá ciclano>
/caminho/para/o/arquivo/Classe2Test.php:35

FAILURES
!
Tests: 3, Assertions: 3, Failures: 1.

Ou seja, quando um teste falha ele informa o arquivo e linha onde ocorreu o erro.
Explica também qual foi o erro:
- O valor esperado era "Ola Alex"
- O valor retornado foi "Ola ciclano"
E ele ainda mostra a diferença ( xxxx???)

Fornecendo valores para os testes

- As vezes não basta só um teste com um valor estático
- Podemos criar uma função para alimentar o teste usando vários valores (e nada impede que sejam de fontes externas)
- A função é identificada através da anotação @dataProvider no DocBlock

Exemplo:

Comentários:

Mostrando 1 - 8 de 8 comentários
O artigo esta ótimo e de fácil compreensão.
A dica do Alex também foi muito importante.

Parabéns a todos
05/05/2010 10:36am (~15 anos atrás)

Alex Weber disse:
Luis,

Partindo do pressuposto que o phpunit está instalado corretamente no windows eu verificaria que o executável do phpunit está no seu PATH das suas variáveis de ambiente do windows e também que o eclipse esteja corretamente configurado.

Infelizmente não uso nem Eclipse e nem Windows para poder oferecer alguma sugestão menos genérica!

Abs,

Alex
10/03/2010 11:40am (~15 anos atrás)

Luis Ribeiro disse:
Bacana o artigo!!
Gostaria de aproveitar e tirar uma dúvida.
Utilizo o Eclipse para desenvolver PHP. Trabalho em ambiente Windows, porém o servidor do PHP é linux.
Instalei o PHP unit e pela linha de código funciona normalmente.
O problema é quando tento integrar com Eclipse. O arquivo do phpunit não roda, porque não é um programa de windows; mas eu preciso fazer os testes no ambiente em que minha aplicação roda.
10/03/2010 11:09am (~15 anos atrás)

Vlw, vou olhar a documentação! Maior adianto.
31/05/2009 9:45am (~16 anos atrás)

Alex Weber disse:
Fabiano,

Existe sim! É uma ferramenta do próprio PHPUnit que gera "esqueletos" de testes, ou seja, ele cria a classe de teste e um teste vazio para todos os métodos. Daí você só tem o trabalho de especificar afirmações a serem testadas para cada método e preencher os valores (ou definir um @dataProvider).

No caso, para criar uma classe de testes esqueleto para a sua classe "Foo", execute o seguinte comando no terminal/prompt de commando: "phpunit --skeleton Foo" e pronto!

A documentação está toda em inglês mas explica isto em mais detalhes:
http://www.phpunit.de/manual/3.4/en/skeleton-generator.html

Abs!

Alex
31/05/2009 12:08am (~16 anos atrás)

Alex Weber disse:
Fabiano,

Existe sim! É uma ferramenta do próprio PHPUnit que gera "esqueletos" de testes, ou seja, ele cria a classe de teste e um teste vazio para todos os métodos. Daí você só tem o trabalho de especificar afirmações a serem testadas para cada método e preencher os valores (ou definir um @dataProvider).

No caso, para criar uma classe de testes esqueleto para a sua classe "Foo", execute o seguinte comando no terminal/prompt de commando: "phpunit --skeleton Foo" e pronto!

A documentação está toda em inglês mas explica isto em mais detalhes:
http://www.phpunit.de/manual/3.4/en/skeleton-generator.html

Abs!

Alex
31/05/2009 12:08am (~16 anos atrás)

Legal!
Existe algum gerador de classe de teste? Vc aponta qual classe quer testar, digita os parâmetros e pronto! rs.
vlw!
30/05/2009 11:59pm (~16 anos atrás)

Alex,

Ótimo artigo mostrando o PHPUnit! Espero que isso ajude a popularidade dessa ferramenta no Brasil.

--Joao
25/05/2009 7:49pm (~16 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)