Testen in een net wat mooiere omgeving, maak jij je omgeving ook zelf?

Onlangs gaf ik (André Koene) een workshop over het virtualiseren van services met Wiremock ter ondersteuning van het geautomatiseerd testen van omgevingen waarin interacties plaatsvinden met Rest Api’s. In deze blog neem ik jullie kort mee in mijn laatste vakantie, afgelopen maart 2023 door Marokko, en vertel ik hoe ik de op deze pagina getoonde vakantiekiekjes gebruikte als metafoor en introductie voor het testen van Api’s met Wiremock.

Een introductie

Deze foto was een ideale manier om mijzelf te introduceren, want ik ben niet alleen test automation geek, maar heb ook een grote passie voor het actieve buitenleven. Ik kon het dan ook niet laten om een beetje sluipreclame te maken, door naar mijn persoonlijke introductie op de smoelenboek pagina van een non-profit outdoor organisatie te verwijzen, waar ik als vrijwilliger komende zomer twee toffe kano reizen door Scandinavië ga begeleiden, ga jij mee? 😉

De parallel met API testen

Maar de foto had een diepere betekenis, in het kader van API testen. En nee, ik gebruikte onderstaande foto niet om aan te geven dat ik wakker lig van complexe API landschappen, en nee, ook niet om aan te geven dat ik droom van een gestroomlijnde test omgeving, waar nooit problemen optreden. Dat zou immers ook maar saai zijn. Wat dan wel zal je je afvragen? Ik gebruikte deze foto om de brug te slaan naar het feit dat je als tester of developer je omgeving kan inkaderen en een bepaalde scope kan toepassen. Daarmee kan je in de praktijk de wat minder mooie/gestroomlijnde omgeving even negeren, om sneller voortgang te boeken. Dat geldt dus ook voor onderstaande foto, die een heel ander, mooier beeld geeft dan de wat minder ingekaderde foto helemaal onderaan deze blog, die toch echt op dezelfde locatie is genomen!

De wereld mooier maken dan deze daadwerkelijk is

Een andere parallel is het feit dat ik zowel heel enthousiast kan vertellen over mijn avonturen in de woestijn, als over Wiremock. De reden waarom ik zo enthousiast ben en deze tool mijn testersleven mooier maakt, lees je hier:

Wiremock is super eenvoudig en snel op te zetten. Wiremock stelt mij in staat om puur te focussen op het system/software onder test (SUT). Afhankelijkheden met externe systemen worden afgevangen met de Wiremock server. Hierdoor ben ik in staat om mijn testen stabieler en sneller te draaien, en bij issues sneller in staat de oorzaak van het falen boven tafel te krijgen. Daarnaast stelt Wiremock mij in staat in control te zijn als het gaat over benodigde/gebruikte testdata. Ik kan op super eenvoudige wijze bepalen welke data mijn aanpalende systemen terug moeten geven, waardoor ik nog beter kan voorspellen hoe mijn SUT zou moeten functioneren, en dus wat de output van mijn testen zou moeten zijn.

Verder biedt Wiremock mogelijkheden voor aanvullende testen, die normaal met de echte systemen in een keten die door meerdere partijen worden gebruikt, vaak wat lastiger gaan of zelfs helemaal niet mogelijk zijn. Denk hierbij aan het down brengen van de aanpalende systemen, om te zien hoe het SUT hierop reageert. Of bijvoorbeeld de minder voor de hand liggende (un-)happy flows, zoals het bewust retourneren van diverse variaties aan error responses of zelfs time-outs. Laatst genoemde is niet onbelangrijk om bijvoorbeeld retry mechanismen te kunnen testen. In combinatie met de mogelijkheid om de mock diverse responses te laten retourneren op basis van een specifieke staat (aan de hand van de ‘stateful’ functionaliteit van Wiremock), kan je dit nog krachtiger maken. Om maar een voorbeeld te noemen kan je de mock zo inrichten dat de GET call pas na een 3e keer retry, een http status 200 retourneert.

Een ander sprekend voorbeeld voor een ‘stateful’ configuratie kan zijn, dat zolang een bepaalde ‘POST’ call nog niet heeft plaatsgevonden, dat de ‘GET’ call (die bijvoorbeeld de inhoud van een winkelwagen representeert) een empty array retourneert. Maar zodra de POST call wel heeft plaatsgevonden, die dus het selecteren van een artikel voor de aanschaf vertegenwoordigt. Dan kan die exact zelfde GET call resulteren in een array met alle artikelinformatie van een geselecteerd artikel. En dat alles met een simpele toevoeging in de vorm van:

Voor de Post response:
.InScenario(“shopping cart”)
.WillSetStateTo(“item selected”)

