Home » Begrippen » Wat is een integratietest?

Wat is een integratietest?

Een integratietest is een type softwaretest dat controleert of verschillende modules, componenten of systemen correct samenwerken wanneer ze met elkaar worden gecombineerd. Waar een unittest een geïsoleerde functie of klasse test, gaat een integratietest een stap verder en verifieert de samenwerking tussen meerdere delen van een applicatie. Stel dat jouw webapplicatie bestaat uit een gebruikersregistratiemodule, een e-mailservice en een databaselaag: een integratietest controleert of een nieuwe registratie correct in de database wordt opgeslagen én of de welkomstmail daadwerkelijk wordt verzonden. Voor een betalingssysteem test je of de betaalverwerker, het voorraadbeheer en de orderbevestigingsmail allemaal correct in gang worden gezet bij een succesvolle transactie. Integratietests zijn onmisbaar om te ontdekken dat individueel werkende modules toch falen wanneer ze samenwerken, een klasse problemen die unittests volledig missen. Ze vormen daarmee een essentiële laag in een volwassen teststrategie.

Integratietests in de testpiramide

Om de rol van integratietests te begrijpen, is de testpiramide van Mike Cohn een nuttig kader. De piramide beschrijft drie lagen van testen, van breed en snel onderaan naar smal en langzaam bovenaan:

  • Unittests (basis): testen van geïsoleerde functies en klassen. Snel, goedkoop en in grote aantallen aanwezig. Ze vangen logische fouten op in individuele componenten.
  • Integratietests (midden): testen van de samenwerking tussen componenten. Langzamer dan unittests omdat ze vaak een database, bestandssysteem of externe service betrekken, maar sneller dan end-to-end tests.
  • End-to-end tests (top): testen van complete gebruikersstromen via de UI, van begin tot eind. Het meest realistisch, maar ook het traagst en meest onderhoudsgevoelig.

De piramide raadt aan om de meeste tests te schrijven als unittests, een middelgrote laag integratietests te hebben, en slechts een beperkt aantal end-to-end tests. Integratietests zijn de lijm die garandeert dat de afzonderlijk geteste onderdelen ook als geheel correct functioneren.

Soorten integratietests

Er zijn verschillende benaderingen voor integratietests, afhankelijk van de architectuur van jouw applicatie en wat je precies wilt testen.

Big bang integratie

Alle modules worden tegelijk gecombineerd en als één geheel getest. Deze aanpak is eenvoudig te plannen, maar maakt het moeilijk om de oorzaak van een fout te isoleren wanneer er iets misgaat. Geschikt voor kleine applicaties.

Top-down integratie

Je begint met de hoogste modules in de hiërarchie en werkt stapsgewijs naar beneden. Lagere modules die nog niet klaar zijn, worden vervangen door stubs — vereenvoudigde nep-implementaties. Dit maakt het mogelijk om vroeg te testen op hoog niveau, maar vereist veel stub-onderhoud.

Bottom-up integratie

Omgekeerd begin je met de laagste modules en bouw je omhoog. Hogere modules worden vervangen door drivers — testharnesses die de aanroepen van hogere modules simuleren. Dit is nuttig wanneer de laagste modules complex zijn en vroeg gevalideerd moeten worden.

Incrementele integratie

Modules worden stap voor stap samengevoegd en na elke toevoeging getest. Dit maakt het eenvoudiger om de bron van een integratieprobleem te vinden en is de meest gebruikte aanpak in moderne softwareontwikkeling.

Wat testen integratietests in de praktijk?

Integratietests richten zich op de grensvlakken tussen systemen en componenten. Concrete voorbeelden van wat ze testen:

  • Database-interacties: worden records correct opgeslagen, bijgewerkt en opgehaald? Worden transacties correct afgehandeld bij fouten?
  • API-aanroepen: reageert de externe service correct op jouw verzoeken, en verwerkt jouw applicatie zowel succesvolle als foutieve responses goed?
  • Berichtenbrokers: worden berichten correct gepubliceerd naar en geconsumeerd van een wachtrij zoals RabbitMQ of Kafka?
  • Authenticatie en autorisatie: werkt de samenwerking tussen jouw applicatielogica en de authenticatieservice correct?
  • Bestandssysteem en opslag: worden bestanden correct geschreven, gelezen en verwijderd in samenwerking met de opslaglaag?

Integratietests schrijven: best practices

