Een Application Programming Interface (API) stelt twee systemen in staat om met elkaar te communiceren. In essentie biedt een API het contract en de taal die de communicatie tussen twee systemen regelen.
Bij API-testen worden deze interfaces geëvalueerd om te controleren of ze voldoen aan normen voor functionaliteit, betrouwbaarheid, prestaties en beveiliging. Dit gebeurt doorgaans door verschillende verzoeken naar de API te sturen en de antwoorden te beoordelen. API-testen heeft voor vrijwel alle ontwikkelaars de hoogste prioriteit. Volgens Rapid’s wereldwijde API-enquête van 2022 meldt meer dan 90% van de ontwikkelaars dat ze hun API’s testen of van plan zijn deze te testen.
API-eindpunten zijn specifieke paden of URL’s die een API biedt en die toegang geven tot verschillende functionaliteiten van de softwareapplicatie. Elk eindpunt correspondeert met een specifieke functie, zoals het ophalen van gegevens, het bijwerken van een record of het uitvoeren van een berekening. Het is ontworpen om specifieke typen verzoeken en antwoorden binnen de algehele structuur van de API af te handelen.
Door API-eindpunten gedurende het ontwikkelingsproces consequent te testen, kunnen problemen vroegtijdig worden opgespoord, waardoor op de lange termijn tijd en middelen worden bespaard.
SP, hoe kunnen API-tests efficiënt worden uitgevoerd gedurende de levenscyclus van API-ontwikkeling? Laten we erin duiken!
Wat zijn API-eindpunten?
Een API is een verzameling regels en protocollen voor het bouwen van en communiceren met softwareapplicaties, waarmee verschillende softwaresystemen met elkaar kunnen communiceren. De documentatie en specificaties van elke API beschrijven hoe gegevens kunnen worden uitgewisseld.
API’s kunnen HTTP-verzoeken gebruiken om gegevens uit een webapplicatie of server op te halen, vergelijkbaar met de manier waarop een webpagina wordt weergegeven.

API-eindpunten zijn diensten en URL’s, net als de URL’s die je gebruikt om een website te bezoeken. Binnen een API is een eindpunt een specifieke locatie die verzoeken ontvangt en erop reageert. Door gegevens en opdrachten via het eindpunt te verzenden en ontvangen, faciliteert het de communicatie tussen verschillende applicaties en systemen.
Hiermee kunnen ontwikkelaars snel toegang krijgen tot gegevens en functies van andere systemen en deze gebruiken, waardoor ze niet alles vanaf nul in nieuwe applicaties hoeven te bouwen.
Voorbeeld van een API-eindpunt
Laten we bekijken hoe een API-eindpunt eruitziet. Als voorbeeld gebruik ik de Cat API en hun Postman-documentatie:

In dit geval zijn de eindpunten ‘images’, ‘favorites’, ‘breeds’, enzovoort. Elk eindpunt maakt verschillende acties mogelijk, die worden uitgevoerd via verschillende HTTP-verzoekmethoden. De meest gebruikte methoden zijn bijvoorbeeld de methoden voor CRUD-acties: POST voor het aanmaken, GET voor het lezen, PUT voor het bijwerken en DELETE voor het verwijderen.
API-documentatie moet details bevatten over de beschikbare eindpunten, de verzoekmethode die voor het eindpunt is toegestaan en modellen van het verzoek en het antwoord. Met deze informatie zouden we moeten kunnen beginnen met het testen van de eindpunten. We bespreken dit in een van de volgende secties.
Waarom API-eindpunten testen?
Elke API is gebouwd om specifieke functies uit te voeren en de functionaliteit van de applicatie is afhankelijk van de API-transacties om het antwoord te ontvangen. De basistransactie kan veel interne API-aanroepen uitvoeren; als een van deze API-aanroepen mislukt, kan het systeem als geheel uitvallen en niet meer functioneren. Daarnaast kunnen meerdere applicaties dezelfde API gebruiken. Wanneer een API niet goed werkt, kan dit dus een groot aantal applicaties schaden. Het testen van API-eindpunten helpt problemen te voorkomen voordat de klant ze ontdekt.
API-eindpunten testen
API-testen kan zowel handmatig als geautomatiseerd worden uitgevoerd. Beide typen tests kunnen worden uitgevoerd met API-testtools.
In tegenstelling tot UI-tests zijn API-tests niet afhankelijk van een browser. Er kan echter een API-testtool worden gebruikt die als client fungeert.
Op basis van de documentatie kunnen we het eindpunt waarnaar het HTTP-verzoek moet worden verzonden, de HTTP-methode, de queryparameters, de hoofdtekst van het verzoek (indien vereist), de mogelijke HTTP-statuscodes van het antwoord en de hoofdtekst van het HTTP-antwoord achterhalen. Met deze informatie kunnen we de API-testgevallen identificeren die moeten worden uitgevoerd.
Afhankelijk van de vereisten kunnen we bepalen welke tests moeten worden uitgevoerd: van functionele tests tot niet-functionele tests, zoals prestatietests, belastingtests en beveiligingstests.
De eenvoudigste API-test bestaat uit het verzenden van het verzoek en het valideren van het antwoord. Afhankelijk van het type verzoek en het eindpunt zelf hebben we mogelijk aanvullende informatie nodig om het verzoek te verzenden. Hier volgt een lijst van wat we nodig hebben om een verzoek te verzenden:
- Eindpunt/URL: dit is het adres waar het verzoek naartoe wordt gestuurd
- De hoofdtekst van het verzoek: voor verzoekmethoden zoals POST en PUT is een hoofdtekst vereist, die de gegevens bevat die naar de server moeten worden verzonden
- Queryparameters: aanvullende zoekparameters kunnen worden gebruikt om de resultaten die in het antwoord worden geretourneerd te beperken
- Kopteksten: dit zijn metagegevens die met het verzoek kunnen worden verzonden. In het eerdere voorbeeld met katten kan een API-sleutel als koptekst worden gebruikt, waardoor meer informatie kan worden opgehaald dan zonder sleutel:

