GitLab peut extraire le pourcentage de couverture de tests depuis les
logs du job et l’afficher dans le badge du projet, les MR, et l’UI.
Il suffit de définir une regex dans coverage:. Et c’est là que tout
le monde se plante.
La regex qui foire systématiquement
# ❌ Ne matchera JAMAIS
job:
script: pytest --cov
coverage: '/TOTAL.*\s+(\d+%)$/'
Pourquoi ? $ veut dire “fin de ligne”. Mais les logs GitLab
sont collectés dans un buffer multi-lignes. La vraie fin de ligne
dans ce buffer, c’est la dernière ligne du log entier, pas la
ligne TOTAL.
# ✅ Matche correctement
job:
script: pytest --cov
coverage: '/TOTAL.*\s+(\d+%)/'
Sans le $, la regex matche n’importe où dans le buffer. Le %
dans (\d+%) suffit à capturer le pourcentage.
La regex qui marche pour pytest-cov
coverage: '/^TOTAL\s+\d+\s+\d+\s+(\d+)%/'
pytest-cov produit une ligne TOTAL 1234 56 95%. La regex
ci-dessus capture 95.
Autre piège : si tu as plusieurs fichiers de test, TOTAL apparaît en dernière ligne. Si ta regex capture la première occurrence d’un chiffre suivi de %, tu attrapes le pourcentage d’un fichier individuel, pas le total.
Debugger sa regex coverage
# Simuler les logs et tester la regex localement
echo "TOTAL 1234 56 95%" | grep -oP 'TOTAL.*\s+(\d+)%'
Cheatsheet des regex coverage selon l’outil
| Outil | Regex coverage |
|---|---|
| pytest-cov | '/^TOTAL\s+\d+\s+\d+\s+(\d+)%/' |
| Go | '/coverage:\s+(\d+\.\d+)% of statements/' |
| JaCoCo (Java) | '/Total.*?(\d+)%/' |
| Rust (cargo-tarpaulin) | '/coverage:\s+(\d+\.?\d+)%/' |