poznáme.it Testovanie Agile QA - Zabíjaním mutantov testujeme Unit testy (Java)

Agile QA – Zabíjaním mutantov testujeme Unit testy (Java)

Troška teórie na začiatok

Mutačné testovanie (alebo tiež analýza mutácií) sa používa pri návrhoch nových testov v agilnom procese vývoja softvéru. Vyhodnocuje sa nimi kvalita existujúcich Unit testov. Mutačné testovanie vyvoláva zmenu testovaného kódu, tzv. mutácie. Každá zmutovaná verzia kódu sa nazýva mutant a testy, ktoré majú za úlohu odhaliť mutantov tým, že odhalia odlišné správanie zmutovaného kódu od pôvodnej-originálnej verzie sa nazýva zabíjanie mutantov.

Testovacie suity sú potom merané percentom zabitých mutantov. Nové testy môžu byť navrhnuté aj tak, aby zabíjali ďalších možných mutantov a zároveň odhaľovali tzv. „weak tests“ – slabé testy.

Mutácie kódu sú založené na definovaní tzv. „operátorov mutácie“, ktoré buď napodobňujú typické chyby v programovaní (napríklad použitie zlého operátora alebo názvu premennej), alebo mutáciou vytvoria chyby kódu (ako je napríklad delenie nulou každého výrazu v testovanej metóde). Cieľom je pomôcť testerom a developerom vytvoriť lepšie testy, alebo nájsť nedostatky v testovacích dátach použitých pri testoch.

Krátky priklad

Majme testovaciu Java triedu (Calculator.java)

public class Calculator {
    int valueDisplayed;
    public Calculator() {
        this.valueDisplayed = 0;
    }
    public Calculator(final int initialValue) {
        this.valueDisplayed = initialValue;
    }
    public void add(final int x) {
        this.valueDisplayed += x;
    }
    public void subtract(final int x) {
        this.valueDisplayed -= x;
    }
    public void power(final int x) {
        this.valueDisplayed = (int) Math.pow(this.valueDisplayed, x);
    }
    public int getResult() {
        return this.valueDisplayed;
    }
    public void set(final int x) {
        this.valueDisplayed = x;
    }
    public boolean setConditional(final int x, final boolean yesOrNo) {
        if (yesOrNo) {
            set(x);
            return true;
        }
        else {
            return false;
        }
    }
}

… a k nej asociovanú testovaciu triedu (CalculatorTest.java)

import org.junit.Assert;
import org.junit.Test;
import Calculator;

public class CalculatorTest {
    @Test
    public void testAddition() {
        final Calculator calculator = new Calculator();
        calculator.add(2);
        Assert.assertEquals(calculator.getResult(), 2);
    }
    @Test
    public void testPower() {
        final Calculator calculator = new Calculator(2);
        calculator.power(3);
        Assert.assertEquals(calculator.getResult(), 8);
    }
    /* 
    @Test
     public void testSubtraction() {
    
     final Calculator calculator = new Calculator(5);
     calculator.subtract(4);
     Assert.assertEquals(calculator.getResult(), 1);
    
    }
    */
    
    @Test
    public void testConditionalSetTrue() {
        final Calculator calculator = new Calculator();
        Assert.assertEquals(calculator.setConditional(2, true), true);
        // Assert.assertEquals(calculator.getResult(), 2);
    }
    @Test
    public void testConditionalSetFalse() {
        final Calculator calculator = new Calculator();
        Assert.assertEquals(calculator.setConditional(3, false), false);
        // Assert.assertEquals(calculator.getResult(), 0);
    }

Po dokončení testov sa zdá, že je všetko v poriadku. Všetky testy sú „zelené“, čiže v poriadku.

Agile QA - Zabíjaním mutantov testujeme Unit testy (Java) 1

pri dôkladnejšom pohľade ale zistíme, že:

