Phpunit PR coverage check

https://github.com/orbeji/phpunit-pr-coverage-check

Aquest és un projecte que he fet per a poder veure de manera ràpida si una Pull Request ha fet tots els tests necessaris.

Fins ara hem fet servir https://github.com/richardregeer/phpunit-coverage-check el qual et diu quin % en total tens del codi cobert i falla si no arriba al % indicat.

El problema que teníem amb això és que moltes vegades es quedava un petit % sense cobrir i de cop i volta quan creaves una nova PR fallava perquè s’havia anat acumulant una pèrdua de % de coverage. Així tot i que la teva PR estigues amb els tests correctes aquest check fallava.

En projectes on tenim el coverage al màxim no és problema, però en projectes heretats on el % de codi cobert pels tests no és el que ens agradaria ens passa recurrentment.

Així doncs, vaig decidir crear aquesta eina la qual només es fixa en el codi modificat en la PR per comprovar si el % de coverage és l’adequat.

vendor/bin/pr-coverage-check check clover.xml 100 --diff=diff.txt --report=ansi

Igual que a l’eina de richardregeer també se li pot especificar el % de coverage requerit. Realment crec que l’únic valor adequat és el 100 i així ho tinc configurat al meu entorn, ja que si algú presenta una PR amb un codi sense test no s’hauria d’acceptar. Si el codi sense test és perquè, pel motiu que sigui, no és possible de testejar llavors un @coverageIgnore és més que justificat. De totes maneres he deixat la possibilitat de baixar el % per si algú no coincideix amb aquesta manera de pensar.

Com funciona?

L’eina bàsicament té dues entrades: el fitxer de coverage i el diff amb els canvis de la PR. El fitxer de coverage l’obtenim d’executar els tests i guardar-nos l’informe, per exemple:

vendor/bin/phpunit --configuration phpunit.xml.dist --testsuite pipelines --coverage-clover 'clover.xml'

I per a obtenir el diff:

git diff origin/main...origin/feature/lamevapr > diff.txt

Per a obtenir el diff la comanda git pot variar una mica depenent de com sigui el vostre flux de treball.

Quan es genera el diff entre dues branques es pot fer de dues maneres:

Diff amb 3 punts

En aquest cas es comparen els canvis amb el punt on es va fer la branca. Si en el vostre fluxe fer merge de main en el punt més recent llavors en executar l’eina d’aquesta manera s’interpretarien els canvis externs com a propis. Aquesta opció no és apropiada en aquest cas.

Diff amb dos punts

En aquest cas es comparen els canvis de la nostra branca amb els canvis més recents de la branca destí. Si hem fet merge de develop a la nostra branca llavors en comparar s’obtindran els canvis correctes.

Funcionament alternatiu

En lloc de proporcionar el fitxer diff també es pot obtenir directament a través de les APIs de GitHub o Bitbucket.

En aquest cas la comanda quedaria més o menys així:

vendor/bin/pr-coverage-check check clover.xml 100 --pullrequest-id=1 --provider=Github --workspace=orbeji --repository=test --api_token=API_TOKEN 

El motiu d’aquest flux alternatiu és simplement que volia experimentar amb les APIs de GitHub i Bitbucket. Ambdues APIs et permeten obtenir el diff de la Pullrequest indicada així que en lloc de calcular prèviament el diff amb una comanda de Git aquest es pot obtenir directament des de l’API.

Visualització dels resultats

Quan l’eina calcula que no s’està arribant al nivell de coverage indicat, pot visualitzar quins fitxers i línies modificades no estan cobertes.

Amb l’opció –report es pot indicar quin tipus d’informe volem. La informació de l’informe sempre és la mateixa, només en canvia el format d’aquest. La informació de l’informe és: ruta del fitxer i línies sense cobrir.

Hi ha 3 tipus de format d’informe diferents:

  • ansi
  • comment
  • report

La primera opció és l’única disponible en el cas que executem el command sense la configuració de Git. Aquest informe ens mostra per consola una taula amb els fitxers modificats i les línies corresponents que no estan cobertes pels tests.

root@bbfb2d246e64:/app# bin/pr-coverage-check check tests/clover.xml 90 --diff=tests/diff.txt --report=ansi
Coverage: 40%
--------------- ------------ 
File            Uncovered Lines
--------------- ------------ 
src/Dummy.php   19, 20, 26
--------------- ------------ 

La segona opció afegeix en un comentari de la Pull Request una taula amb el fitxer i les línies sense cobrir. Aquesta opció només esta disponible si es fa servir la configuració del servei de Git.

L’últim tipus d’informe, report, només està disponible si la configuració de Git és per Bitbucket. Aquest tipus d’informe crea un report associat a la PR amb la informació del % de coverage i una anotació a les línies on fa falta coverage:

Conclusió

Aquesta eina m’està sent útil per a que el nivell de coverage es mantingui i poder veure de manera ràpida quins són els fitxers sense cobrir. La majoria de vegades els problemes que em trobo són que el creador de la PR només ha cobert el happy path i s’ha deixat tots els casos d’error. D’aquesta manera no he de descarregar-me tot el codi i veure si com a mínim els tests cobreixen tots els casos.

Com deia al principi si tens un projecte amb el coverage al màxim simplement veien que el % no baixa ja és suficient, però en projectes on encara no s’ha assolit aquest nivell màxim aquesta eina ens ajuda a almenys mantenir el nivell de coverage.