Uma anotação é uma forma especial de metadados sintáticos que podem ser adicionados ao código-fonte de algumas linguagens de programação. Enquanto o PHP não tem um recurso de linguagem dedicado a anotação de código-fonte, o uso de tags como @annotation arguments em bloco de documentação tem sido estabelecido na comunidade do PHP para anotar o código-fonte. Os blocos de documentação PHP são reflexivos: eles podem ser acessados através do método da API de Reflexão getDocComment() a nível de função, classe, método e atributo. Aplicações como o PHPUnit usam essa informação em tempo de execução para configurar seu comportamento.
Este apêndice mostra todas as variedades de anotações suportadas pelo PHPUnit.
A anotação @author é um apelido para a anotação
@group (veja a seção chamada “@group”) e permite filtrar os testes baseado em seus autores.
As operações de backup e restauração para variáveis globais podem ser completamente desabilitadas para todos os testes de uma classe de caso de teste como esta:
/**
* @backupGlobals disabled
*/
class MeuTest extends PHPUnit_Framework_TestCase
{
// ...
}
A anotação @backupGlobals também pode ser usada a nível de método de teste. Isso permite uma configuração refinada das operações de backup e restauração:
/**
* @backupGlobals disabled
*/
class MeuTest extends PHPUnit_Framework_TestCase
{
/**
* @backupGlobals enabled
*/
public function testQueInterageComVariaveisGlobais()
{
// ...
}
}
As operações de backup e restauração para atributos estáticos de classes podem ser completamente desabilitadas para todos os testes de uma classe de caso de teste como esta:
/**
* @backupStaticAttributes disabled
*/
class MeuTest extends PHPUnit_Framework_TestCase
{
// ...
}
A anotação @backupStaticAttributes também pode ser usada a nível de método de teste. Isso permite uma configuração refinada das operações de backup e restauração:
/**
* @backupStaticAttributes disabled
*/
class MeuTest extends PHPUnit_Framework_TestCase
{
/**
* @backupStaticAttributes enabled
*/
public function testQueInterageComAtributosEstaticos()
{
// ...
}
}
As anotações @codeCoverageIgnore,
@codeCoverageIgnoreStart e
@codeCoverageIgnoreEnd podem ser usadas para excluir linhas de código da análise de cobertura.
Para uso, veja a seção chamada “Ignorando Blocos de Código”.
A anotação @covers pode ser usada no código de teste para especificar quais métodos um método de teste quer testar:
/**
* @covers ContaBancaria::getSaldo
*/
public function testSaldoEhInicialmenteZero()
{
$this->assertEquals(0, $this->cb->getSaldo());
}
Se fornecida, apenas a informação de cobertura de código para o(s) método(s) especificado(s) será considerada.
Tabela A.1 mostra a sintaxe da anotação @covers.
Tabela A.1. Anotações para especificar quais métodos são cobertos por um teste
| Anotação | Descrição |
|---|---|
@covers ClassName::methodName | Especifica que o método de teste anotado cobre o método especificado. |
@covers ClassName | Especifica que o método de teste anotado cobre todos os métodos de uma dada classe. |
@covers ClassName<extended> | Especifica que o método de teste anotado cobre todos os métodos de uma dada classe e sua(s) classe(s) pai(s) e interface(s). |
@covers ClassName::<public> | Especifica que o método de teste anotado cobre todos os métodos públicos de uma dada classe. |
@covers ClassName::<protected> | Especifica que o método de teste anotado cobre todos os métodos protegidos de uma dada classe. |
@covers ClassName::<private> | Especifica que o método de teste anotado cobre todos os métodos privados de uma dada classe. |
@covers ClassName::<!public> | Especifica que o método de teste anotado cobre todos os métodos que não sejam públicos de uma dada classe. |
@covers ClassName::<!protected> | Especifica que o método de teste anotado cobre todos os métodos que não sejam protegidos de uma dada classe. |
@covers ClassName::<!private> | Especifica que o método de teste anotado cobre todos os métodos que não sejam privados de uma dada classe. |
@covers ::functionName | Especifica que o método de teste anotado cobre todos os métodos que não sejam privados de uma dada classe. |
A anotação @coversNothing pode ser usada no código de teste para especificar que nenhuma informação de cobertura de código será gravada para o caso de teste anotado.
Isso pode ser usado para testes de integração. Veja Exemplo 10.3 para um exemplo.
A anotação pode ser usada nos níveis de classe e de método e vão sobrepujar quaisquer tags @covers.
Um método de teste pode aceitar argumentos arbitrários. Esses argumentos devem ser fornecidos por um método provedor (provider() em
Exemplo 2.4).
O método provedor de dados a ser usado é especificado usando a anotação
@dataProvider.
Veja a seção chamada “Provedores de Dados” para mais detalhes.
O PHPUnit suporta a declaração de dependências explícitas entre métodos de teste. Tais dependências não definem a ordem em que os métodos de teste devem ser executados, mas permitem o retorno de uma instância do componente de teste por um produtor e passá-la aos consumidores dependentes.
Exemplo 2.2 mostra como usar a anotação @depends para expressar dependências entre métodos de teste.
Veja a seção chamada “Dependências de Testes” para mais detalhes.
Exemplo 2.7
mostra como usar a anotação @expectedException para testar se uma exceção é lançada dentro do código testado.
Veja a seção chamada “Testando Exceções” para mais detalhes.
A anotação @expectedExceptionCode em conjunção com a @expectedException permite fazer asserções no código de erro de uma exceção lançada, permitindo diminuir uma exceção específica.
class MeuTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException MinhaExcecao
* @expectedExceptionCode 20
*/
public function testExcecaoTemCodigoErro20()
{
throw new MinhaExcecao('Alguma Mensagem', 20);
}
}
Para facilitar o teste e reduzir a duplicação, um atalho pode ser usado para especificar uma constante de classe como uma
@expectedExceptionCode usando a sintaxe
"@expectedExceptionCode ClassName::CONST".
class MeuTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException MinhaExcecao
* @expectedExceptionCode MyClass::ERRORCODE
*/
public function testExcecaoTemCodigoErro20()
{
throw new MyException('Alguma Mensagem', 20);
}
}
class MinhaClasse
{
const ERRORCODE = 20;
}
A anotação @expectedExceptionMessage trabalha de modo similar a @expectedExceptionCode já que lhe permite fazer uma asserção na mensagem de erro de uma exceção.
class MeuTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException MinhaExcecao
* @expectedExceptionMessage Alguma Mensagem
*/
public function testExcecaoTemMensagemCerta()
{
throw new MinhaExcecao('Alguma Mensagem', 20);
}
}A mensagem esperada pode ser uma substring de uma Mensagem de exceção. Isso pode ser útil para assertar apenas que um certo nome ou parâmetro que foi passado é mostrado na exceção e não fixar toda a mensagem de exceção no teste.
class MeuTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException MinhaExcecao
* @expectedExceptionMessage quebrado
*/
public function testExcecaoTemMensagemCerta()
{
$param = "quebrado";
throw new MinhaExcecao('Parâmetro Inválido "'.$param.'".', 20);
}
}
Para facilitar o teste e reduzir duplicação um atalho pode ser usado para especificar uma constante de classe como uma
@expectedExceptionMessage usando a sintaxe
"@expectedExceptionMessage ClassName::CONST".
Um exemplo pode ser encontrado na seção chamada “@expectedExceptionCode”.
Um teste pode ser marcado como pertencente a um ou mais grupos usando a anotação
@group desta forma:
class MeuTest extends PHPUnit_Framework_TestCase
{
/**
* @group especificacao
*/
public function testAlgumaCoisa()
{
}
/**
* @group regressao
* @group bug2204
*/
public function testOutraCoisa()
{
}
}
Testes podem ser selecionados para execução baseada em grupos usando os comutadores
--group e --exclude-group do executor de teste em linha-de-comando ou usando as respectivas diretivas do arquivo de configuração XML.
A anotação @requires pode ser usada para pular testes quando pré-condição, como a Versão do PHP ou extensões instaladas, não batem.
Uma lista completa de possibilidades e exemplos pode ser encontrada em Tabela 7.3