Ga naar inhoud

Testen zonder Testteam

41% van alle code is AI-gegenereerd. Het meeste daarvan wordt niet getest. Leer hoe je als solo-builder kwaliteit waarborgt zonder QA-afdeling.

Waarom deze module?

Hier is het ongemakkelijke feit over vibe coden: de meeste AI-gegenereerde code wordt verscheept zonder serieuze tests. En dat is een probleem. Niet omdat testen leuk is (dat is het zelden), maar omdat bugs in productie je gebruikers kosten, je reputatie schaden en je meer tijd kosten dan testen ooit zou hebben gedaan.

Maar je hebt geen QA-afdeling. Geen testteam. Misschien zelfs geen testervaring. En dat is precies waarom deze module bestaat. Want het goede nieuws is: dezelfde AI die je code schrijft, kan ook je tests schrijven. En de nieuwste generatie testtools laat je in gewone taal beschrijven wat je wilt testen.

In deze module leer je een testaanpak die praktisch, haalbaar en effectief is voor solo-builders en kleine teams. Geen academische testtheorie, maar concrete technieken die je vandaag kunt toepassen.

Het risico van niet testen

Laten we eerlijk zijn over wat er gebeurt als je niet test.

AI-code bevat meer fouten

Onderzoek van CodeRabbit uit december 2025 toonde aan dat code die samen met AI is geschreven 1,7 keer meer serieuze problemen bevat dan code die volledig door mensen is geschreven. Dezelfde analyse vond 2,74 keer meer beveiligingskwetsbaarheden in AI-gegenereerde code.

Bugs in productie kosten exponentieel meer

Een bug die je ontdekt tijdens het bouwen kost je vijf minuten. Dezelfde bug in productie kost je uren aan debuggen, boze gebruikers, en soms verloren data. Hoe later je een bug vindt, hoe duurder hij is om op te lossen.

AI-fixes introduceren nieuwe bugs

Wanneer je de AI vraagt om een bug te fixen zonder gestructureerd te testen, lost hij vaak het symptoom op terwijl hij een nieuw probleem introduceert. Zonder tests merk je dat pas als een gebruiker klaagt.

Vertrouwen bij je gebruikers

Niets vernietigt vertrouwen sneller dan een app die crasht, data kwijtraakt of onvoorspelbaar gedrag vertoont. Testen is niet alleen een technische noodzaak, het is een belofte aan je gebruikers.

Kernprincipe: Bij vibe coden vermindert testen niet. Het verschuift. In plaats van achteraf testen, test je bij elke stap. Elke prompt, elke iteratie, elke deploy. Testen is geen fase aan het einde. Het is een gewoonte die door je hele werkproces loopt.

Drie niveaus van testen

Professionele testers werken met een “testpiramide”: veel kleine, snelle tests aan de basis, minder uitgebreide tests in het midden, en een paar grote tests aan de top. Als solo vibe coder volg je hetzelfde principe, maar met een pragmatische invulling.

Niveau 1: Handmatig testen (de basis)

Dit is het minimum dat je bij elke wijziging doet. Het kost geen setup, geen tools en geen kennis. Alleen discipline.

Wat je test:

  • Werkt de kernfunctie? (de actie die je app bestaansrecht geeft)
  • Werkt de navigatie? (kan de gebruiker overal komen?)
  • Werken formulieren? (validatie, opslaan, foutmeldingen)
  • Werkt het op mobiel? (responsive check)
  • Wat gebeurt er bij lege input? Bij foute input?

Wanneer je test: Na elke prompt die iets verandert. Niet aan het einde van de dag. Na elke wijziging. Dit klinkt overdreven, maar elke test duurt dertig seconden tot twee minuten. Een bug die je nu vangt, kost je straks geen uur.

De verse-ogen test: Open je app in een incognito/privébrowser. Geen ingelogd account, geen testdata. Ervaar je app als een nieuwe gebruiker. Waar loop je vast? Wat is verwarrend? Dit simpele ritueel vangt meer problemen dan welke automatische test ook.

Niveau 2: AI-gegenereerde unit tests

Unit tests controleren of individuele functies correct werken. Ze zijn snel, automatisch, en ideaal om door AI te laten schrijven. Dit is een van de taken waar AI het meest uitblinkt.

Wat zijn unit tests? Een unit test is een stukje code dat een specifieke functie aanroept met bekende input en controleert of de output klopt. Bijvoorbeeld: je hebt een functie die BTW berekent. De unit test roept die functie aan met € 100 en controleert of het resultaat € 121 is.

