+6

Testando suas classes com PHPUnit

criado por Alex Weber em 25/05/2009 6:01pm
Testando a mesma classe do exemplo anterior com o PHPUnit:

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

// Como a classe a ser testada se chama "Classe1", a classe de teste deverá se chamar "ClasseTest" e (neste caso) irá herdar de PHPUnit_Framework_TestCase
class Classe1Test extends PHPUnit_Framework_TestCase
{
	// Funções de teste devem ter o prefixo "test"
	public function testSoma()
	{
		// A classe a ser testada é instanciada
		$foo = new Classe1();
		// Testamos a afirmação que "4" é o resultado de passar "2" e "2" (ou seja, 2 + 2 = 4)
		$this->assertEquals('4', $foo->somar(2, 2));
	}
	
	public function testSubtracao()
	{
		// idem (veja função acima)
		$foo = new Classe1();
		$this->assertEquals('0', $foo->subtrair(2, 2));
	}
}

O resultado:

PHPUnit 3.3.16 by Sebastian Bergmann.

.

Time: 0 seconds

OK (2 tests, 2 assertions)

// Funciona conforme esperado!

O que aconteceu?
Criamos uma classe (Classe1Test) de teste para testar a nossa classe (Classe1) e usamos o PHPUnit para testar o funcionamento esperado

Não é mais complicado?
- Sim e não! Inicialmente pode parecer bem mais simples inserir alguns print() ou echo() e verificar manaulmente, mas ao longo prazo usar o PHPUnit traz diversas vantagens:
- Os testes ficam separados do código, assim não corremos o risco de esqueçer testes no meio do código. Devido à separação também não é necessário ficar voltando e comentando e descomentando as linhas de teste inseridas manualmente.
- Para aplicações um pouco mais complexas (por exemplo com várias classes interagindo juntas ou com AJAX) as vezes não é possível colocar echo() ou print() em qualquer lugar. Até mesmo o FirePHP gera erros de 'header'!
- Usando o PHPUnit criamos vários testes e sempre que desejarmos podemos rodá-los novamente para testar modificações.
- E o melhor de tudo, não precisamos fazer nada na hora de colocar a aplicação no ar. Simplesmente não fazemos o upload da pasta de testes! O código-fonte original segue intacto.

Como funciona?
- Crie uma classe de teste para testar uma classe já existente
- Excute os testes no terminal (ou prompt de comando) e veja os resultados
- A melhor maneira da aprender isto é através de exemplos então vamos instalar o PHPUnit e criar alguns testes!

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 (~4 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 (~4 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 (~4 anos atrás)

Vlw, vou olhar a documentação! Maior adianto.
31/05/2009 9:45am (~5 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 (~5 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 (~5 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 (~5 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 (~5 anos atrás)

Novo Comentário:

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