Upgrade to Pro — share decks privately, control downloads, hide ads and more …

La couverture de code : un indicateur melon d'eau ?

La couverture de code : un indicateur melon d'eau ?

Un melon d'eau, c'est vert à l'extérieur et rouge à l'intérieur. La couverture de code par les tests, ça peut être la même chose : on a un beau score élevé de couverture, mais on a toujours des défauts déployés régulièrement en production malgré tout.

En bref, un faux sentiment de sécurité de l'extérieur, et quand on creuse, on a à l'intérieur des tests automatisés qui ne vérifient pas assez de choses concrètement.

Dans cette conférence, je vous expliquerai en quoi la couverture de code est un indicateur de non-qualité et que des outils comme les tests de mutation peuvent mesurer l'efficacité réelle des tests, afin de produire une métrique fiable sur la qualité et la pertinence de vos tests automatisés.

Damien Beaufils

June 01, 2022
Tweet

More Decks by Damien Beaufils

Other Decks in Programming

Transcript

  1. La couverture de code, un indicateur melon d’eau ? Damien

    Beaufils #WAQ22
  2. #WAQ22 damienbeaufils.dev QUI SUIS-JE ? Damien Beaufils Développeur logiciel depuis

    15+ ans damienbeaufils.dev Présentement Directeur Technique et Consultant Senior chez zenika.ca
  3. #WAQ22 damienbeaufils.dev OBJECTIFS DE CETTE CONFÉRENCE En quoi la couverture

    de code est un indicateur de non-qualité ? Comment mesurer l'efficacité réelle des tests avec les tests de mutation ?
  4. #WAQ22 damienbeaufils.dev IL ÉTAIT UNE FOIS… Désormais, tous les projets

    doivent avoir un score minimum de 80% de couverture de code pour passer en production !
  5. #WAQ22 damienbeaufils.dev DES INDICATEURS EN BONNE SANTÉ

  6. #WAQ22 damienbeaufils.dev QUELQUES MOIS PLUS TARD On a de plus

    en plus de régressions à chaque nouvelle release, comment est-ce possible ?!
  7. #WAQ22 damienbeaufils.dev LA LOI DE GOODHART « Lorsqu'une mesure devient

    un objectif, elle cesse d'être une bonne mesure » Charles A. E. Goodhart
  8. #WAQ22 damienbeaufils.dev LES INDICATEURS MELON D’EAU : VERT À L’EXTÉRIEUR

  9. #WAQ22 damienbeaufils.dev LES INDICATEURS MELON D’EAU : ROUGE À L’INTÉRIEUR

  10. #WAQ22 damienbeaufils.dev

  11. #WAQ22 damienbeaufils.dev QU’EST-CE QUE LA COUVERTURE DE CODE ? «

    La couverture de code est une mesure utilisée pour décrire le taux de code source exécuté d'un programme quand une suite de test est lancée » Wikipedia Exemple de fonction ayant un score de couverture de code à 100%
  12. #WAQ22 damienbeaufils.dev UN INDICATEUR FIABLE ? La couverture de code

    est-elle vraiment un indicateur de qualité ? Démo !
  13. #WAQ22 damienbeaufils.dev

  14. #WAQ22 damienbeaufils.dev

  15. #WAQ22 damienbeaufils.dev

  16. #WAQ22 damienbeaufils.dev

  17. #WAQ22 damienbeaufils.dev UN INDICATEUR DE NON-QUALITÉ • La seule information

    utile dans la couverture de code, c’est le code non-couvert. • La seule vérité d’un score de couverture de code à 83%, c’est qu’il y a 17% de code non testé. • Vous ne pouvez pas faire confiance aux 83%. Mais alors, comment s’assurer de la pertinence et l’efficacité réelle de nos tests automatisés ?
  18. #WAQ22 damienbeaufils.dev DES MUTANTS

  19. #WAQ22 damienbeaufils.dev LES TESTS DE MUTATION « Les tests de

    mutation sont utilisés pour concevoir de nouveaux tests logiciels et évaluer la qualité des tests logiciels existants. » Wikipedia Fonctionnement (simplifié) : 1. Identifier du code “de production" et le faire muter 2. Lancer les tests 3. Vérifier qu’il y a bien au moins 1 test qui échoue Le résultat de la dernière étape permet de constituer un score de mutation.
  20. #WAQ22 damienbeaufils.dev MAIS C’EST QUOI UNE MUTATION ? if (a)

    if (a && b) if (a > b) if (a === b) callMethod(argument) callMethod(argument) return myValue return myValue ... if (true) ou if (false) if (a || b) if (a < b) if (a !== b) callMethod(null) // callMethod(argument) return null throw new Exception() ... ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒
  21. #WAQ22 damienbeaufils.dev OUTILS EXISTANTS Java PITest (pitest.org) JavaScript & TypeScript

    Stryker (stryker-mutator.io) PHP Infection (infection.github.io) Liste complète d’outils : theofidry/awesome-mutation-testing Démo !
  22. #WAQ22 damienbeaufils.dev

  23. #WAQ22 damienbeaufils.dev

  24. #WAQ22 damienbeaufils.dev

  25. #WAQ22 damienbeaufils.dev

  26. #WAQ22 damienbeaufils.dev

  27. #WAQ22 damienbeaufils.dev

  28. #WAQ22 damienbeaufils.dev

  29. #WAQ22 damienbeaufils.dev

  30. #WAQ22 damienbeaufils.dev

  31. #WAQ22 damienbeaufils.dev

  32. #WAQ22 damienbeaufils.dev

  33. #WAQ22 damienbeaufils.dev

  34. #WAQ22 damienbeaufils.dev

  35. #WAQ22 damienbeaufils.dev

  36. #WAQ22 damienbeaufils.dev À QUEL MOMENT L’UTILISER ? Utilisations possibles :

    • Le lancer 1 fois par jour (par exemple la nuit) sur votre base de code pour avoir des indicateurs à jour le lendemain matin • Le lancer sur un module spécifique quand une fonctionnalité est terminée afin de vérifier la pertinence des tests écrits • Le lancer sur du code legacy comportant quelques tests dont on doute de la fiabilité L’objectif n’est pas d’atteindre 100%, mais de se poser des questions
  37. #WAQ22 damienbeaufils.dev L’IMPACT SUR LES PRATIQUES DE TESTS D’UNE ÉQUIPE

    Étude de Google sur 6 ans visant à répondre à 4 questions : • Quel est l’impact de l’utilisation continue de tests de mutation sur la quantité de tests écrits par les développeurs ? • Quel est l’impact de l’utilisation continue de tests de mutation sur la qualité des tests écrits par les développeurs ? • Quelle est la proportion de mutations générées qui sont réellement reliées à de vraies erreurs et défauts ? • Une ligne de code pouvant être la source de plusieurs mutations, quel est l’impact de traiter une seule mutation maximum par ligne ?
  38. #WAQ22 damienbeaufils.dev L’IMPACT SUR LES PRATIQUES DE TESTS D’UNE ÉQUIPE

    • Les développeurs exposés aux mutations générées écrivent plus de tests automatisés, et les tests écrits sont plus pertinents et efficaces • 70% moins de bugs en production comparé à des projets n’utilisant pas de tests de mutation • Traiter une mutation par ligne permet, dans la grande majorité des cas, de couvrir toutes les mutations possibles d’une ligne Does mutation testing improve testing practices? Publication du 12 mars 2021
  39. #WAQ22 damienbeaufils.dev

  40. #WAQ22 damienbeaufils.dev EN CONCLUSION • La couverture de code est

    un indicateur de non-qualité, utile pour trouver le code non testé • Le score de mutation est un indicateur fiable pour mesurer l’efficacité et la pertinence des tests automatisés • L’introduction des tests de mutation ont un impact positif sur la quantité et la qualité des tests écrits par l’équipe
  41. MERCI #WAQ22 !