Het schrijven van goede integratietests vereist andere overwegingen dan unittests. Hier zijn de belangrijkste aandachtspunten:

  • Gebruik testdatabases: run integratietests altijd tegen een geïsoleerde testdatabase die voor elke testrun wordt gevuld met bekende testdata en daarna wordt opgeschoond. Testcontainers is een populaire tool die Docker-containers opstart voor databases en andere services tijdens de testrun.
  • Mock externe services spaarzaam: het overmatig mocken van externe services ondermijnt het doel van integratietests. Gebruik bij voorkeur echte services in een testomgeving, of betrouwbare testdubbelen zoals WireMock voor HTTP-services.
  • Houd tests onafhankelijk: elke integratietest moet in willekeurige volgorde en onafhankelijk van andere tests kunnen worden uitgevoerd. Gedeelde testdata die door één test wordt gewijzigd, kan andere tests laten falen op verwarrende manieren.
  • Automatiseer in CI/CD: integratietests horen thuis in jouw Continuous Integration-pipeline. Ze worden automatisch uitgevoerd bij elke commit of pull request, zodat integratiefouten vroeg worden opgemerkt.
  • Bewaak de uitvoertijd: integratietests zijn inherent langzamer dan unittests. Houd de totale uitvoertijd bewust in de gaten en profileer langzame tests. Parallelle testuitvoering kan de doorlooptijd aanzienlijk reduceren.

Conclusie

Integratietests zijn een onmisbare schakel in een volwassen teststrategie en vullen de leemte op die unittests achterlaten: ze bewijzen niet alleen dat individuele onderdelen werken, maar ook dat ze correct samenwerken in de context van de gehele applicatie. Door integratietests te automatiseren in jouw CI/CD-pipeline, verklein je het risico op regressies en ontdek je integratiefouten vroeg in het ontwikkelproces — wanneer ze nog goedkoop op te lossen zijn. Begin met het identificeren van de kritische integratiepunten in jouw applicatie: databases, externe API’s, berichtenbrokers en authenticatiediensten. Schrijf voor elk van deze grensvlakken gerichte integratietests en zorg voor een geïsoleerde testomgeving. Zo bouw je stap voor stap aan een testsuites die jou en jouw team het vertrouwen geeft om snel en veilig te blijven doorontwikkelen.

Veelgestelde vragen

  1. Wat is het verschil tussen een integratietest en een unittest?
    Een unittest test één geïsoleerde functie of klasse in isolatie, waarbij alle afhankelijkheden worden vervangen door mocks. Een integratietest test de samenwerking tussen meerdere componenten met echte of realistisch gesimuleerde afhankelijkheden. Unittests zijn sneller en fijnmaziger; integratietests zijn realistischer maar langzamer.
  2. Moet ik alle externe services mocken in integratietests?
    Niet per se. Het doel van integratietests is juist om de samenwerking met echte componenten te testen. Gebruik voor externe services bij voorkeur testomgevingen, sandboxes die de aanbieder beschikbaar stelt, of tools zoals WireMock die HTTP-services realistisch simuleren. Mock alleen wanneer een echte service niet beschikbaar of te traag is voor geautomatiseerde tests.
  3. Hoe zorg ik voor een schone testomgeving bij elke integratietest?
    Gebruik een dedicated testdatabase die vóór elke testrun wordt gevuld met bekende testdata via database-migrations of seed-scripts. Testcontainers is een populaire Java- en .NET-bibliotheek die automatisch Docker-containers opstart voor PostgreSQL, MySQL of andere services en ze na de test opruimt. Zorg ervoor dat tests geen data achterlaten die andere tests beïnvloeden.
  4. Hoe lang mogen integratietests duren?
    Als vuistregel geldt dat de gehele integratietestsuites binnen vijf tot tien minuten moet kunnen worden uitgevoerd om een vlotte CI/CD-pipeline te behouden. Duurt het langer, dan is parallelle uitvoering van tests of een slimmere testselecstrategie het overwegen waard. Erg trage tests worden in de praktijk minder vaak uitgevoerd, wat hun waarde ondermijnt.
  5. Zijn integratietests ook relevant voor microservices?
    Ja, en bij microservices zijn ze zelfs nog crucialer. In een microservices-landschap is de communicatie tussen services via API’s of berichtenbrokers een frequent punt van fouten. Contracttests — een gespecialiseerde vorm van integratietests die de API-contracten tussen services verifiëren — zijn bijzonder populair in microservices-omgevingen. Tools als Pact helpen je om te garanderen dat services elkaars berichten correct kunnen interpreteren.

Al onze begrippen

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0-9