Connectes-toi pour publier un commentaire.
Publié le 22/10/2020 à 18:09. Mise à jour le 22/10/2020 à 18:13.
Les tests, c'est bien, avec des rapports, c'est mieux !
Publié le 22/10/2020 à 18:09. Mise à jour le 22/10/2020 à 18:13.
Les tests, c'est bien, avec des rapports, c'est mieux !
Photo par Gabriel Sollmann sur Unsplash
Dans une pipeline d'integration continue on va au minimum exécuter des suites de tests. Mais on peut rajouter d'autres outils: analyse statique, verification de syntaxe, ...
Si l'un des job échoue, le code peut être considéré instable et on ne déploie ou ne livre pas si c'était prévu dans les stages suivants.
Dans tous les cas, ce peut être pratique de voir via l'interface de l'outil de CI ce qui a échoué, sans avoir à fouiller dans les logs de chaque job.
C'est ce qu'on va voir avec des outils PHP sur GitLab CI.
Cet article ne montre pas comment configurer ces outils mais uniquement leur integration avec GitLab.
Les artéfacts sont des fichiers ou dossiers enregistrés à la fin de l'exécution d'un job. Ils seront ensuite disponibles via l'interface GitLab pour les télécharger.
On les déclare dans la section artifacts
de chaque job.
On peut s'en servir pour enregistrer tous documents générés ou programmes construits dans un job.
Il faut noter également qu'un artéfact est automatiquement disponible dans les jobs des stages suivant celui dans lequel il a été créé.
(voir Utilisation de cache avec GitLab CI en Docker-in-Docker à la section «l'alternative save / load »)
Le fichier gitlab-ci.yml prevoit plusieurs sous sections dans artifacts
.
Une clé reports
permet de lister des rapports de test ou de qualité de code, sous laquelle on peut ajouter une clé junit
pour les rapports au format JUnit:
test_job:
artifacts:
reports:
junit:
- report.xml
Les raports de test sont collectés meme si le job échoue.
Les rapports JUnit sont des fichiers XML listant les tests exécutés. Les tests seront ensuite affichés dans l'interface GitLab dans l'onglet « Tests » des pages de pipelines.
JUnit vient de Java mais le format est largement utilisé, on fera donc exporter nos rapports sous celui-ci.
En exécutant une suite de tests, on peut demander la création d'un rapport JUnit avec l'option --log-junit
suivi d'un nom de fichier:
phpunit:
artifacts:
reports:
junit: phpunit-report.xml
script:
- ./vendor/bin/phpunit --log-junit phpunit-report.xml
Si les tests sont exécutés depuis un conteneur Docker, le rapport sera créé dans celui-ci, il faudra donc l'exporter:
phpunit:
artifacts:
reports:
junit: phpunit-report.xml
before_script:
- *docker-login
- docker run -d $DOCKER_CI_IMAGE
script:
- docker exec app ./vendor/bin/phpunit --log-junit phpunit-report.xml
after_script:
- docker cp app:/path/to/phpunit-report.xml .
Pour bien comprendre l'ancre
docker-login
et la variableDOCKER_CI_IMAGE
, voir cet article.
PHPUnit permet de générer un rapport de couverture de code (à condition d'avoir Xdebug, PCOV ou PHPDBG). GitLab est capable de récupérer ce rapport si le projet est configuré pour.
En allant dans les paramètres de CI/CD, dans le section « General Pipelines » , on retrouve une section « Test coverage parsing » avec des exemples.
Pour PHPUnit, insérer la RegEx suivante:
^\s*Lines:\s*\d+.\d+\%
Dans les jobs, on ajoutera quelques options pour générer un rapport de couverture de code en format texte:
./vendor/bin/phpunit --coverage-text --colors=never
Combinez-les avec les options du rapport JUnit !
Et si vous appréciez décorer vos README avec des badges, la section « Coverage report » apporte quelques exemples:
[![coverage report](https://gitlab.com/my-group/my-project/badges/master/coverage.svg)](https://gitlab.com/my-group/my-project/-/commits/master)
Comme pour PHPUnit, on peut générer un rapport JUnit avec PHPStan en utilisant l'option --error-format
:
phpstan:
artifacts:
reports:
junit:
- phpstan.xml
script:
- ./vendor/bin/phpstan analyse --error-format=junit --no-progress -c ./phpstan.neon > phpstan.xml
Pour PHPStan la commande reste la même si on l'exécute depuis un conteneur Docker.
Là encore, PHP_CodeSniffer permet la génération de rapport JUnit de la même manière que PHPStan, avec l'option --report
:
php_codesniffer:
artifacts:
reports:
junit:
- phpcs-report.xml
script:
- ./vendor/bin/phpcs --report=junit > phpcs-report.xml
Je n'ai présenté ici que quelques outils, vous en utilisez peut-être d'autres (Psalm, Behat, PHPSpec, ...), vérifiez donc s'ils permettent la génération de rapports JUnit !
La phase de test est importante en CI, mais elle est toujours mieux si les outils de test et d'analyse sont bien intégrés à la plateforme de CI.
Connectes-toi pour publier un commentaire.