parallax background image

Gebruik van fakes, stubs en shims

Gepubliceerd op 14 augustus 2018 Leestijd : 3 minuten

Unit tests zijn zeer handig om je applicatie te testen en er zeker van te zijn dat je code werkt zoals verwacht. De naam unit tests komt voort uit het idee dat de test zo geschreven zijn dat er maar één enkel deel, één enkele unit van de code getest wordt. Dit wordt behaald door afhankelijkheden van de unit te elimineren. Dit kan gaan om bijvoorbeeld een database waar de unit data uit ophaalt of een formulier in de userinterface waar data uit voortkomt.
 
Waarom wordt er maar één unit getest? Als er een fout optreedt, kan er met zekerheid gezegd worden dat deze wordt veroorzaakt door de unit die getest wordt. Het kan dan niet liggen aan bijvoorbeeld een connectie met een database die verloren is gegaan.

Binnen .Net kunnen Fakes gebruikt worden om units te isoleren. Er zijn twee soorten fakes, stubs en shims.

Stubs

Om stubs te kunnen gebruiken, moet de applicatie zo zijn ingericht dat het interfaces gebruikt en geen classes. Een stub vervangt namelijk een class door dezelfde interface te implementeren als de class. Een voordeel van een stub is dat de stub altijd dezelfde data teruggeeft. Hierdoor kunnen er gemakkelijk tests geschreven worden. Een ander voordeel is dat de unit al getest kan worden, ook al is een ander component van de applicatie nog niet af.
Een voorbeeld van het gebruik van een stub: stel, de applicatie bevat een unit waarvoor er een test geschreven moet worden, StockAnalyzer. StockAnalyzer maakt gebruik van data uit het component RealStockFeed. RealStockFeed geeft altijd andere data terug, waardoor het moeilijk is om een test te schrijven. In dit geval kan er gebruik gemaakt worden van een stub om RealStockFeed te vervangen, StubStockFeed. Doordat StubStockFeed altijd dezelfde data teruggeeft, kan er gemakkelijk een test geschreven worden voor de unit StockAnalyzer. Door het gebruik van de StubStockFeed is de class StockAnalyzer niet meer afhankelijk van RealStockFeed en kan StockAnalyzer als onafhankelijke unit getest worden.

Stubs worden dus gebruikt om een deel van de applicatie (StockAnalyzer) te scheiden van een ander deel (RealStockFeed). Beide delen bevinden zich in hetzelfde project en kunnen beĂŻnvloed worden. Het kan ook voorkomen dat een class zich niet in het project bevindt en dus ook niet beĂŻnvloedbaar is, zoals een functie uit System.dll. Als een unit die van een dergelijke functie gebruik maakt, wilt scheiden en onafhankelijk wil maken, dan gebruik je shims.

Shims

Shims worden gebruikt om de unit te scheiden van componenten die niet onder de applicatie zelf vallen, zoals een functie uit System.dll of een API van een derde partij zonder testomgeving. Ook worden shims gebruikt voor classes die private, static of internal zijn. Kortom, classes en functies die niet aanpasbaar zijn.
Neem als voorbeeld DateTime.Now(). Dit deel code is afhankelijk van de lokale instellingen van de gebruiker. In plaats van DateTime.Now() wordt de shim aangeroepen, net als in het voorbeeld niet RealStockFeed maar StubStockFeed wordt aangeroepen. De shim geeft bij elke aanroep dezelfde datum en tijd terug, net als een stub. Hierdoor kunnen er makkelijk tests geschreven worden en is de afhankelijkheid opgeheven.

Stubs en shims maken het unit testen van een applicatie mogelijk door afhankelijkheden te vervangen en weg te nemen. Beiden geven bij elke aanroep dezelfde data terug, waardoor het makkelijker wordt om een test te schrijven. Stubs worden gebruikt als vervanging voor code binnen de applicatie, code die beĂŻnvloedbaar is. Shims worden gebruikt voor code die buiten de applicatie valt, code die niet beĂŻnvloedbaar is (internal of private classes bijvoorbeeld).

Onze klanten
Onze oplossingen