Nadat het verzoek succesvol is verzonden, moet de test het antwoord controleren. In het antwoord moet worden gelet op:
- De HTTP-statuscode: elk antwoord heeft een statuscode. Deze kunnen worden ingedeeld in 5 hoofdklassen: codes die beginnen met 1 (100-199) vertegenwoordigen een informatief antwoord, codes die beginnen met 2 (200-299) vertegenwoordigen een succesvol bericht, codes tussen 300 en 399 zijn omleidingen, codes die beginnen met 4 (400-499) zijn clientfouten en codes in de groep van 500 zijn serverfouten.
- De hoofdtekst van het HTTP-antwoord: de informatie die van de server terugkomt. De documentatie moet aangeven welk type informatie het antwoord moet bevatten, bijvoorbeeld:

- Antwoordkopteksten: metagegevens die door de servers worden geretourneerd
- Antwoordtijd: als we ook geïnteresseerd zijn in de prestaties van de API.
Voor een snel voorbeeld gebruik ik Postman om te laten zien hoe een GET-verzoek eruitziet met behulp van de Cat API. Ik stuur een GET-verzoek naar het images-eindpunt. Daarvoor volstaat het om het eindpuntadres en de GET-methode te gebruiken en het verzoek te verzenden:

Nadat we het verzoek hebben verzonden, kunnen we de HTTP-antwoordcode, de hoofdtekst en de tijd zien die nodig was om een antwoord te ontvangen:

