PHP_CodeSniffer (PHP)
phpcs-aaa é um padrão PHPCS que aplica o padrão Arrange-Act-Assert em métodos de teste PHP.
Instalação
composer require --dev babu-ch/phpcs-aaaSe você não usa o phpcodesniffer-composer-installer, registre o caminho do standard manualmente:
vendor/bin/phpcs --config-set installed_paths vendor/babu-ch/phpcs-aaaAtivar o sniff
<!-- phpcs.xml.dist -->
<?xml version="1.0"?>
<ruleset name="Project">
<file>tests</file>
<rule ref="AAA"/>
</ruleset>Execução ad-hoc:
vendor/bin/phpcs --standard=AAA tests/Sniff: AAA.Tests.Pattern
Configuração
<rule ref="AAA.Tests.Pattern">
<properties>
<property name="caseSensitive" value="false"/>
<property name="allowEmptySection" value="true"/>
<property name="testFunctionPrefixes" type="array">
<element value="test"/>
</property>
<property name="labels" type="array">
<element key="arrange" value="arrange"/>
<element key="act" value="act"/>
<element key="assert" value="assert"/>
</property>
</properties>
</rule>Métodos de teste são detectados por prefixo do nome (convenção PHPUnit: métodos começando com test). Estenda a lista se usar outra nomenclatura.
Exemplos
Given / When / Then
<property name="labels" type="array">
<element key="arrange" value="given"/>
<element key="act" value="when"/>
<element key="assert" value="then"/>
</property>O que detecta
// Erro: "arrange" ausente
public function testBad(): void
{
// act
$x = $this->doThing();
// assert
$this->assertSame(1, $x);
}
// Erro: ordem incorreta
public function testAlsoBad(): void
{
// act
$x = $this->doThing();
// arrange
$y = 1;
// assert
$this->assertSame($y, $x);
}Auto-fix
Quando os três comentários de seção estão todos ausentes, vendor/bin/phpcbf (o auto-fixer que vem com o PHP_CodeSniffer) insere um template // arrange / // act / // assert no topo do método de teste. Depois basta mover cada comentário acima do código a que pertence.
Outros casos (um ou dois ausentes, ordem incorreta, seção vazia) não são corrigidos automaticamente — a posição correta depende da intenção do teste, e a mensagem de erro diz exatamente «o quê» adicionar e «onde».