“Schrijf unit tests voor de functie calculateInvoiceTotal in src/lib/invoice-utils.ts. Gebruik Vitest als test framework. Test de volgende scenario's: normale berekening met meerdere regels, een factuur met een enkele regel, een factuur zonder regels (moet 0 retourneren), negatieve bedragen (moet een fout gooien), zeer grote bedragen (precisietest), en BTW-berekening op 21%.”— Voorbeeldprompt voor het genereren van unit tests

Wanneer unit tests schrijven: Na het bouwen van elke functie die berekeningen doet, data transformeert, of business logica bevat. Je hoeft niet elke knop en elk UI-element te unit-testen. Focus op de logica.

Niveau 3: End-to-end tests (de gebruikersreis)

End-to-end tests simuleren een echte gebruiker die door je app navigeert. Ze openen een browser, klikken op knoppen, vullen formulieren in en controleren of het resultaat klopt. Dit is het meest waardevolle type test, maar ook het meest tijdrovend om op te zetten.

Wanneer end-to-end tests schrijven: Voor je kritieke gebruikersflows. Als je app een facturatietool is: test het complete pad van inloggen, factuur aanmaken, opslaan en terugvinden. Als een van die stappen breekt, wil je dat weten voor je gebruikers het merken.

Geen tijd voor alles? Dit is de volgorde:
1. Handmatig testen na elke wijziging (altijd, zonder uitzondering)
2. Unit tests voor je kernlogica (BTW-berekening, datumlogica, autorisatie)
3. End-to-end test voor je belangrijkste gebruikersflow

Als je alleen niveau 1 doet, ben je al beter af dan 90% van de vibe coders.

Vibe testing: de volgende stap

Net zoals vibe coden je laat programmeren in gewone taal, laat vibe testing je testen in gewone taal. Je beschrijft wat je wilt testen, en een AI-agent voert de test uit in een echte browser, precies zoals een menselijke tester dat zou doen.

Dit is geen toekomstmuziek. De tools bestaan nu en ze zijn in 2026 volwassen genoeg voor serieus gebruik.

Hoe het werkt

In plaats van testcode te schrijven, beschrijf je je test in gewone taal:

“Open de app. Log in als testgebruiker. Maak een nieuwe factuur aan voor 'Demo BV' met twee factuurregels. Controleer dat het totaalbedrag correct is. Sla de factuur op. Ga naar het dashboard en controleer dat de factuur in de lijst staat.”— Voorbeeld van een vibe test in gewone taal

De AI-agent opent een echte browser, navigeert je app, voert de stappen uit en rapporteert of alles werkt. Als iets faalt, krijg je een screenshot van waar het misging en een beschrijving van het probleem.

ToolWat het doetKenmerken
Playwright + AIOpen-source testframework van Microsoft. In combinatie met AI kun je tests genereren vanuit beschrijvingen.Gratis, alle browsers, CI/CD-integratie, industriestandaard
testRigorEen van de eerste echte vibe testing platforms. Je schrijft tests in gewoon Engels.Gewone taal, self-healing, visuele rapportages
AutifyNo-code testautomatisering voor web en mobiel. Tests opnemen door je app te gebruiken.Opnemen door te klikken, AI-onderhoud, niet-technisch
Begin met Playwright. Het is gratis, het is de industriestandaard, en je kunt de AI je tests laten genereren. Zodra je meer dan tien tests hebt en onderhoud een last wordt, kijk dan naar testRigor of Autify.

De test-per-prompt workflow

De meest effectieve testaanpak voor vibe coders is simpel: test na elke prompt. Niet aan het einde van de dag, niet voor de deploy, maar na elke individuele wijziging.

Stap 1: Schrijf je prompt

Beschrijf wat je wilt bouwen of wijzigen (zie Module 5 voor prompttechnieken).

Stap 2: Bekijk het resultaat

Lees de gegenereerde code. Je hoeft niet elke regel te begrijpen, maar scan op dingen die niet kloppen: ontbrekende validatie, hardcoded waarden, functies die verdacht lang zijn.

Stap 3: Test handmatig

Open je app. Werkt de wijziging? Test het normale pad (het werkt zoals verwacht) en het abnormale pad (wat gebeurt er bij foute input, lege velden, of onverwachte acties?).

Stap 4: Laat AI een test schrijven

Na elke significante feature, vraag de AI om een test te schrijven die controleert of de feature werkt.

“De factuur-exportfunctie werkt nu. Schrijf een unit test die controleert dat: 1) een factuur correct wordt geëxporteerd als PDF, 2) het PDF-bestand de juiste bestandsnaam heeft (factuurnummer + datum), 3) exporteren van een lege factuur een foutmelding geeft, 4) alle verplichte velden aanwezig zijn in de PDF.”— Voorbeeldprompt voor het genereren van een featuretest

