Sonda 1.16: cobertura de branches para PHP sem Xdebug, agora em inglês
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.
