Definitie: Een unit test is een klein, geautomatiseerd stukje code dat controleert of één afgebakend onderdeel van een programma, zoals een functie of methode, bij een bepaalde invoer de verwachte uitkomst geeft. Unit tests draaien los van databases, netwerken en andere systemen, zodat ze snel zijn en een fout direct naar het juiste onderdeel wijzen.
In het kort
- Een unit is het kleinste testbare onderdeel van software, meestal een functie, methode of klasse.
- Unit testen gebeurt vrijwel altijd automatisch, met een testframework zoals PHPUnit, JUnit, NUnit, pytest of Jest.
- Een veelgebruikte opbouw is Arrange, Act, Assert: voorbereiden, uitvoeren en controleren.
- Unit tests vangen fouten vroeg en maken aanpassingen veiliger, maar vinden geen fouten in de samenwerking tussen onderdelen.
Wat is een unit test?
Een unit test is een controle op één klein stukje code. Stel dat een applicatie een functie heeft die de prijs inclusief btw berekent. Een unit test roept die functie aan met een bedrag, bijvoorbeeld 100 euro met 21% btw, en controleert of de uitkomst 121 euro is. Klopt dat niet, dan faalt de test en weet de ontwikkelaar precies waar het probleem zit.
Evozon omschrijft een unit test als een stuk code dat andere code aanroept en daarna controleert of bepaalde aannames kloppen. Het onderdeel dat getest wordt, heet het system under test. De test faalt als een aanname niet uitkomt.
Het belangrijkste kenmerk is isolatie. Volgens Guru99 test je een unit zonder afhankelijkheid van externe systemen zoals databases of API’s. Dat maakt de test snel, voorspelbaar en herhaalbaar. Een applicatie kan honderden of duizenden unit tests hebben die samen in enkele seconden draaien.
Hoe werkt een unit test?
De meeste unit tests volgen het patroon Arrange, Act, Assert:
- Arrange (voorbereiden). Zet de benodigde gegevens klaar, zoals een bedrag en een btw-percentage.
- Act (uitvoeren). Roep de functie aan die je wilt testen.
- Assert (controleren). Vergelijk de uitkomst met wat je verwacht.
Een goede set unit tests test niet alleen het normale geval, maar ook randgevallen. Wat gebeurt er bij een bedrag van nul, een negatief bedrag, een leeg veld of een heel groot getal? Juist daar zitten vaak fouten.
Tests draaien met een testframework. Dat zoekt alle tests op, voert ze uit en laat zien welke slagen en welke falen. In de meeste professionele projecten draaien de tests automatisch bij elke wijziging in de code, als onderdeel van een CI/CD-pijplijn. Faalt er een test, dan gaat de wijziging niet live.
Voorbeeld van een unit test
Neem een rekentool die berekent hoeveel materiaal er nodig is voor een project. Een ontwikkelaar schrijft unit tests voor de rekenfunctie:
- Bij een standaardinvoer komt de verwachte hoeveelheid eruit.
- Bij een waarde net onder en net boven een grens wordt het juiste product gekozen.
- Bij een ontbrekende waarde geeft de functie een duidelijke foutmelding in plaats van een verkeerd getal.
- Bij een afronding naar hele verpakkingen wordt altijd naar boven afgerond.
Past iemand later de formule aan, bijvoorbeeld voor een nieuwe norm, dan laten de tests direct zien of de bestaande gevallen nog kloppen.
Wat maakt een goede unit test?
- Eén ding per test. Een test controleert één gedrag, zodat bij een fout meteen duidelijk is wat er misgaat.
- Duidelijke naam. De naam beschrijft het geval, bijvoorbeeld: berekent btw correct bij een bedrag van nul.
- Onafhankelijk. Een test mag niet afhangen van de volgorde of van een andere test.
- Snel. Trage tests worden minder vaak gedraaid.
- Herhaalbaar. Dezelfde test geeft elke keer dezelfde uitkomst, ongeacht dag, tijd of omgeving.
Mocking en stubbing
Veel code werkt samen met andere onderdelen: een database, een externe API of een e-maildienst. In een unit test wil je die niet echt aanroepen. Daarvoor gebruik je vervangers:
| Begrip | Wat het doet |
|---|---|
| Stub | Geeft een vast antwoord terug, zodat de test niet afhankelijk is van het echte systeem |
| Mock | Geeft een antwoord terug en controleert ook of de code het systeem op de juiste manier aanroept |
| Fake | Een eenvoudige werkende versie, zoals een database in het geheugen |
Guru99 waarschuwt voor overmatig mocken. Als bijna alles vervangen is, test je vooral je eigen vervangers en niet de echte werking.
Unit test versus andere tests
| Testsoort | Wat het controleert | Snelheid |
|---|---|---|
| Unit test | Eén functie of klasse, los van de rest | Zeer snel |
| Integratietest | Of onderdelen goed samenwerken, bijvoorbeeld code en database | Gemiddeld |
| Functionele test | Of een functie werkt zoals de gebruiker verwacht | Gemiddeld tot traag |
| End-to-end test | Een complete route door de applicatie, zoals in een browser | Traag |
| Regressietest | Of bestaande functies na een wijziging nog werken | Hangt af van de set |
| Acceptatietest | Of de opdrachtgever het resultaat goedkeurt | Handmatig of geautomatiseerd |
Unit tests vormen meestal de basis: veel kleine, snelle tests. Daarboven komen minder, maar bredere tests. PhoenixNAP wijst erop dat unit tests losse onderdelen controleren, terwijl integratietests de samenwerking tussen onderdelen testen. Je hebt beide nodig.
Wat is test-driven development?
Bij test-driven development (TDD) schrijf je de test voordat je de code schrijft. Eerst een test die faalt, omdat de functie nog niet bestaat. Dan net genoeg code om de test te laten slagen. Daarna verbeter je de code, terwijl de test bewaakt dat alles blijft werken. Volgens Guru99 stimuleert TDD een eenvoudig ontwerp. Niet elk team werkt zo, maar het idee erachter is breed bruikbaar: bedenk vooraf wat goed werkt betekent.
Voordelen en nadelen van unit testen
Voordelen
- Fouten worden vroeg gevonden, wanneer ze nog goedkoop zijn om te herstellen.
- Aanpassingen en opschoning van code zijn veiliger, omdat tests laten zien als iets breekt.
- Tests dienen als documentatie: ze laten zien hoe een functie bedoeld is.
- Nieuwe ontwikkelaars kunnen met meer vertrouwen aan bestaande code werken.
Nadelen
- Tests schrijven en onderhouden kost tijd.
- Unit tests vinden geen fouten in de samenwerking tussen onderdelen.
- Veel geslaagde tests kunnen een schijnveiligheid geven als de belangrijke gevallen ontbreken.
- Slecht geschreven tests breken bij elke kleine wijziging en worden dan genegeerd.
Waar let je op als opdrachtgever?
Je hoeft zelf geen tests te schrijven om er iets over te vragen. Bij het laten bouwen van software zijn dit nuttige vragen:
- Worden de belangrijkste berekeningen en regels automatisch getest?
- Draaien de tests bij elke wijziging?
- Welke onderdelen zijn bewust niet getest, en waarom?
- Worden tests meegeleverd met de broncode?
Tests zijn een vorm van onderhoudbaarheid. Ontbreken ze, dan groeit de technische schuld: elke aanpassing wordt spannender en kost meer tijd om te controleren.
Wat betekent dit voor jouw project?
Bij de calculators op Capaciteitberekenen.nl gaat het om invoer, berekening, resultaat en een print of PDF. Voor specifieke onderdelen zijn gerichte lokale controles gedaan. Dat zijn controles op afgebakende modules, geen algemene certificering. De bouwles is dat je vastlegt welke aannames en grenzen gelden. Wie dat goed beschrijft, weet ook precies welke gevallen getest moeten worden.
Ik wil vooraf duidelijk hebben wat we met een eerste versie bedoelen. Daar hoort ook bij welke regels en berekeningen zo belangrijk zijn dat ze bij elke wijziging opnieuw gecontroleerd moeten worden.
Vraag? Stuur me welke berekening of regel in jullie proces echt moet kloppen. Dan bepalen we samen de logische eerste stap. Lees ook hoe ik een webapplicatie bouw.
Veelgestelde vragen over unit test
Wat is een unit test in simpele woorden?
Een unit test is een automatische controle op één klein stukje code, zoals een functie. De test roept de functie aan met bepaalde invoer en controleert of de uitkomst klopt.
Wat is het verschil tussen unit testen en integratietesten?
Unit testen controleert losse onderdelen van code, zonder andere systemen. Integratietesten controleert of onderdelen goed samenwerken, bijvoorbeeld de code met de database of met een externe API.
Zijn unit tests handmatig of automatisch?
Unit tests worden vrijwel altijd automatisch uitgevoerd met een testframework zoals PHPUnit, JUnit of Jest. Handmatig unit testen kan, maar is trager en minder betrouwbaar.
Verwante termen
Technische schuld · Laravel · Broncode · Doorontwikkeling en onderhoud · Software-architectuur · Online rekentool / calculator
← Terug naar de kennisbank