Test-frameworks zoals MSTest, NUnit, XUnit, TypeMock, NCover, Resharper

Ingediend door Dirk Hornstra op 31-mar-2021 20:58

In podcast 112 van Scott Hanselman (link) komen "Unit Testing Frameworks" voorbij. Bij die post gaf ik aan dat ik eigenlijk nooit testprojecten aanmaakte omdat het "te ingewikkeld/teveel tijd zou kosten" en dat ik dan al gauw een console-applicatie maakte om het te testen. Inmiddels maak ik vaak gebruik van het MSTest framework, dat is niet zoveel werk. Nieuw project, type MSTest, class toevoegen en die het attribuut [TestClass]  meegeven, functies daarin maken met attribuut [TestMethod] en vervolgens runnen en/of debuggen. Recent nog nodig gehad voor een applicatie die we gebruiken om websites te deployen. Zowel met een mock-type als met een versie op een localhost-omgeving.

Maar er zijn meer test-frameworks. In die aflevering werden een aantal benoemd, dus laat ik die stuk voor stuk langs lopen.

NUnit

NUnit heeft een eigen website (link) en de source-code staat ook op Github (link). En de documentatie staat hier: link. Voordat ik dit allemaal ga doorlezen en testen, eerst maar eens door met de andere frameworks.

XUnit

De website van XUnit is hier te bekijken: link. Ik lees hier dat de maker van NUnit 2 dit project heeft opgestart en dat XUnit onderdeel uitmaakt van de .NET Foundation. Dat geeft wel vertrouwen. Ook van dit project staat de source-code op Github (link). De getting-started is duidelijk, korte teksten + screenshots. Omdat ik zelf meestal binnen Visual Studio mijn werk doe, kun je deze link als beginpunt pakken: link. Doe je "je ding" meer in de console, dan kun je het beste hier beginnen: link.

TypeMock

De website van TypeMock is hier te bekijken: link. Dit is een betaald product, de vraag is of je dat gaat gebruiken of zelf dingen gaat "mocken". Zo heb ik voor een intern project waarin we te maken hebben met Active Directory en IIS zelf classes gemaakt die deze dingen "mocken", dus net doen alsof ze een AD of IIS zijn. Maar goed, vaak genoeg loop je tegen code aan, waarbij er de aanname gedaan is dat je via HTTP de functie aanroept: en dat er dus een HttpContext met cookies e.d. beschikbaar is. Als je die functies aanroept vanuit een test-applicatie (vergelijkbaar met een console), dan is die HttpContext gelijk aan null en als er dan acties op uitgevoerd worden, dan crasht je applicatie en kun je dus niet fatsoenlijk testen. Volgens de site kunnen zij veel dingen "mocken" en hoef je dus niet de (legacy) code aan te passen om je testen wel te laten werken. Dat klinkt goed!

NCover

De website van NCover is hier te bekijken: link. Dit is een betaald product. Maar als in de footer een copyright van 2016 staat en op de pagina van "System Requirements" als hoogste .NET versie 4.5 genoemd wordt en over Visual Studio 2015 (terwijl we nu op versie 2019 zitten) lijkt me dat er niet zoveel meer met deze tool gedaan wordt. Wel zonde, want de screenshots zien er prima uit. Hoe "ingewikkeld" is je code, hoeveel modules, hoeveel van je code wordt getest? Als alternatief zou je misschien coverlet kunnen gebruiken, wat ik in een eerder blog-item genoemd heb: link.

Resharper

De website van Resharper is hier te bekijken: link. Het is een betaald product, maar je kunt via de site eerst een 30-dagen-versie downloaden en installeren. Ik gebruik deze tool op mijn werk. Soms werkt het wat minder fijn, omdat Visual Studio "lijkt te hangen" en er dan als tip komt dat Resharper 5 seconden lang "iets aan het doen is". Maar dat weegt niet op tegen de voordelen die deze tool brengt.

Ik heb het idee dat ik er nog te weinig mee doe, maar wat de tool me biedt, dat gebruik ik graag. Zou biedt het (kortere) alternatieven.


var frieseGast = dbContext.Persons.Where(rec => rec.city == "Leeuwarden").FirstOrDefault();
// Resharper zegt, maak dit er maar van:
var frieseGast = dbContext.Persons.FirstOrDefault(rec => rec.city == "Leeuwarden");

We gebruiken een eigen nuget-library, maar natuurlijk ook andere nuget-packages. Soms gebeurt daar iets, waarvan je wilt weten wat er gebeurt. Met Resharper kun je die DLL decompilen en in die "black-box" duiken.

FX Cop

In het verleden zaten bij projecten wel eens FX Cop bestanden als ik me niet vergis. Maar dat werd weggehaald en niet meer gebruikt, waarschijnlijk teveel gedoe of om andere redenen (dat je zaken moest instellen omdat de boel niet wilde builden of iets dergelijks). Aan de andere kant is dat wel jammer, want je kon hier bepaalde regels instellen waar je code aan moet voldoen. Bij mijn zoekactie naar FX Cop lijkt het erop dat FX Cop er niet meer is, we hebben nu de Source Code Analyzers, waar Microsoft hier een uitgebreide toelichting op geeft: link. Je kunt bijvoorbeeld een warning ophogen naar dat het een error wordt. Dat is wel een coole feature, want ik heb wel eens gehad dat een project wilde builden, maar op de live-omgeving er een DLL miste en de applicatie dus niet wilde starten. Als ik me niet vergis werd dat als een warning getoond. Dat scenario is ernstig genoeg om er een error van te maken.

Op deze pagina worden ook andere tools genoemd die je via Nuget kunt installeren in je project: StyleCop.Analyzers (link), Roslynator.Analyzers (link), xUnit.Analyzers (link) en SonarAnalyzer.CSharp (link).

Conclusie:

In een volgend project wat ik van scratch op ga zetten, ga ik met XUnit aan de slag. En ook kijken of ik een aantal van die Analyzers kan gebruiken om mijn code beter en veiliger te maken. Op mijn werk ga ik kijken wat ik nog meer met Resharper kan doen.