Tests de mutation pour le code généré par des agents
Les suites de tests générées par des LLM peuvent atteindre 100 % de couverture de lignes et de branches, mais une étude récente montre qu'elles n'obtiennent que 4 % lors de tests de mutation, révélant un écart de fiabilité que les développeurs pourraient ne pas remarquer lors des revues de sprint.
Des chercheurs ont évalué des suites de tests produites par des agents de codage basés sur de grands modèles de langage sur le benchmark HumanEval-Java. Une suite couvrait chaque ligne de code et exécutait chaque branche conditionnelle. Lorsque cette même suite a été soumise à des tests de mutation — une technique qui injecte de petites fautes pour voir si les tests les détectent — elle n'a capturé qu'une infime fraction des bugs injectés.
La couverture semble bonne, mais que signifie-t-elle réellement ?
Les métriques de couverture traditionnelles comptent le nombre d'instructions ou de branches exécutées par un test. Les équipes adorent les chiffres mis en avant lors des démos de sprint. La métrique ne dit cependant rien sur la capacité des tests à échouer si le code est erroné. Les tests de mutation comblent cette lacune en introduisant délibérément des fautes (mutants) et en mesurant le pourcentage de ces mutants qui provoquent l'échec d'un test : le « score de mutation ».
Dans l'étude, la suite avec 100 % de couverture a manqué presque tous les mutants, y compris des erreurs de logique simples comme une mauvaise gestion des dates d'années bissextiles. Un score de mutation de 4 % signifie que la suite ne signalerait qu'une poignée de bugs réels.
Pourquoi cela est important pour le développement assisté par l'IA
- Fausse confiance : les développeurs peuvent accorder leur confiance à une suite de tests qui semble parfaite sur le papier.
- Défauts cachés : de nombreux bugs passent inaperçus.
- Coût de remédiation : corriger des bugs plus tard coûte bien plus cher que de les détecter tôt.
Contrepoint : la couverture n'est pas inutile
La couverture indique toujours si les chemins de code sont exécutés, mais elle ne garantit pas la détection des fautes.
À surveiller ensuite
- Intégration des outils : intégrer les tests de mutation dans les pipelines CI.
- Améliorations des LLM : entraîner les agents à générer des tests capables de tuer les mutants.
- Directives de l'industrie : adopter des normes qui associent la couverture aux scores de mutation.
À retenir : Des taux de couverture élevés provenant de tests générés par l'IA ne sont plus une preuve suffisante de qualité ; un score de mutation faible signale que les tests pourraient ne pas détecter les bugs réels, incitant les développeurs à adopter les tests de mutation comme filet de sécurité.
