$30 off During Our Annual Pro Sale. View Details »

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/
    Mutation testing
    Y a-t-il des trous dans votre couverture de test ?

    View Slide

  2. @benjamin_cavy
    https://maif.github.io/
    Benjamin Cavy
    Dev à la MAIF (on recrute 😉)
    https://maif.github.io/

    View Slide

  3. @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 ?

    View Slide

  4. @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 ?

    View Slide

  5. @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

    View Slide

  6. @benjamin_cavy
    https://maif.github.io/
    🤷 Le code coverage ?
    🤔 Comment s’assurer que nos tests
    détectent les régressions ?

    View Slide

  7. @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 ?

    View Slide

  8. @benjamin_cavy
    https://maif.github.io/
    🧩 Le code coverage ?
    🤔 Comment s’assurer que nos tests
    détectent les régressions ?

    View Slide

  9. @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 ?

    View Slide

  10. @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

    View Slide

  11. @benjamin_cavy
    https://maif.github.io/
    🧬 Créons des mutants
    Pitest

    View Slide

  12. @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

    View Slide

  13. @benjamin_cavy
    https://maif.github.io/
    Merci de votre a0en1on
    https://pitest.org/

    View Slide

  14. @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) {
    //...
    }

    View Slide

  15. @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)

    View Slide

  16. @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)

    View Slide

  17. @benjamin_cavy
    https://maif.github.io/
    Pour les autres langages
    ✅ JavaScript, C# & Scala : Stryker
    ✅ PHP : infection
    ✅ Python : mutmut
    … et plein d’autres

    View Slide