• Home
  • About
    • Ahmed DAMMAK photo

      Ahmed DAMMAK

      Full Stack Developer

    • Learn More
    • Twitter
    • LinkedIn
    • Github
  • All Posts
  • All Tags
  • Projects

Agile Testing Night 2 - SG

25 Sep 2018

Reading time ~2 minutes

La conférence a été présentée par Benjamin HUGOT @BenjaminHugot et Nicolas CHAZEAUX.

Constat

Qualité des TU

On constate que la qualité des tests est impactée par la connaissance de l’application. En effet, notre feedback fait qu’on peut passer à côté de plusieurs tests.

Code Coverage ?

Meme si la couverture est à 100%, on risque d’avoir des bugs / effets de bord :

  • Ce n’est pas le meilleur critère pour savoir si la qualité
  • Il permet juste de voir les points qui ne sont pas lancés

Comment quantifier la qualité des tests ? ==> Mutation Testing

Mutation Testing

Il ya un framework de mutation testing qui va effectuer des mutations sémantiques.

Un mutant

  • changer une constante, une variable …
  • Supprimer / Changer une ligne de code
  • Changer les comparateur > <= …

Objectif : Il faut que les mutants soient en false. Si un mutant reste, c’est que le code n’est pas bien testé.

Outils :

  • PiTest pour faire les Mutations Tests
  • mutt en Python
  • StryKer en JS

In existe un plugin intellij.

Résulats

  • Le rapport du test est en Html.
  • On peut spécifier les méthodes testées, les mutations … Tout est configurable
  • Le rapport de coverage peut être lancé par CLI

Impact : Amélioration de la qualité de livraison

L’objectif c’est de rendre la suite de teste assez robuste.

Points négatifs

  • La couverture 100% est très difficile, et n’est pas atteignable.
  • Analyser les résultats d’analyse est compliqué
  • Prend bq de temps —> Privilégier le build de nuit

Utiles pour

  • Application testée : il faut une couverture de test assez importante (+ 75%)
  • Equipe avec Test first

Passons au code

Step 0

classe Fonctionnelle

    public class Calcul {

      protected int sommeClassique(int a, int b) {
          return  a+b ;
      }

      protected int sommePondere(int a, int b) {
          if (a < 10) {
              return a+b ;
          } else {
              return a + 2*b ;
          }
      }
    }

Classe de Test

    public class CalculShouldTest {


        private Calcul calcul;

        @Before
        public void setUp() {
            calcul = new Calcul();
        }

        @Test
        public void get_10_when_sum_classique_3_and_10() {
            assertEquals(10,calcul.sommeClassique(3,7));
        }

        @Test
        public void get_20_when_sum_pondere_12_and_4() {
            assertEquals(20,calcul.sommePondere(12,4));
        }

        @Test
        public void get_9_when_sum_pondere_5_and_4() {
            assertEquals(9,calcul.sommePondere(5,4));
        }
    }

Mutation Testing report

run command mvn clean install -DwithHistory org.pitest:pitest-maven:mutationCoverage

Vérifier les dépendences :

    <build>
        <plugins>
            <plugin>
                <groupId>org.pitest</groupId>
                <artifactId>pitest-maven</artifactId>
                <version>1.4.2</version>
                <configuration>
                    <targetClasses>
                        <param>net.dammak.mt*</param>
                    </targetClasses>
                    <targetTests>
                        <param>net.dammak.mt*</param>
                    </targetTests>
                </configuration>
            </plugin>
        </plugins>
    </build>

Le rapport généré est le suivant :

On constate ainsi qu’il y un cas qui n’a pas été testé.

Step 1

On rajoute un TU qui vérifie le changement de la valeur limite 10 de la focntion “sommePondere”:

    @Test
    public void get_18_when_sum_pondere_10_and_4() {
        assertEquals(18,calcul.sommePondere(10,4));
    }

C’esgt ainsi que le rapport passe au vert :

Le code est disponible sur mon Github.



MutationTestingAgileTDDSGAgileTestingNightMeetup