Anotações de teste

As anotações determinam como os testes serão tratados pelo corredor de teste da linha de comando. Elas são escritas no início do arquivo de teste.

As anotações são insensíveis a maiúsculas e minúsculas. Elas também não têm efeito se o teste for executado manualmente como um script PHP regular.

Exemplo:

/**
 * TEST: Basic database query test.
 *
 * @dataProvider files/databases.ini
 * @exitCode 56
 * @phpVersion < 5.5
 */

require __DIR__ . '/../bootstrap.php';

TEST

Na verdade, não é uma anotação. Ela apenas define o título do teste que é impresso em caso de falha ou em registros.

@skip

O teste é pulado. É útil para a desativação temporária do teste.

@phpVersion

O teste é pulado se não for executado pela versão PHP correspondente. Nós escrevemos anotações como @phpVersion [operator] version. Podemos deixar de fora o operador, o padrão é >=. Exemplos:

/**
 * @phpVersion 5.3.3
 * @phpVersion < 5.5
 * @phpVersion != 5.4.5
 */

@phpExtensão

O teste é pulado se todas as extensões PHP mencionadas não forem carregadas. As extensões múltiplas podem ser escritas em uma única anotação, ou podemos usar a anotação várias vezes.

/**
 * @phpExtension pdo, pdo_pgsql, pdo_mysql
 * @phpExtension json
 */

@dataProvider

Esta anotação serve quando queremos fazer o teste várias vezes, mas com dados diferentes. (Não confundir com a anotação com o mesmo nome para TestCase).

Escrevemos anotações como @dataProvider file.ini. O caminho do arquivo INI é relativo ao arquivo de teste. O teste é executado tantas vezes quanto o número de seções contidas no arquivo INI. Vamos supor que o arquivo INI databases.ini:

[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******

[postgresql]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******

[sqlite]
dsn = "sqlite::memory:"

e o arquivo database.phpt no mesmo diretório:

/**
 * @dataProvider databases.ini
 */

$args = Tester\Environment::loadData();

O teste será executado três vezes e $args conterá valores das seções mysql, postgresql ou sqlite.

Há mais uma variação quando escrevemos anotações com um ponto de interrogação como @dataProvider? file.ini. Neste caso, o teste é pulado se o arquivo INI não existir.

As possibilidades de anotação ainda não foram todas mencionadas. Podemos escrever condições após o arquivo INI. Os testes para a seção dada só serão realizados se todas as condições coincidirem. Vamos estender o arquivo INI:

[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******

[postgresql 8.4]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******

[postgresql 9.1]
dsn = "pgsql:host=127.0.0.1;dbname=test;port=5433"
user = postgres
password = ******

[sqlite]
dsn = "sqlite::memory:"

e usaremos anotações com condições:

/**
 * @dataProvider  databases.ini  postgresql, >=9.0
 */

O teste é executado apenas uma vez para a seção postgresql 9.1. As outras seções não correspondem às condições.

Da mesma forma, podemos passar para um script PHP ao invés de INI. Ele deve retornar array ou Traversable. Arquivo databases.php:

return [
	'postgresql 8.4' => [
		'dsn' => '...',
		'user' => '...',
	],

	'postgresql 9.1' => [
		'dsn' => '...',
		'user' => '...',
	],
];

@multiple

Escrevemos como @multiple N onde N é um número inteiro. O teste é exatamente N-times.

@testCase

A anotação não tem parâmetros. Nós a usamos quando escrevemos um teste como classes TestCase. Neste caso, o executor do teste de linha de comando executará os métodos individuais em processos separados e em paralelo em várias roscas. Isto pode acelerar significativamente todo o processo de teste.

@exitCode

Escrevemos como @exitCode N onde N is the exit code of the test. For example if exit(10) é chamado no teste, escrevemos a anotação como @exitCode 10. É considerado reprovado se o teste terminar com um código diferente. O código de saída 0 (zero) é verificado se deixarmos de fora a anotação

@httpCode

A anotação é avaliada somente se o binário PHP for CGI. É ignorado de outra forma. Nós a escrevemos como @httpCode NNN onde se espera que NNN seja o código HTTP. O código HTTP 200 é verificado se deixarmos de fora a anotação. Se escrevermos NNN como uma string avaliada como zero, por exemplo any, o código HTTP não é verificado de forma alguma.

@outputMatch a @outputMatchFile

O comportamento das anotações é consistente com as afirmações Assert::match() e Assert::matchFile(). Mas o padrão é encontrado na saída padrão do teste. Um caso de uso adequado é quando assumimos que o teste termina por erro fatal e precisamos verificar seu resultado.

@phpIni

Define os valores de configuração INI para teste. Por exemplo, nós o escrevemos como @phpIni precision=20 e funciona da mesma forma como se passássemos o valor da linha de comando pelo parâmetro -d precision=20.