Outil de développement à code ouvert

crapkit

Savoir où intervenir dans le code.

crapkit croise la complexité du code, la couverture des tests et l’historique des modifications pour aider les développeurs et les agents de programmation à décider quoi améliorer en priorité.

Mon rôle
Créateur et responsable du projet
Licence
MIT
crapkit / worklist

$ crapkit worklist

classifycalc/grade.py:7
Complexité
14
Couverture des tests
50%
Score CRAP
38.5

La complexité et la couverture des tests, à l’échelle d’une fonction.

Mise en forme d’un exemple tiré de la documentation. Voir la sortie originale

Le problème de départ

Où investir
la prochaine heure de travail?

Le code peut être facile à générer, mais difficile à modifier en toute confiance. Des tests qui passent ou un taux de couverture global ne permettent pas de repérer les fonctions dont la logique complexe se conjugue à des lacunes dans les tests.

J’ai créé crapkit pour repérer ce travail à l’échelle de chaque fonction et rendre les mêmes données exploitables par les développeurs, les agents de programmation et les contrôles automatisés.

01

Mesurer chaque fonction

Combiner la complexité cyclomatique et la couverture des tests à l’aide de la métrique CRAP existante. Lorsque la couverture n’est pas disponible, présenter la complexité seule, sans laisser croire que les tests ont été mesurés.

02

Choisir où intervenir

S’appuyer sur l’historique des modifications pour établir les priorités. Une fonction complexe qui change souvent ne demande pas la même attention qu’un code rarement modifié.

03

Préserver les progrès réalisés

Enregistrer la dette technique existante comme point de départ, puis vérifier les modifications par rapport à cette référence. Le mécanisme de cliquet permet aux scores enregistrés de s’améliorer, mais les empêche d’augmenter.

Un outil qui s’intègre au travail des équipes.

Utilisez crapkit en ligne de commande, connectez un agent de programmation par MCP ou intégrez-le à un flux de travail GitHub Actions. L’analyse et le calcul des scores s’exécutent localement, sans télémétrie; les commandes de test et les autres commandes configurées conservent leur propre comportement.

Un exemple reproductible

Mesurer l’effet de tests plus complets.

Huit fonctions. Le même code. Davantage de tests aux limites.

Ce petit exemple public en Python compte au départ quatre cas de test qui réussissent. J’ai ajouté 25 cas couvrant les seuils de classement, les entrées vides, les valeurs manquantes et les branches du rapport. Le code de l’application est resté identique. Le tableau présente les mesures de crapkit avant et après cet ajout.

Cas de test réussis4 → 29
Somme des scores CRAP60,26 → 29
Fonctions au-dessus de la cible de 63 → 0

Mesuré le avec Python 3.11 sous Windows; code source et outil fixés à la révision 8ff0fab87899.

Faites défiler le tableau horizontalement pour voir toutes les mesures.

Avant et après l’ajout de tests aux limites; la complexité reste identique.
FonctionComplexitéCouverture avantCouverture aprèsCRAP avantCRAP après
grade( score )calc/grade.py30 %100 %123
summarize( rows )calc/grade.py20 %100 %62
coerce( word )calc/parse.py566,67 %100 %5,935
read_row( line , cols )calc/parse.py666,67 %100 %7,336
parse( text , cols )calc/parse.py3100 %100 %33
tally( rows , low , high )calc/report.py4100 %100 %44
render( bins , width )calc/report.py2100 %100 %22
banner( bins , total )calc/report.py40 %100 %204

Interpréter les mesures

La couverture est mesurée dans chaque fonction : couverture des branches lorsqu’il y en a, sinon couverture des lignes. CRAP combine cette proportion avec la complexité cyclomatique. Lorsque la couverture mesurée atteint 100 %, le score devient égal à la complexité; l’ajout de tests n’a donc pas simplifié le code.

Le total correspond à la somme des scores des huit fonctions, appelée crap_load dans crapkit. Il n’estime ni les heures économisées ni le nombre de tests nécessaires. La cible de 6 est le seuil configuré pour cet exemple. Le tableau arrondit les valeurs; le CSV conserve la précision des mesures.

Alberto Savoia et Bob Evans ont introduit la métrique CRAP en 2007. Ma contribution est l’outillage de crapkit pour effectuer les mesures et contrôler les changements.

La métrique d’origine et ses limites · Documentation de crapkit à cette révision

Reproduire le résultat

Téléchargez et décompressez le fichier, puis choisissez un nouvel environnement Python 3.11 ou plus récent, avec Git disponible. Installez-y les dépendances fixées dans le fichier fourni et lancez le script. Le fichier README contient les commandes pour Windows et macOS/Linux.

python -m pip install -r requirements-reproduce.txt
python reproduce.py --output results

Le script n’installe rien et refuse d’utiliser un répertoire de sortie existant. Il exécute l’exemple public fourni, ajoute les tests et compare les mesures aux valeurs publiées.

Le fichier comprend le code d’origine, les tests ajoutés, la licence MIT, le script de reproduction, les dépendances fixées et les résultats vérifiés.

Consulter le code public d’origine ↗

Les questions derrière les outils

Qu’attendons-nous
des systèmes que nous concevons?

Mes articles explorent le pouvoir d’agir, l’intention et la responsabilité. crapkit aborde un aspect concret du développement logiciel : rendre plus faciles à examiner les données qui éclairent les modifications du code.