De inhoud van de antwoordhoofdtekst is wat een API retourneert met de verstrekte invoer, terwijl de antwoordstatuscode de huidige status van het verzoek aangeeft.
Er zijn verschillen in de gegevenstypen en -groottes van een API-antwoord. Platte tekst, een XML-document, een JSON-gegevensstructuur en andere indelingen zijn allemaal mogelijke antwoordindelingen. Dit kan een JSON/XML-bestand van honderd pagina's zijn of een eenvoudige tekenreeks van enkele woorden, of zelfs een leeg antwoord. Daarom is het cruciaal om voor een bepaalde API een geschikte verificatietechniek te selecteren.
Testgevallen voor API's maken
De functionele testgevallen kunnen worden afgeleid met behulp van black-boxtesttechnieken. De documentatie specificeert welke typen gegevens elke parameter accepteert, zodat op basis van deze gegevens partities en grenswaarden kunnen worden gemaakt.
Vervolgens kunnen we complexere scenario's maken door meerdere verzoeken in één test te combineren. Een test die bijvoorbeeld een resource maakt, deze bijwerkt, uitleest en vervolgens verwijdert, verzendt 4 verschillende verzoeken.
Zowel positieve als negatieve tests zijn noodzakelijk voor API-testen om te verifiëren dat de API werkt zoals vereist. Omdat API-testen een onderdeel is van black-boxtesten, vormen invoer- en uitvoergegevens de drijvende krachten achter beide soorten tests. Enkele ideeën voor het maken van testscenario's zijn:
Positieve scenario's:
- Controleer of de API invoer accepteert en het gewenste resultaat volgens de vereiste oplevert.
- Controleer of de antwoordstatuscode—of deze nu een foutcode of een 2xx-code retourneert—wordt geretourneerd op de manier die in de vereiste is aangegeven.
- Geef het minimale en maximale aantal velden aan dat moet worden ingevuld.
Negatieve scenario's:
- Zorg ervoor dat de API in gevallen waarin de verwachte uitvoer ontbreekt een geschikt antwoord geeft.
- Voer een test uit voor invoervalidatie.
- Onderzoek het gedrag van de API op verschillende autorisatieniveaus.
Niet-functionele API-tests
Naast functioneel testen kunnen we verschillende niet-functionele tests voor API's uitvoeren. Dit zijn enkele van de belangrijkste:
Prestatietests
Prestatietests verwijzen naar het meten van de prestaties van software onder verschillende werkbelastingen, scenario's en omstandigheden. Ze kunnen je helpen knelpunten in het gebruik van resources te vinden, stabiliteit en schaalbaarheid te garanderen en ervoor te zorgen dat de software schaalbaar blijft. Subtypen van prestatietests zijn onder andere belastingstests, stresstests, duurtests en piekbelastingstests. De populairste vorm van prestatietests, bekend als belastingstests, bootst gemiddeld of hoog gebruikersverkeer op je software na. Dit kan je helpen de verwerkingscapaciteit, reactietijd en het resourcegebruik van je software te beoordelen. Apache JMeter, een opensource-Javatool die verschillende verzoeken naar je API kan genereren en verzenden en de resultaten kan meten, is een van de beste tools voor het testen van de belasting van je API.
Beveiligingstests
Het proces waarbij wordt gecontroleerd of je software beschermd is tegen kwaadwillige aanvallen, ongeautoriseerde toegang en datalekken, staat bekend als beveiligingstests. Dit kan je helpen de privacy, nauwkeurigheid en toegankelijkheid van de gegevens van je programma te garanderen. Beveiligingstests kunnen op verschillende niveaus worden uitgevoerd, waaronder op database-, applicatie- en netwerkniveau. Codebeoordelingen, penetratietests, kwetsbaarheidsscans en ethisch hacken zijn enkele populaire methoden voor beveiligingstests. Postman is een populaire platformonafhankelijke tool die verzoeken naar je API kan verzenden en ontvangen en beveiligingsfuncties zoals authenticatie, autorisatie, versleuteling en foutafhandeling kan testen. Het is een van de beste tools voor het testen van de beveiliging van je API.
Betrouwbaarheidstests
Betrouwbaarheidstests zijn het proces waarbij wordt bepaald hoe betrouwbaar en consistent je software in de loop der tijd en onder verschillende omstandigheden is. Dit kan je helpen de herstelbaarheid, fouttolerantie en beschikbaarheid van je software te garanderen. Je kunt betrouwbaarheidstests uitvoeren door opzettelijk bugs, fouten of storingen in je software te introduceren en te observeren hoe deze reageert en zich herstelt. De gemiddelde tijd tussen storingen (MTBF), de gemiddelde tijd tot een storing (MTTF), de gemiddelde reparatietijd (MTTR) en het storingspercentage zijn enkele veelgebruikte meetwaarden voor betrouwbaarheidstests. Chaos Monkey, een tool die willekeurig instanties in je cloudomgeving beëindigt en test hoe je software met de verstoring omgaat, is een van de beste tools voor het testen van de betrouwbaarheid van je API.
Laatste gedachten
API-testen is een steeds belangrijkere vaardigheid voor QA-professionals. Het is essentieel om API-eindpunten grondig te testen om er zeker van te zijn dat ze functioneren zoals bedoeld en aan de vereiste normen voldoen. Het testen van API-eindpunten helpt potentiële problemen of bugs te identificeren en op te lossen en valideert de algehele functionaliteit van de applicatie.
Om API-eindpunten effectief te testen, is het essentieel om best practices te volgen, zoals het ontwerpen van uitgebreide testgevallen, het overwegen van verschillende invoerwaarden en uitvoerresultaten en het gebruiken van automatiseringstools voor efficiënt en betrouwbaar testen. Daarnaast kan het inzetten van testomgevingen die realistische scenario's nauwkeurig nabootsen de nauwkeurigheid van het testen van API-eindpunten verder verbeteren.
Uitgebreid en effectief testen van API-eindpunten is essentieel om de betrouwbaarheid, prestaties en functionaliteit van moderne applicaties te waarborgen. Door te begrijpen wat API-eindpunten zijn en hoe je ze test, kunnen ontwikkelaars zorgen voor een succesvolle integratie van hun applicaties met andere systemen en tegelijkertijd een uitstekende gebruikerservaring bieden.
Abonneer je op de nieuwsbrief van QA Lead om updates over nieuwe testcontent te ontvangen.
