Richard de Zwart, 26-07-2017
Ik ben echt dol op Test Driven Development. Sterker nog, ik kan me geen (werkend) leven voorstellen zonder unit testen. Als ik geen test suite heb die me vertrouwen geeft, hoe kan ik dan ooit mijn code refactoren om de onderhoudbaarheid te verhogen –en ondertussen zeker weten dat ik niks kapot maak?
Het werkt. Als je de juiste packages installeert en wegblijft van .NET Core of het nieuwe CSPROJ formaat.
Update VS2017 15.3 en 15.4: het werkt nog beter! Er is nu ook ondersteuning voor .NET Core.
Helaas heeft Visual Studio nooit echt goede ondersteuning geboden voor unit testen, laat staan voor TDD. Om een beetje fatsoenlijk TDD te kunnen doen heb je een test-runner nodig die snel en bij voorkeur continue draait. Om dat te kunnen doen in Visual Studio gebruik ik al jaren NCrunch. Het is een plugin die voortdurend je code compileert en je testen draait. Daarnaast geeft het je per regel informatie over de coverage van je code: is er uberhaupt coverage? Gecovered door een falende test? Gecovered door een geslaagde test?
Tijdens het debuggen wordt daar nog eens timing aan toegevoegd voor elke regel. Het is een heel plezierige ervaring. Terwijl je je test schrijft begint Ncrunch te compileren en zodra je code compileert heb je een falende test. Rode fase compleet, door naar de groene fase! En terwijl je je implementatie schrijft zie je direct een groene bal verschijnen zodra je genoeg code hebt geschreven om de test te laten slagen. Door naar de refactor fase! Uncle Bob zal trots op je zijn…
Toegegeven, je kunt unit testen draaien. Je kunt zelfs niet-Microsoft frameworks zoals NUnit en xUnit gebruiken als je de juiste adapters installeert. Maar het resultaat is niet veel meer dan dit:
Een lijst van geslaagde en falende testen. Geen zinvolle manier om je testen te organiseren, zoals met een tree-view die je op het nivo van classes of assemblies laat open- en dichtklappen.
En elke keer dat je je testen wilt draaien moet je wachten op een volledige build, zelfs als je net nog gebuild en gerund hebt. Dat verhoogt de drempel om je testen te draaien zodanig dat je ze steeds minder gaat draaien. En als je je testen niet meer draait dan verliezen ze alle waarde als vangnet.
Als je Resharper gebruikt (en dat moet je sowieso doen), dan ben je iets beter af. Het lijkt alsof je testen eerder starten en sneller draaien. Maar je moet er nog steeds aan denken om ze te starten. En nee, “run after each build” is geen alternatief, omdat het build process dat volgt je hele Visual Studio blokkeert.
VS2017 heeft iets dat Microsoft “Live Unit Testing” noemt. Het is in essentie hetzelfde als wat Ncrunch doet: build en run terwijl je je code schrijft. En het voegt ook tekentjes toe aan elke regel code om te laten zien of deze gecovered/geslaagd/gefaald is.
Als je op zo’n X of V klikt dan krijg je een overzicht welke testen voor coverage van deze regel code zorgen.
Nou, om te beginnen heb je Visual Studio 2017 Enterprise Edition nodig. Ik hoop echt dat Live Unit Testing uiteindelijk ook beschikbaar komt voor de Community Edition van VS2017. Het is zo belangrijk dat de drempel voor TDD zo laag mogelijk is. Microsoft zou daar een mooie bijdrage aan kunnen leveren door Live Unit Testing voor iedereen beschikbaar te maken.
Vervolgens ga je in het menu naar Test > Live Unit Testing > Start.
And then (zoals in het Heineken spotje), we wait. Hoe weet je of het werkt? Nou, het kan even duren voordat je dat doorhebt. Je moet het Output Window open hebben:
En zoals je kunt zien, gaat het in mijn geval fout. Daarover straks meer…
Bij grotere projecten kan het even duren voordat de streepjes, vinkjes en kruisjes (sympatieke keuze voor kleurenblinde programmeurs) tevoorschijn komen. Eigenlijk komen de streepjes (geen dekking) vrij snel, ook bij code waarvoor wel dekking is. Uiteindelijk veranderen ze wel in kruisjes en vinkjes; een beetje verwarrend in het begin, maar je went er wel aan.
Uiteindelijk wordt het Test Explorer Window ook bijgewerkt.
Nog steeds dezelfde view, maar gelukkig is in VS2017 15.2 dit window in sync met je Live Unit Testen. Daarvoor waren het twee volkomen naast elkaar levende systemen.
Als je begint met “Add new project”, “Unit Test” enzovoorts –zoals je in de meeste voorbeelden ziet- werkt alles natuurlijk meteen, right out of the box. Maar als je al een class library met testen hebt, misschien met Nunit testen, en je wilt profiteren van Live Unit Testen dan krijg je bovenstaande foutmelding om je oren.
Je moet de juiste adapters installeren, zelfs voor MsTest gebaseerde testen. Dat is ok, het hoort bij het moderne Microsoft dat zegt: „Je moet zelf weten wat je wilt gebruiken, het is jouw keuze“.
Als je testen hebt met MsTest moet je er wel even aan denken de referentie naar de oude Microsoft.VisualStudio.QualityTools.UnitTestFramework weg te halen.
MsTest: https://www.nuget.org/packages/MSTest.TestFramework/1.1.18 en https://www.nuget.org/packages/MSTest.TestAdapter/1.1.18
NUnit: https://www.nuget.org/packages/NUnit3TestAdapter
xUnit: https://www.nuget.org/packages/xunit/2.2.0 en https://www.nuget.org/packages/xunit.runner.visualstudio/2.3.0-beta3-build3705
Zodra je de adapter van je keuze hebt geinstalleerd beginnen de blauwe streepjes tevoorschijn te komen en (afhankelijk van je code-coverage natuurlijk…) te veranderen in rode kruisjes en groene vinkjes. Nu kun je de Red-Green-Refactor cyclus in met onmiddellijke feedback!
Ja, uiteraard. Ik ook. Maar helaas Visual Studio vertelt je dat .NET Core nog niet ondersteund wordt in versie 15.2. De belofte is dat het in VS2017 15.3 komt, dus hopelijk komt die heel snel.Tot die tijd, als je geen bezwaar hebt om de command-line te gebruiken, kun je een referentie opnemen naar de DotNet Watcher Tools die bij elke file wijziging “dotnet test” voor je draait.
Update 22-10-2017: Inmiddels zijn zowel 15.3 en 15.4 beschikbaar. Daar is de ondersteuning voor .NET Core helemaal in orde. Het is zelfs zo dat versie 15.4 bij het openen van een Solution iets roept van “Er zijn unit-testen aanwezig, wil je Live Unit Testen proberen?”.
O, zeker! Heb je al gezien hoe je CSPROJ opgeruimd kan worden als je een paar simpele stappen volgt zoals Nate McMaster laat zien? Het werkt met je gewone .NET Full projecten! Je kunt de packages.config weggooien en je krijgt spontaan edit support in je Solution Explorer zonder dat je het project eerst hoeft te unload-en. Het nieuwe formaat is zoveel schoner en duidelijker.
MAAR. Live Unit Test kan nog niet overweg met het nieuwe formaat. Het besluit dat het “.NET Core” is en niet gebruikt kan worden. Nu maar hopen dat het in VS2017 15.3 wel gaat werken…
Richard is in 2016 bij Get There in dienst gekomen.