Neste guia abordaremos a utilização da ferramenta de cobertura de testes, incluída no framework de testes PEST, ferramenta open-source baseada no PHPUnit que possui uma boa documentação e uma sintaxe amigável.
Guia feito por Ariadne Milena L. Silva.
- PHP;
- Xdebug v2.0+, PCOV ou PHPDBG (Apenas um destes é necessário);
- Composer;
- PEST;
- Pasta coverage_pest.
Na pasta raiz do projeto coverage_pest
, rode o seguinte comando no terminal:
composer require pestphp/pest --dev --with-all-dependencies
Após a instalação, rode o seguinte comando para inicializar os arquivos:
./vendor/bin/pest --init
Após os comandos acima, você pode rodar o seguinte comando para verificar se o framework está funcionando:
./vendor/bin/pest
Se tudo estiver certo, você deve ver a seguinte saída:
Recomendo a leitura da documentação do PEST para você aprender sobre a escrita dos testes. O link direto para a seção de escrita de testes pode ser acessado através deste link.
Para este guia, a pasta coverage_pest
já inclui o código de produção (o código no qual os testes serão aplicados) e os testes.
De forma geral, para verificar a cobertura de testes, é necessário:
- Escrever o código de produção;
- Escrever os testes utilizando a sintaxe do PEST ou PHPUnit.
Observação:
Caso utilize o Xdebug, defina o modo de operação para coverage, para fazer isso basta alterar a variável através deste comando ao rodar o teste:
XDEBUG_MODE=coverage ./vendor/bin/pest --coverage
Caso não funcione, você pode alterar o valor no arquivo
php.ini
, localizado na pasta raiz do PHP. Neste caso, adicione a seguinte linha no bloco onde estão as outras configurações do Xdebug:xdebug.mode=coverage
A máquina utilizada neste guia faz uso do Xdebug.
Para executar a verificação da cobertura, o comando básico é:
./vendor/bin/pest --coverage
É possível definir um valor mínimo de cobertura para o teste ser considerado aprovado (PASS). Para isto, deve-se adicionar o parâmetro --min
, sendo o número a porcentagem de cobertura mínima a ser atingida.
Exemplo:
./vendor/bin/pest --coverage --min=90
Neste exemplo, o teste precisa ter ao menos 90% de cobertura, se não aparecerá como fracassado (FAIL).
Por padrão, o PEST detecta automaticamente pastas com nome app
e src
. Caso a pasta onde o seu código de produção está possua outro nome, é possível adicioná-la inserindo uma nova linha com a tag <directory>
no arquivo phpunit.xml
, localizado na raiz do projeto.
<coverage processUncoveredFiles="true">
<include>
<directory suffix=".php">./app</directory>
<directory suffix=".php">./src</directory>
<directory suffix=".php">./nome_da_sua_pasta</directory>
</include>
</coverage>
Desta forma, também é possível filtrar que pastas estão sendo utilizadas.
Para exportar os resultados, você pode usar as funções do PHPUnit --coverage-html
, para exportar o resultado em HTML ou --coverage-xml
, para exportar em XML.
Utilização:
Exportando em HTML
./vendor/bin/pest --coverage --coverage-html nome-da-pasta
Exportando em XML
./vendor/bin/pest --coverage --coverage-xml nome-da-pasta
Ao rodar o comando ./vendor/bin/pest --coverage
, é exibido o seguinte relatório:
sistema
é o nome do arquivo verificado e os números 36, 51, e 64
são referentes as linhas que não estão sendo cobertas pelo teste atualmente, resultando numa cobertura de 81,3%.
Analisando as linhas mencionadas no relatório, percebemos que falta criar um teste para cada situação em que as funções vão retornar false. Para isso, descomentamos as linhas no arquivo sistemaTest.php. Em outro cenário, você precisará os testes manualmente.
Note que, conforme você cria (ou no caso, descomenta) os testes que faltam e executa o comando, a porcentagem de cobertura vai aumentando de acordo, bem como a quantidade de linhas a cobrir vão sendo reduzidas.
Ao cobrir todas as linhas do código, você terá um relatório de 100% de cobertura.
Para este guia, foi criado um vídeo demonstrando na prática cada passo mencionado acima.
Link: https://youtu.be/mfyvHjIDqu0
Espero que este guia tenha sido útil para mostrar a utilização da ferramenta de cobertura do PEST, framework que possui muitas outras funcionalidades além desta mencionada no guia. Vale dar uma aprofundada em sua documentação para conferir o que a ferramenta pode proporcionar.