Pular para o conteúdo

Sonda 1.16: cobertura de branches para PHP sem Xdebug, agora em inglês

· 2 min de leitura
Daniel Neto
Autor do Sonda

O Sonda mede a cobertura de linhas e de branches de uma suíte de testes PHP instrumentando o fonte, em vez de se enganchar no motor. A versão 1.16 o torna um projeto para todo mundo: a CLI, o README e este site estão em inglês, e o pacote está no Packagist como ddr/sonda.

Por que mais uma ferramenta de cobertura​

O nosso CI media a cobertura com o --path-coverage do Xdebug, o único jeito de ter branches em PHP. Numa suíte Laravel de 4.500 testes, não terminava em uma hora. O PCOV é rápido, mas só conta linhas. Queríamos "100% das linhas e dos branches do que este merge request mudou" como trava de merge, e nada dava isso no tempo do CI.

O que ele faz​

O Sonda insere uma sonda em cada desfecho de branch antes de o arquivo carregar, como o Istanbul faz no JavaScript. Uma sonda é uma atribuição num array; não há interceptação de opcodes nem enumeração de caminhos. Na mesma suíte: 178s sem cobertura, 174s com o Sonda, 671s com o Xdebug contando só linhas.

A semântica dos branches é estrita por padrão: um if sem else ainda precisa dos dois desfechos, ?-> conta o lado nulo, e &&/|| precisam curto-circuitar ao menos uma vez. A suíte inteira foi comparada com o path coverage do Xdebug, método a método; a página de comparação tem os números e as diferenças documentadas.

No CI​

sonda test --changed=origin/master mede só os arquivos que o branch mudou e reprova se qualquer linha ou branch deles ficar descoberta. --affected roda só os testes que executaram esses arquivos. O GitLab ganha de graça as anotações do Cobertura no diff e os apontamentos de Code Quality; há receitas para GitLab e GitHub Actions.

Como ter​

composer require --dev ddr/sonda
vendor/bin/sonda test

PHP 8.4+, PHPUnit 12 ou Pest 4. Issues e pull requests no GitHub.