Test engineering, Testautomatisering, Tooling

Je kent het Arrange-Act-Assert-patroon (ook wel het AAA-patroon genoemd) misschien als een hulpmiddel voor het schrijven van unit tests. Maar met enige aanpassingen kan het ook een goed hulpmiddel zijn voor het schrijven van high-level tests, zoals end-to-end tests.

Het AAA-patroon

Een test geschreven met het AAA-patroon bestaat uit drie fases, namelijk:

Arrange – Act – Assert

Wanneer je Business Driven Development (BDD) toepast, worden deze fases Given – When – Then genoemd.

  • Arrange (ook wel Setup genoemd): Zorg ervoor dat de staat van je applicatie of code goed voorbereid is. Dit wil zeggen dat alles klaar moet zijn om de Act-fase uit te voeren. Voorbereidingen kunnen bijvoorbeeld het vullen van een database, het voorbereiden van een API-request, het aanmaken van een object of het creëren van een nieuw gebruikersaccount zijn.
  • Act: Voer de betreffende actie uit die je wilt testen.
  • Assert (ook wel Expect genoemd): Controleer of wat je in de Act-fase hebt uitgevoerd, werkt zoals verwacht. Als de test faalt, dan zou dit hier moeten gebeuren.

High-level tests

High-level tests bevinden zich hoog in de testpiramide. Een voorbeeld hiervan zijn end-to-end tests. Low-level tests bevinden zich onderin de testpiramide. Unit tests zijn een voorbeeld van low-level tests.

Herhaal Act en Assert

Bij low-level tests voer je elke fase – per test – precies één keer uit. Dit werkt goed vanwege de kleine Arrange-fase. De kleine Arrange-fase maakt het mogelijk om een proces met meerdere stappen op te splitsen in meerdere tests. High-level tests kunnen dit echter meestal niet.

Bij een high-level test moeten er meer puzzelstukjes op hun plaats vallen om de test te laten slagen. Hierdoor kan de Arrange-fase heel groot worden. Denk aan tijdrovende taken zoals het creëren van een nieuwe gebruiker, het resetten van een database of inloggen in de GUI. In deze situatie kun je de Act- en Assert-fases meerdere keren herhalen. Een high-level test kan er dan zo uit komen te zien:

Arrange – Act – Assert – Act – Assert – Act – Assert

Arrange – herhaal_wanneer_nodig (Act – Assert)

Op deze manier voer je de Arrange-fase één keer uit terwijl je meerdere gerelateerde zaken test. Je test dekt nu dus meerdere aspecten. Bij low-level tests is dit een anti-patroon, maar bij high-level tests kan het nodig zijn om verschillende zaken binnen een redelijke tijd te testen.

Hoe vaak je de Act- en Assert-fases herhaalt, hangt af van de balans tussen testduur, onderhoud-baarheid, begrijpelijkheid en debug-baarheid. Een goede balans tussen deze factoren kan de testautomatisering verbeteren.

Wanneer je alle features in één test samenvoegt, herhaal je Act en Assert-fases vaak. Dit is weliswaar goed voor de testduur, maar nadelig voor de onderhoud-baarheid, begrijpelijkheid en debug-baarheid. Aan de andere kant, als je Act en Assert nooit herhaalt, krijg je een langere testduur en onderhoudsproblemen door de benodigde herhaling van de Arrange-fases.

Houd als vuistregel aan dat je Act en Assert zo min mogelijk herhaalt. Wat mogelijk is, hangt af van jouw specifieke situatie.

"Arrange-Act-Assert (AAA-patroon) is niet alleen geschikt voor unit tests. Het werkt voor elke soort test, inclusief high-level tests."

Arrange als een Speedrun

Niet alle delen van een test zijn even nuttig. In de ideale wereld gebruiken onze testen alleen de Act- en Assert-fases. De Arrange-fase bestaat alleen zodat we later kunt Act-en. Besteed daarom zo min mogelijk tijd aan de Arrange-fase.

Arrange – Act – Assert

Doe in de Arrange-fase zo min mogelijk in de GUI, gebruik nep-data waar mogelijk, sla processtappen over wanneer dit kan én neem zoveel mogelijk shortcuts. Zo kun je snel door naar wat er echt toe doet: de Act- en Assert-fases.

Een veelvoorkomend voorbeeld zijn testgebruikers. Stel dat je de functionaliteit voor het aanpassen van wachtwoorden met een nieuw gebruikersaccount wilt testen. In deze test boeit alleen de wachtwoord aanpas functionaliteit ons. Het aanmaken van een nieuw account interesseert ons in dit geval niet. Je kunt de gebruiker via de registratieflow in de GUI maken, maar een betere aanpak is om het account direct in de database toe te voegen. Als dat moeilijk is, gebruik dan een API. “Maar Sander, de registratieflow moet ook getest worden!” Ja, maar in een andere test. Daar gaat het in dit geval niet om.

De Clean up-fase

Bij een low-level test, zoals een unit test, zit de volledige applicatie state in-memory. Dit betekent dat (meestal) de status automatisch wordt opgeschoond na je test. Bij high-level tests is dat niet het geval. Hier kun je een vierde fase aan toevoegen:

Arrange – Act – Assert – Clean up

In deze fase ruim je de data op die je tijdens de test hebt gemaakt. Dit kan bijvoorbeeld zijn: test data uit de database verwijderen of gecreëerde bestanden weggooien.

Andere methoden om testgegevens op te ruimen zijn:

  • Geplande clean up:
    Ruim op in een apart gepland proces. In tegenstelling tot de Clean up-fase hoef je dit slechts één keer in te richten, ongeacht het aantal tests. Bijvoorbeeld: stel dat je tests elke keer nieuwe gebruikers aanmaken; een clean up-proces verwijdert dagelijks testgebruikers ouder dan 7 dagen.
  • Dangling state:
    Ruim vlak voordat de volgende test start op, zodat de clean up onderdeel wordt van de Arrange-fase. Voor meer informatie, lees dan de Cypress-documentatie over dangling state.

Conclusie

Arrange-Act-Assert (AAA-patroon) is niet alleen geschikt voor unit tests. Het werkt voor elke soort test, inclusief high-level tests. Je kunt de Act- en Assert-fases herhalen, de shortcuts nemen in de Arrange-fase én een Clean up-fase toevoegen. Met deze aanpassingen kun je het AAA-patroon gebruiken voor de meest complexe tests.

 

Wil je ons nieuwste Paarsz magazine per post ontvangen? Laat dan je gegevens achter.

Ontwerp zonder titel (19)

Werken bij Bartosz?

Vincent Verhelst

Geïnteresseerd in Bartosz? Dan ga ik graag met jou in gesprek. We kunnen elkaar ontmoeten met een kop koffie bij ons op kantoor. Of tijdens ontbijt, lunch, borrel of diner op een plek die jou het beste uitkomt. Jij mag het zeggen.

Mijn Paarsz