Imaster

Gerando code coverage com PHPUnit e phpdbg

Em um artigo anterior, eu mostrei alguns truques para identificar testes que estão demorando muito para serem executados. Neste texto, vou mostrar uma forma de melhorar a performance da geração do relatório de cobertura de códigos usando o PHPUnit.

É possível incluir configurações no arquivo phpunit.xml para que sejam gerados relatórios relativos aos testes que estão sendo executados.

<logging> 
    <log type="coverage-clover" target="tests/_reports/logs/clover.xml"/> 
    <log type="coverage-html" target="tests/_reports/coverage" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" /> 
    <log type="testdox-text" target="tests/_reports/testdox/executed.txt"/> 
</logging>

Desta forma, será criado o diretório tests/_reports com uma série de informações úteis. No diretório coverage-html podemos ver detalhes da cobertura de testes dos códigos, facilitando a análise. O arquivo clover.xml é uma versão desta mesma informação para ser processada por serviços como Jenkins, CodeCov, Coveralls, Codacy, etc, para automatizarmos alertas e scripts.

Para estas informações serem geradas, além de alterarmos o phpunit.xml é necessário que instalemos a extensão XDebug. O problema é que, ao fazermos isso, temos uma queda considerável de performance. Confira o resultado da execução dos testes sem a geração dos relatórios:

eminetto@MacBook-Air (master) ~/Documents/Projects/planrockr/planrockr-backend: ./vendor/bin/phpunit 
PHPUnit 4.8.26 by Sebastian Bergmann and contributors. 
Warning:	The Xdebug extension is not loaded No code coverage will be generated. ............................................................... 63 / 173 ( 36%) ............................................................... 126 / 173 ( 72%) ............................................... 
Time: 1.08 minutes, Memory: 120.00MB 
OK (173 tests, 682 assertions)

Habilitando o XDebug e rodando novamente teremos uma surpresa:

eminetto@MacBook-Air (master *) ~/Documents/Projects/planrockr/planrockr-backend: ./vendor/bin/phpunit 
PHPUnit 4.8.26 by Sebastian Bergmann and contributors. ............................................................... 63 / 173 ( 36%) ............................................................... 126 / 173 ( 72%) ............................................... 
Time: 22.26 minutes, Memory: 128.00MB 
OK (173 tests, 682 assertions) 
Generating code coverage report in Clover XML format ... done Generating code coverage report in HTML format ... done

O tempo de execução pulou de 1.08 para 22.26 minutos!

Depois de algumas pesquisas pela internet, cheguei a este artigo e resolvi testar o phpdbg.

Como estou usando o MacOS X, para este teste eu executei os comandos abaixo para instalar todas as dependências que eu necessito.

brew install php70 --with-phpdbg 
brew install php70-apcu 
brew install php70-imagick 
brew install php70-intl 
brew install php70-mcrypt 
brew install --HEAD homebrew/php/php70-memcached 
brew install php70-mongodb 
brew install php70-pdo-pgsql 
brew install php70-xdebug

A diferença principal é o parâmetro –with-phpdbg usando na instalação do php7.

Seguindo este post do Sebastian Bergmann, criador do PHPUnit, eu cheguei a sintaxe para rodar o teste novamente:

eminetto@MacBook-Air (master *) ~/Documents/Projects/planrockr/planrockr-backend: phpdbg -qrr ./vendor/bin/phpunit 
PHPUnit 4.8.26 by Sebastian Bergmann and contributors. ............................................................... 63 / 173 ( 36%) ............................................................... 126 / 173 ( 72%) ............................................... 
Time: 1.59 minutes, Memory: 278.00MB 
OK (173 tests, 682 assertions) 
Generating code coverage report in Clover XML format ... done 
Generating code coverage report in HTML format ... done

1.59 min é um tempo bem melhor do que os 22.26 usados pelo XDebug.

Na empolgação, eu comentei isso no Twitter, antes mesmo de escrever este artigo:

twitter-derick

Se você observar, quem respondeu foi ninguém menos do que o criador do XDebug! Levando isso em conta, fiz a comparação entre os resultados gerados pelo XDebug e o phpdbg.

Abaixo, a comparação do coverage-html gerado pelo XDebug (na esquerda) e o phpdbg (na direita da imagem):

coverage-html

Usei a ferramenta CodeCov para processar o arquivo clover.xml e o resultado também foi ligeiramente diferente:

CodeCovCloverPHPDBG

CodeCovXdebug

Segundo o relatório gerado pelo phpdbg, o Planrockr está com 66,05 % de cobertura de códigos. Já o XDebug apresenta o resultado de 65,92 %.

Algumas conclusões que posso tirar deste pequeno teste:

  • O XDebug é uma ferramenta incrível e faz muito mais do que gerar cobertura de código, por isso não estou aqui dizendo que deveríamos parar de usá-la. Aqui estou apenas comparando um dos seus recursos;
  • Eu estou comparando o resultado “de fábrica”, sem fazer ajustes em configurações do XDebug ou do phpdbg, por isso resultados diferentes podem acontecer em outros cenários;
  • Apesar da diferença de resultados entre os dois relatórios a diferença de performance compensa o uso do phpdbg no meu caso.

Vou seguir usando o phpdbg por mais tempo e se algum novo resultado aparecer nas próximas semanas eu atualizo este artigo, ou gero outro relatando o aprendizado.

E se eu estou errado em minhas conclusões, por favor me avisem que terei o maior prazer em me retratar.

Mensagem do anunciante:

Infraestrutura financeira descomplicada é com a iugu! Tão simples que parece brincadeira! Clique aqui e dê um up nos negócios!

Powered by WPeMatico