Voor de Get response:
.InScenario(“shopping cart”)
.WhenStateIs(“item selected”)

De volledige uitwerking van het gebruik van statefull stubs vind je ondermeer hier.

Wat we behandelden

Met een combinatie van ervaring, verhalen, een korte demo van een Wiremock stand alone setup en natuurlijk wat leuke opdrachten voor de deelnemers hebben we ondermeer de volgende onderwerpen behandeld tijdens de workshop:

  1. Het opzetten van de basisconfiguratie van de Wiremock-server
  2. Hoe de werking van de Wiremock-setup is opgebouwd, waarbij we het proces van het mappen van binnenkomende berichten en het bepalen van de response van de server hebben besproken.
  3. Matching-strategieën, waarbij we hebben gekeken naar het matchen van URL’s, queryparameters, headers en/of body-elementen.
  4. Fout- en vertraging responses.
  5. Het creëren van stateful mocks.
  6. Response-templating.
  7. Verificatie: het uitlezen van de logs van de Wiremock server, voor bijvoorbeeld het valideren van ontvangen data in de query params en/of body elementen.

Mocht je de workshop hebben gemist, kan je deze alsnog in je eigen tempo doorlopen door deze github repo te klonen. Daarbij dezelfde aanbeveling als aan de deelnemers, om voor de leuk, ook eens te spelen met ChatGPT. Waarschijnlijk doordat de community rondom Wiremock vrij groot is en de documentatie vrij uitgebreid, lijkt ChatGPT hier goed mee overweg te kunnen. Ik was ik in elk geval verbaasd over de kwaliteit van de resultaten en mogelijkheden! Zo lijkt ChatGPT heel goed overweg te kunnen met de structuur van de code, en bijvoorbeeld de diverse matchings strategieën.

Verificatie versus een ‘domme’ stub

Die laatste optie 7, verificatie, wil ik nog wat extra aandacht geven. Zo ben ik van mening dat je je stubs zo ‘dom’ mogelijk moet houden, waardoor ze niet te complex worden, eenvoudig te lezen zijn en dus beter onderhoudbaar. Terwijl je je data driven testen dan alsnog kan uitvoeren door je validaties te doen op basis van data die je hebt ontvangen op de Wiremock server. Dit kan eenvoudig met het gebruik van FindLogEntries(), zoals ook in onderstaand voorbeeld getoond:

Valkuilen en aandachtspunten

Teruggrijpend naar de vakantie foto, gaf ik natuurlijk het publiek ook mee dat de harde realiteit helaas niet vergeten mag worden! Zoals onderstaande foto aangeeft ziet de werkelijkheid er vaak wat minder mooi uit. In dit geval op de foto: een ‘lelijk’ tentenkamp, en iets verderop zie je zelfs al weer de bewoonde wereld liggen in de vorm van een woestijndorp. Toch net wat minder romantisch dan de eerste foto, die het beeld schept dat we in ‘the middle of nowhere’ omringd worden door enkel een mooie zonsopkomst en een paar kamelen.

Dit geldt dus ook voor het gebruik van stubs. Je moet niet vergeten dat de integratie met de daadwerkelijke systemen altijd in de praktijk anders kan uitpakken dan de interactie met de wiremock server doet vermoeden. Denk bijvoorbeeld aan gewijzigde interfaces, beroerde performances die pas aan het licht komen als de daadwerkelijke systemen op elkaar aansluiten etc. Vergeet daarom bij het veelvuldig gebruiken van Wiremock of andere service virtualisaties niet om een risicoinventarisatie los te laten op de integratie en ketentesten. En denk na over de mogelijkheden van bijvoorbeeld contract testing, performance-, load- en stresstesten, of dat een geautomatiseerde smoke test of simpele handmatige check al dan niet direct in productie, afdoende kan zijn.

Overigens zijn de zonnepanelen op de foto natuurlijk ook wel een knipoog om met de tijd mee te gaan 😉 Want mocken is wat mij betreft voor systeem testen niet meer weg te denken anno 2023!

Onder het motto dat beelden beter blijven hangen dan teksten, hoop ik dat deze beeldspraak vergelijking jou kan helpen (herinneren) om tools als Wiremock effectief in te zetten. En dat je bewust bent geworden van de voordelen maar ook de valkuilen/aandachtspunten.

Mocht je van gedachten willen wisselen over het inzetten van stubs, het gebruik van Wiremock of vakantieavonturen willen uitwisselen, schroom dan niet om contact op te nemen via ak@newspark.nl. Of meld je aan voor ons Meetup kanaal en wie weet spreken we elkaar dan wel op onze volgend Meetup!