Stap 5: Draai alle bestaande tests

Niet alleen de nieuwe test, maar alle tests. Elke keer. Dit vangt de verrassingsbugs: wijzigingen die onbedoeld iets anders breken.

Stap 6: Commit en ga verder

Alles werkt? Commit naar Git. Ga door naar de volgende prompt. Als iets niet werkt: fix het nu, niet later.

Tijdsinschatting: Deze workflow voegt 2–5 minuten per prompt toe. Bij 20 prompts per sessie is dat 40–100 minuten extra. Maar het bespaart je uren aan debuggen en de zekerheid dat je app werkt is het meer dan waard.

Focus je testtijd: wat ertoe doet

Je kunt niet alles testen. Dat is ook niet nodig. De kunst is focus aanbrengen op de dingen die het meest impact hebben als ze falen.

Altijd testen

  • Authenticatie en autorisatie — Kan een gebruiker inloggen? Kan een uitgelogde gebruiker beschermde pagina's bereiken? Kan gebruiker A de data van gebruiker B zien?
  • De kernfunctie — De ene actie die je app bestaansrecht geeft. Test dit pad volledig, van begin tot eind.
  • Data-integriteit — Wordt data correct opgeslagen, opgehaald en weergegeven? Een factuur van € 1.000 die als € 100 wordt opgeslagen is een ernstige bug.
  • Formuliervalidatie — Lege velden, foute formaten, te lange input, speciale tekens.
  • Betalingsflows — Test elke stap van het betalingsproces, inclusief wat er gebeurt als een betaling faalt halverwege.

Mag je overslaan (voor nu)

  • Pixel-perfecte styling — Of een knop 2 pixels naar links staat maakt niet uit zolang hij werkt.
  • Elk mogelijk browsertype — Test in Chrome en op mobiel. Dat dekt 85% van je gebruikers.
  • Performance-optimalisatie — Tenzij je app merkbaar traag is, is dit iets voor wanneer je meer dan duizend gebruikers hebt.
  • 100% code coverage — Code coverage is een nuttige metric, maar 100% is een doel dat meer kost dan het oplevert. Streef naar het testen van je risicogebieden, niet naar een getal.

De pre-deploy checklist

Voor elke deploy naar productie, loop deze checklist af. Print hem uit, hang hem naast je scherm, en sla hem nooit over.

Functionaliteit

  • De kernfunctie werkt volledig (handmatig getest)
  • Alle formulieren valideren correct (lege velden, foute input)
  • Navigatie werkt (elke link, elke knop)
  • De app werkt op mobiel (test op een echt apparaat of via devtools)
  • Foutmeldingen zijn duidelijk en helpend (niet “Error 500”)
  • Lege states zijn afgehandeld (wat ziet een nieuwe gebruiker?)

Beveiliging

  • Geen API-keys of secrets in de code (zoek op hardcoded strings)
  • Row Level Security is ingeschakeld in Supabase
  • Gebruikers kunnen alleen hun eigen data benaderen
  • Input wordt gevalideerd aan zowel de client- als server-kant
  • HTTPS is actief

Data

  • Data wordt correct opgeslagen (maak een testrecord, controleer in de database)
  • Data wordt correct weergegeven (klopt wat je ziet met wat er in de database staat?)
  • Verwijderen werkt (en is onomkeerbaar of met bevestiging)
  • Geen testdata meer in de productiedatabase

Performance & deployment

  • Pagina's laden binnen 3 seconden
  • Geen eindeloze laadspinners
  • Geen console-errors in de browser developer tools
  • Alle environment variables zijn ingesteld in het deployment platform
  • De productie-URL werkt (niet alleen de preview-URL)
  • Git is up-to-date (alle wijzigingen gecommit en gepusht)
Laat de AI je helpen met de checklist: “Review mijn codebase voor deployment-gereedheid. Controleer op: 1) hardcoded API keys of secrets, 2) console.log statements die verwijderd moeten worden, 3) ontbrekende error handling in async functies, 4) TODO of FIXME comments die nog open staan, 5) ontbrekende input validatie, 6) TypeScript 'any' types die specifiek gemaakt moeten worden. Geef een go/no-go advies met onderbouwing per punt.”

Automatisch testen bij elke deploy

Tot nu toe heb je handmatig en lokaal getest. Maar wat als je tests automatisch draaien elke keer dat je code pusht? Dat is continuous testing, en het is makkelijker op te zetten dan je denkt.

