Privacy en Cookies

Voor een volledige werking plaatst deze website cookies op uw computer. Daarnaast worden cookies geplaatst voor het bijhouden van bezoekersgedrag binnen Google Analytics. Deze informatie helpt ons bij het verbeteren van onze website. De cookies bevatten anonieme informatie en blijven maximaal 2 jaar in uw browser aanwezig. Lees meer

E2E-tests schrijven met AI

Het schrijven van een goede E2E-test met een degelijke page object, correcte locators, gedeelde fixtures, naleving van lintregels en een review volgens de huidige framework best practices kost een senior engineer één tot twee uur per test. Voor een complexe applicatie met tientallen kritieke flows werkt de rekensom zelden in het voordeel van testen.

Dat veranderde toen we AI begonnen te gebruiken als actieve deelnemer bij het schrijven en onderhouden van onze E2E-testsuites. In meerdere projecten gebruiken we nu Claude Code, een AI-agent van Anthropic voor software-engineering, samen met Playwright en TypeScript om geautomatiseerde testdekking op te bouwen in een tempo dat eerder niet haalbaar was.

Waarom E2E-testen belangrijk zijn

Unit- en integratietests verifiëren dat afzonderlijke codeonderdelen in isolatie werken. Ze zijn snel en populair bij ontwikkelaars, maar ze kunnen niet de bredere vraag beantwoorden die voor een gebruiker telt: werkt de volledige flow, van begin tot eind, in een echte browser?

In complexe webapplicaties beslaan de meest kritieke paden – zoals meerstapsworkflows, externe integraties en rijke UI-componenten – meerdere lagen. Een bewerking kan starten in een kalender, door een formulier gaan met dropdown-afhankelijkheden en eindigen met een gegenereerd document dat de juiste regels moet bevatten. Een unit test kan een regressie in die keten niet detecteren. Een handmatige tester wel, maar niet bij elke pull request, niet in elke browser en niet zonder dat dit op termijn veel extra werk oplevert.

E2E-tests vullen dat gat door exact te simuleren wat een echte gebruiker doet: de browser openen, inloggen, navigeren, formulieren invullen en controleren of de juiste elementen op het scherm verschijnen.

De waarde voor het team is concreet:

De waarde voor het team is concreet:

  • Automatische regressiebescherming: een test die één keer is geschreven, draait automatisch bij elke release.
  • Snellere feedback: een kapotte flow komt direct naar voren in CI, niet pas dagen later tijdens een QA-sessie.
  • Vertrouwen om te releasen: een groen testsuite betekent dat het team kan deployen zonder angst voor stille regressies.
  • Dataconsistentie: zorgt ervoor dat locatorstrategieën, stapbenamingen en de structuur van page objects uniform zijn.

Hoe werkt het?

Het proces begint met het schrijven van een gedetailleerd CLAUDE.md-instructiebestand in de root van het testproject. Dit bestand wordt door Claude Code bij het begin van elke sessie gelezen en legt de conventies van het project vast: de locatorhiërarchie, naamgevingsregels, het page object model, verboden patronen en de structuur van de CI-pipeline.

De workflow voor het toevoegen van een nieuwe test ziet er als volgt uit:

  1. Beschrijf de user flow die getest moet worden in gewone taal.
  2. Claude genereert het page object, de fixture-registratie en het spec-bestand op basis van onze instructies.
  3. De tests draaien; eventuele fouten worden in dezelfde sessie geanalyseerd en opgelost.
  4. Npm run lint wordt automatisch uitgevoerd; alle issues worden opgelost voordat de sessie eindigt.
  5. Claude raadpleegt de actuele Playwright-documentatie via een MCP-integratie om de implementatie te verifiëren tegen framework best practices en past alles aan wat verouderd is.
De workflow voor het toevoegen van een nieuwe test ziet er als volgt uit:

Promptstrategie

De prompts die goed werken zijn beschrijvingen in de stijl van een handmatige testcase:

"Test dat een gebruiker een nieuwe taak kan aanmaken door het onderwerp, de beschrijving en de vervaldatum in te vullen, een ontvanger te selecteren via een dropdown, op te slaan en vervolgens te verifiëren dat de taak verschijnt in het accordionpaneel onder het juiste dier."

Claude leest dit samen met het instructiebestand en genereert een page object met private read-only locators, een fixture entry en een spec-bestand dat de Arrange-Act-Assert-structuur volgt met test.step()-blokken – precies zoals het team dit handmatig zou schrijven.

Voor pagina’s die al een page object hebben, verwijst de prompt daarnaar:
"Breid de bestaande TaskPage uit om een bewerkflow toe te voegen via het contextmenu."
Claude leest het bestaande bestand, volgt de bestaande patronen en voegt alleen toe wat nodig is, zonder refactoring, nieuwe abstracties of scope creep.

Itereren op fouten

Wanneer een gegenereerde test bij de eerste run faalt, wordt de foutoutput teruggegeven aan Claude. Hij leest de fout, bepaalt of het probleem ligt bij een locator, timing of logica en stelt een gerichte oplossing voor. Dit iteratieve proces verloopt aanzienlijk sneller wanneer AI deel uitmaakt van de loop dan wanneer failures handmatig worden geanalyseerd.

Voorbeeld: als een locator nog niet bestaat in de applicatie, signaleert Claude dit en stelt voor om een data-testid-attribuut toe te voegen aan de Angular-template. Dit houdt de testcode schoon en verbetert tegelijkertijd de testbaarheid van de applicatie.

Technische basis

Technische basis

  • Page Objects: de UI is ingekapseld in een klasse met private read-only locators en publieke actie/assertiemethoden
  • Custom Fixtures: dependency injection regelt setup en authenticatie vóór elke test
  • Duidelijke locatorhiërarchie: testId → role → label/placeholder
  • Testdata is gecentraliseerd in JSON-bestanden met unieke ID’s voor parallelle runs
  • CI-integratie: Azure DevOps draait met retries en rapportage voor pipeline-dashboards, zodat tests parallel draaien met een zichtbare browser

Voordelen

  • Dekking: door het verminderen van testinspanning blijft er meer tijd over voor kritieke flows, wat leidt tot hogere stabiliteit
  • Regressiedetectie: kritieke flows draaien nu bij elke commit
  • Eenvoudigere onboarding: nieuwe teamleden kunnen de testsuite lezen om te begrijpen hoe functionaliteit zich hoort te gedragen
  • Snellere UI-updates: wijzigingen zijn beperkt tot page objects, waardoor updates snel en voorspelbaar zijn