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

Mutation testing : y a-t-il des trous dans votre couverture de test ?

Mutation testing : y a-t-il des trous dans votre couverture de test ?

Benjamin Cavy

January 21, 2022
Tweet

More Decks by Benjamin Cavy

Other Decks in Technology

Transcript

  1. @benjamin_cavy https://maif.github.io/ 😱 Est-ce que mes tests sont bien ?

    🤔 Comment écrire de meilleurs tests ? ❓ C’est quoi un bon test ? 😵💫 Pourquoi testons-nous ?
  2. @benjamin_cavy https://maif.github.io/ 🕵 Préciser le besoin (TDD) 🧩 Tester des

    cas difficiles à avoir en vrai 🚨 Pour assurer la non régression Pourquoi testons-nous ?
  3. @benjamin_cavy https://maif.github.io/ 📡 Vérifie qu’on a pas cassé une fonc2onnalité

    existante ⛱ Allège (un peu) la charge de revue de code 👷 Facilite l’arrivé de nouveaux développeurs ⏱ Réduit la charge de tests “manuels” Non régression : c’est cool
  4. @benjamin_cavy https://maif.github.io/ 😀 Indique quelles lignes de codes sont exécutées

    par les tests… ☹ … mais ne garan2t en aucun cas leur bon fonc2onnement 😭 est très (trop ? ) aimé, mais mal compris des non-techniciens Code coverage : le faux-ami ?
  5. @benjamin_cavy https://maif.github.io/ 💡En les exécutant sur du code contenant des

    régressions ! 🤔 Comment s’assurer que nos tests détectent les régressions ?
  6. @benjamin_cavy https://maif.github.io/ 🧟 Créé des versions “mutantes” du code testé

    en le modifiant 🔫 Exécute les tests unitaires et vérifie qu’ils échouent 📈 Le taux de mutant faisant échouer les tests indique la sensibilité aux régressions de vos tests Mutation testing a.k.a. le collègue qui pète tout
  7. @benjamin_cavy https://maif.github.io/ Conclusion Cool Moins cool ✅ Complète le code

    coverage ✅ Permet de détecter les angles morts dans les tests ✅ Bien si beaucoup de mé8er ✅ Intégrable sans effort ✅ Très configurable ❌ Lents si les tests sont lents ❌ Attention à l’intégration à la CI ❌ Effort d’analyse sur les résultats
  8. @benjamin_cavy https://maif.github.io/ Faut-il tuer tous les mutants ? Les sournoises

    mutations équivalentes int i = 2; if(i >= 1) { //... } int i = 2; if(i > 1) { //... }
  9. @benjamin_cavy https://maif.github.io/ Exemple sur un « gros » projet ================================================================================

    - Timings ================================================================================ > scan classpath : < 1 second > coverage and dependency analysis : 56 seconds > build mutation tests : 5 seconds > run mutation analysis : 4 hours, 7 minutes and 25 seconds -------------------------------------------------------------------------------- > Total : 4 hours, 8 minutes and 27 seconds -------------------------------------------------------------------------------- ================================================================================ - Statistics ================================================================================ >> Generated 15727 mutations Killed 5257 (33%) >> Ran 17646 tests (1.12 tests per mutation)
  10. @benjamin_cavy https://maif.github.io/ Exemple sur un « gros » projet ================================================================================

    - Timings ================================================================================ > scan classpath : < 1 second > coverage and dependency analysis : 1 minutes and 5 seconds > build mutation tests : 26 seconds > run mutation analysis : 38 seconds -------------------------------------------------------------------------------- > Total : 2 minutes and 11 seconds -------------------------------------------------------------------------------- ================================================================================ - Statistics ================================================================================ >> Generated 15727 mutations Killed 5484 (35%) >> Ran 0 tests (0 tests per mutation)
  11. @benjamin_cavy https://maif.github.io/ Pour les autres langages ✅ JavaScript, C# &

    Scala : Stryker ✅ PHP : infection ✅ Python : mutmut … et plein d’autres