ArtikelSoftware Engineering

Introductie van de Microsoft Testing Platform runner voor Stryker.NET

Wist je dat de open-source tool Stryker Mutator, inmiddels goed voor tientallen miljoenen downloads, ooit is begonnen als een afstudeeropdracht bij Info Support? Wat startte als een experimenteel project, is inmiddels uitgegroeid tot een onmisbare tool. Met Stryker.NET test je de kwaliteit van je test suite echt, door automatisch kleine foutjes (mutaties) in je code te introduceren. De ontwikkeling staat bovendien niet stil. In deze update lichten we de nieuwste ontwikkelingen rondom Stryker.NET uit, met als belangrijkste toevoeging de preview-ondersteuning voor het Microsoft Testing Platform (MTP).

Techartikel_stryker MTP_webheader

Microsoft Testing Platform runner (preview)

Stryker.NET leunt al lange tijd op VSTest als test runner. VSTest werkt prima, maar heeft een fundamentele beperking: Stryker moet voor elke mutation test run een compleet nieuw VSTest-proces opstarten. Bij grote test suites loopt die startup overhead snel in de papieren.

Microsoft heeft gebouwd aan een modern alternatief, genaamd het Microsoft Testing Platform (MTP). MTP wordt inmiddels omarmd door alle grote testing frameworks (MSTest, NUnit, en xUnit v3) en het is de enige ondersteunde runner voor nieuwere frameworks zoals TUnit. Tot nu toe konden projecten die deze frameworks gebruikten, Stryker.NET helemaal niet inzetten.

Daarom is het goed nieuws dat MTP-support nu als preview beschikbaar is in Stryker.NET 4.13.

 

Hoe schakel je het in

Je kunt de MTP runner inschakelen door --test-runner mtp mee te geven op de command line:
dotnet stryker --test-runner mtp.

Of voeg het toe aan je stryker-config.json:

Of voeg het toe aan je stryker-config.json:

{
  "stryker-config": {
    "test-runner": "mtp"
  }
}

Of in je stryker-config.yaml:

stryker-config:
test-runner: mtp

Performance voordelen

Omdat MTP is ontworpen om embedded te zijn en uitgebreid te worden, in plaats van een op zichzelf staand extern proces, kan Stryker de test runner in de lucht houden over meerdere mutation test runs heen. Dit elimineert de opstartkosten per run die VSTest traag maakten bij grotere projecten. De verwachting is dan ook dat dit een aanzienlijke performanceverbetering gaat opleveren.

 

Preview status: waar nog aan gewerkt wordt

Hoewel we erg enthousiast zijn over de verwachte performance, is het goed om te vermelden dat de MTP runner momenteel een preview feature is. Omdat we het onder de motorkap nog aan het finetunen zijn, is deze nieuwe runner wellicht nog niet voor elke projectconfiguratie de perfecte match.

Zo is coverage analysis bijvoorbeeld pas gedeeltelijk geïmplementeerd: Stryker kan al wel mutanten wegfilteren die door geen enkele test worden geraakt (covered), maar het kan nog niet individuele test cases per mutant filteren. Aan deze volledige per-test coverage analysis wordt nog gewerkt. Daarnaast ondersteunt de MTP runner op dit moment nog geen .NET Framework testprojecten (zie #3421).

We hebben jouw feedback nodig!

Omdat dit een preview feature is, is jullie feedback essentieel. Mocht je tegen problemen aanlopen of onverwachte resultaten krijgen bij het gebruik van de MTP runner, dan help je ons door een issue aan te maken op GitHub of ons een bericht te sturen via ons Slack-kanaal.

Andere noemenswaardige updates

Hier zijn de belangrijkste highlights.

Nieuwe mutators

Er zijn twee nieuwe mutatie-categorieën toegevoegd aan het arsenaal van Stryker.NET.

 

String method mutaties (stringmethod):
Stryker muteert nu veelgebruikte string manipulation methodes. Bijvoorbeeld:

Origineel Gemuteerd
ToUpper() ToLower()
ToLower() ToUpper()
Trim() ""
TrimStart() TrimEnd()
TrimEnd() TrimStart()
StartsWith() EndsWith()
EndsWith() StartsWith()
PadLeft() PadRight()
IndexOf() LastIndexOf()
Substring() ""

Deze mutaties zijn bijzonder goed in het opsporen van code waarbij de richting of casing van een string-operatie nooit daadwerkelijk is getest.

 

List pattern mutaties:
Stryker muteert nu C# list pattern syntax. Wanneer code is [...] patterns gebruikt om de structuur van een collectie te matchen, zal Stryker testen of dat pattern er daadwerkelijk toe doet door elementen te verwisselen of te verwijderen. Dit brengt mutation testing naar een moderne en steeds populairder wordende C# feature.

 

YAML config file support

Stryker configuratiebestanden kunnen nu, naast JSON, ook in YAML geschreven worden. Als je de voorkeur geeft aan YAML, maak dan simpelweg een stryker-config.yaml (of stryker-config.yml) bestand aan naast je project:

stryker-config:
  project: 'MyProject.csproj'
  reporters:
    - html
    - progress
  thresholds:
    high: 80
    low: 60

Het bestand wordt automatisch opgepikt, zonder dat er extra opties nodig zijn.

Feedback is welkom

Er valt weer genoeg te ontdekken. We zijn vooral enthousiast over de MTP runner en de deuren die dit opent voor teams die xUnit v3, de nieuwe MTP-modus van NUnit, of het uitstekende TUnit framework gebruiken. Probeer het eens uit en laat ons weten wat je ervan vindt!

Zoals altijd horen we graag jullie mening op ons Slack-kanaal of via een open issue op GitHub.