Wat is continuous testing?

Elke keer dat je code pusht naar GitHub, draait een systeem automatisch al je tests. Als een test faalt, krijg je een melding en wordt de deploy geblokkeerd. Geen kapotte code meer in productie.

Hoe zet je het op?

De meeste vibe coders gebruiken GitHub Actions. Het is gratis voor publieke repositories en heeft een genereuze gratis tier voor private repositories.

“Maak een GitHub Actions workflow die bij elke push naar main: 1) de dependencies installeert (npm ci), 2) TypeScript type-checking draait (npx tsc --noEmit), 3) de linter draait (npx eslint .), 4) alle unit tests draait (npx vitest run), 5) het project bouwt (npm run build). Als een stap faalt, moet de hele workflow falen en mag de deploy niet doorgaan.”— Voorbeeldprompt voor een CI/CD pipeline

De workflow draait nu automatisch bij elke push. Je ziet een groen vinkje als alles slaagt en een rood kruisje als iets faalt. Vercel en Netlify respecteren deze checks: als de tests falen, wordt niet gedeployed.

Elke keer dat je een nieuwe feature bouwt en daar een test voor schrijft, wordt die test automatisch meegenomen in de workflow. Je testsuite groeit organisch met je project.

Tijdsinvestering: Het opzetten van continuous testing kost eenmalig 15–30 minuten. Daarna draait het automatisch. Het is een van de hoogste-rendement investeringen die je als solo-builder kunt doen.

Denk als je gebruiker, niet als de bouwer

De grootste blinde vlek van elke bouwer is dat je weet hoe je app werkt. Je test altijd het “gelukkige pad”: de route die je hebt ontworpen. Maar je gebruikers nemen routes die je nooit hebt bedacht.

De chaos-test

Open je app en doe bewust dingen die je niet “hoort” te doen:

  • Klik vijf keer snel achter elkaar op dezelfde knop
  • Vul een formulier half in en navigeer weg. Ga terug. Wat gebeurt er?
  • Open dezelfde pagina in twee tabbladen en maak tegelijkertijd wijzigingen
  • Gebruik de terug-knop van je browser op onverwachte momenten
  • Vul emoji's, speciale tekens of extreem lange teksten in
  • Probeer een URL direct te bezoeken zonder ingelogd te zijn

De oma-test

Vraag iemand die niets van technologie weet om je app te gebruiken. Geef geen instructies. Kijk mee. Waar klikken ze? Waar aarzelen ze? Waar raken ze gefrustreerd?

Dit is geen formele usability test. Het is een reality check. Als je oma het niet begrijpt, begrijpen je gebruikers het misschien ook niet.

De concurrent-test

Stel je voor dat iemand je app wil saboteren. Wat zouden ze proberen?

  • Kunnen ze data van andere gebruikers zien door URL's aan te passen?
  • Kunnen ze formuliervalidatie omzeilen?
  • Kunnen ze meer doen dan waarvoor ze geautoriseerd zijn?
  • Wat gebeurt er als ze requests manipuleren?

Je hoeft geen beveiligingsexpert te zijn om deze vragen te stellen. Het stellen van de vraag is vaak al genoeg om het probleem te vinden.

Je testplan in vijf minuten

Je hoeft geen uitgebreid testdocument te schrijven. Dit simpele template is genoeg. Vul het in voor je project, hang het naast je scherm, en volg het bij elke deploy.

OnderdeelInvullen voor jouw project
KernfunctieDe ene actie die altijd moet werken (bijv. factuur aanmaken, boeking plaatsen)
Kritieke padenDe 3 belangrijkste gebruikersflows (bijv. registreren → inloggen → dashboard zien)
Unit testsFuncties met business logica (bijv. BTW-berekening, datumformattering, autorisatiecheck)
BeveiligingstestsNiet-ingelogde gebruiker kan geen beschermde pagina's zien, gebruiker A kan niet bij data van gebruiker B, formulierinput wordt gevalideerd
Pre-deployVolledige pre-deploy checklist doorlopen (zie hierboven)

Begin vandaag met testen

Testen hoeft niet ingewikkeld te zijn. Begin met het simpelste niveau: test handmatig na elke wijziging. Dat is al beter dan wat de meeste vibe coders doen. Voeg daarna stap voor stap toe: een unit test hier, een end-to-end test daar, en uiteindelijk een automatische pipeline die alles voor je controleert.

De beste test is de test die je daadwerkelijk uitvoert. Een simpel testplan dat je volgt, is beter dan een uitgebreid testplan dat in een la ligt.