Mutation testing in .NET met Stryker Mutator

Geschreven door Sjoerd Nijhof op

Mutation testing is een manier om de kwaliteit van je unit tests te testen, met Stryker.NET gaan we kijken hoe we mutation testing kunnen toepassen in een .NET project. Verder gaan we kijken hoe we Stryker verder kunnen configureren voor productie zodat je het ook goed kan draaien op grote applicaties zonder dat het veel tijd in beslag neemt.

Wat is Mutation testing?

Mutation testing is een manier om de kwaliteit van je unit tests te testen. Voor een mutatie test wordt er een mutatie in de code doorgevoerd, ook wel een mutant genoemd. Zo zal een plus operator bijvoorbeeld worden vervangen door een min operator:

example of a mutation

Voor elke mutant die wordt aangemaakt worden alle tests uitgevoerd om te kijken of er een test mislukt. Mislukt er een test dan weet je dat deze aanpassing zal worden gedecteerd en je tests dit scenario goed af heeft gedekt. Als alle tests slagen dan weten we dat dit scenario niet gedekt is en dat we een test moeten aanpassen of een extra test moeten toevoegen om dit scenario ook te dekken.

Wat is Stryker Mutator?

Stryker Mutator is een mutation testing framework die voor jou de mutaties maakt, de tests uitvoert en kijkt hoeveel mutanten er zijn gekilled of het hebben survived. Stryker kan de resultaten op verschillende manieren tonen waaronder op een dashboard waar je een mutatiescore ziet van al je files. Stryker is beschikbaar voor verschillende talen waaronder voor JavaScript, Scala en C#.

Mutants

Een mutant is een een aanpassing in je code, waarbij er getest wordt of deze aanpassing wordt afgevangen door je tests. Stryker kan veel verschillende mutaties uitvoeren, deze kan je allemaal terugvinden in hun documentatie.

Hoe implementeer je Stryker.NET in je project

De makkelijkste manier om Stryker.NET te gebruiken in je project is door gebruik te maken van de stryker dotnet tool. Deze kan je globaal installeren of door gebruik te maken van een dotnet tool manifest voor je applicatie. Dit doe je op de volgende manier:

# create a tool manifest
dotnet new tool-manifest

# install the stryker dotnet tool
dotnet tool install dotnet-stryker

# restore the tools setup in your manifest
dotnet tool restore

Door gebruik te maken van een tool manifest kan je stryker ook makkelijk integreren in je build pipeline.

Running stryker

Wanneer je de stryker dotnet tool hebt geïnstalleerd kan je in principe het stryker commando draaien en vindt hij automatisch het project om te testen.

dotnet stryker

Als het project niet gevonden wordt kan je dit meegeven als parameter of je kan een configuratie file aanmaken waar je naar een specifiek project kan verwijzen.

Configuratie

Om stryker te configureren kan je een configuratie file aanmaken genaamd stryker-config.json of stryker-config.yaml, waarbinnen je allerlei zaken kan instellen hoe dotnet stryker gedraait moet worden, hierdoor hoef je het niet elke keer mee te geven in de command line.

Hier zie je een voorbeeld hoe een configuratie bestand er uit kan zien:

{
    "stryker-config":
    {
        "solution": "../SolutionFile.sln",
        "project": "ExampleProject.csproj"
    }
}

Resultaten

De resultaten van je stryker run worden uiteindelijk gegenereerd door een reporter. Er worden meerdere type reporters ondersteund, er worden ook twee standaard reporters, dit zijn de html en progress reporters

Als je een specifieke reporter wil gebruiken kan je die op de volgende manier meegeven

dotnet stryker --reporter "progress"

De meer info over de andere reporters is terug te vinden op de website van Stryker.

Pipeline

Omdat je als het goed is ook tijdens je build je mutation tests zal gaan draaien, is het fijn als je daar gemakkelijk je resultaten van kan inzien. Hier biedt Stryker dan ook een extension voor Azure DevOps aan genaamd Mutation Report Publisher. Hierna kan je door een simpele stap in je YAML pipeline toe te voegen je test rapport publishen welke daarna dan gemakkelijk is in te zien.

Devops mutation report

Performance

Als je codebase groter wordt zullen er steeds meer mutaties gemaakt worden, wat zal resulteren in nog meer test runs. Om ervoor te zorgen dat je builds niet te lang gaan duren heb je de mogelijkheid om alleen de mutaties te testen van de files die zijn aangepast. Hiervoor kan je gebruik maken van de since flag.

Door gebruik te maken van de since flag zal je alleen een report krijgen waar alleen de gedraaide tests in te zien zijn. Wil je nu elke keer wel het gehele rapport zien kan je gebruik maken van de baseline flag, deze flag gebruikt onder water ook de since flag maar vult het rapport aan met de resultaten van de tests die al eerder gedraait zijn. Dit doet hij door een baseline file te maken welke je op verschillende manieren kan opslaan.

← Terug
XPRTZ