  • „Subtraction method“ nie je zahrnutá do testov
  • Metóda “setConditional” robí dve operácie súčasne. Nastavuje premennú “valueDisplayed” a jej návratová hodnota je boolean. Nastavenie premennej tiež nie je testom pokryté (weak test)

Ideálny príklad pre test Unit testov použitím mutačného testovania.

Detekcia nepokrytých a weak testov pomocou PIT frameworku

Použitím PIT  – real world mutation testing, vývojári majú možnosť rýchlo a ľahko odhaliť „weak test“ a zároveň zobraziť riadky nepokryté unit testom. Pozrime si teda PIT report:

Agile QA - Zabíjaním mutantov testujeme Unit testy (Java) 5

Ako na to? Ako použiť PIT framework v projekte pripravenom pre maven

pom.xml

<build>
    <plugins>
        <plugin>
            <groupId>org.pitest</groupId>
            <artifactId>pitest-maven</artifactId>
            <version>1.1.4</version>
            <configuration>
                <targetClasses>
                    <param>package.root.containing.classes.to.mutate*</param>
                </targetClasses>
                <targetTests>
                    <param>package.root.containing.test.classes*</param>
                </targetTests>
            </configuration>
        </plugin>
    </plugins>
</build>

maven spustíme riadkovým príkazom:

  • mvn org.pitest:pitest-maven:mutationCoverage

alebo vytvoríme „run configuration“ v Eclipse:

PIT report potom nájdeme v rámci projektu v adresári /target/pit-reports/<date>/index.html

Agile QA - Zabíjaním mutantov testujeme Unit testy (Java) 9


Dobrý článok? Chceš dostávať ďalšie?

Už viac ako 6 200 ITečkárov dostáva správy e-mailom. Nemusíš sa báť, nie každé ráno. Len občasne.



Súhlasím so spracovaním mojich osobných údajov. ( Viac informácií. )

Tvoj email neposkytneme 3tím stranám. Posielame naňho len informácie z robime.it. Kedykoľvek sa môžeš odhlásiť.

React FE Developer

Prejdi s novým projektom na remote! Ovládaš React a obzeráš sa po novom projekte? Pre medzinárodnú IT spoločnosť hľadáme...

Technical Writer / REMOTE

Si Technical Writer a hľadáš zmysluplný projekt, ktorý bude REMOTE? Teraz máš možnosť pomáhať zlepšovať kvalitu života pacientov prostredníctvom...

Junior/Medior DevOps Specialist / App pre solárne elektrárne

Ak si Junior alebo Medior DevOps Specialist, máš šancu vydať sa na cestu zvyšovania efektivity solárnych elektrární. Pracoval by...

DevOps Architect

Ak si alebo máš ambíciu stať sa DevOps Architect-om, zbystri pozornosť. Máme pre teba projekt!Pre medzinárodnú IT spoločnosť hľadáme...

.NET / Angular/ Developer – REMOTE

NET/Angular Developer má teraz príležitosť prejsť na REMOTE s novým projektom!Pre spoločnosť, ktorá patrí medzi najvýznamnejších producentov informačných systémov...

DevOps Architect

Ak si alebo máš ambíciu stať sa DevOps Architect-om, zbystri pozornosť. Máme pre teba projekt!Pre medzinárodnú IT spoločnosť hľadáme...

Fronted Developer / Aplikácie pre diabetikov

Páčila by sa Ti zmysluplná práca na produkte - aplikácií, ktorá pomáha ľuďom s tým najcennejším, čo majú -...

Bratislava Game Jam sa tento rok spojil s hernými konferenciami Game Days a Game Developers Session Praha.

Bratislava Game Jam je súťaž programátorov, scenáristov, grafikov, filozofov a ilustrátorov, ktorých...

Ako chutí tá pravá Java? Odpoveď nájdete na JavaDays 2020 ONLINE

Zaujíma vás svet Javy a všetko s ním spojené? Máte záujem načerpať...

Bratislavská coworkingová legenda The Spot ožíva

The Spot – prvý bratislavský coworkingový priestor, v ktorom vznikali a sídlili...

Čítaj ďalej:

Dobrý článok? Chceš dostávať ďalšie?

Už viac ako 6 200 ITečkárov dostáva správy e-mailom. Nemusíš sa báť, nie každé ráno. Len občasne.

Súhlasím so spracovaním mojich osobných údajov. ( Viac informácií. )

Tvoj email neposkytneme 3tím stranám. Posielame naňho len informácie z robime.it. Kedykoľvek sa môžeš odhlásiť.