Database seeding voor demo's en QA zonder PII
Database seeding voor demo's en QA: hoe je realistische, herhaalbare datasets maakt en tegelijk PII beschermt met anonimisatie en scenario-gebaseerde seed-scripts.

Waarom seeded data belangrijk is voor demo's en QA
Lege apps zijn moeilijk te beoordelen. In een demo maakt een lege tabel en een paar “John Doe”-records zelfs van een sterk product iets onafgewerkt. Mensen zien de workflow, de randgevallen of het resultaat niet.
Bij QA werkt het hetzelfde. Met dunne of betekenisloze data blijven tests op de happy path en verbergen bugs zich totdat echte klanten echte complexiteit brengen.
Het probleem: “realistische” data begint vaak als een kopie van productie. Dat is ook hoe teams privégegevens lekken.
PII (persoonsidentificeerbare informatie) is alles wat een persoon direct of indirect kan identificeren: volledige namen, e-mails, telefoonnummers, thuisadressen, overheids-ID’s, klantnotities, IP-adressen, precieze locatiegegevens en zelfs unieke combinaties zoals geboortedatum plus postcode.
Goede demo- en QA-seeddata balanceert drie doelen:
- Realiteit: het lijkt op wat het bedrijf echt verwerkt (verschillende statussen, tijdstempels, fouten, uitzonderingen).
- Herhaalbaarheid: je kunt dezelfde dataset op aanvraag opnieuw maken, in minuten, voor elke omgeving.
- Veiligheid: geen echte klantdata en geen “bijna geanonimiseerde” restanten.
Behandel testdata als een productasset. Het heeft eigenaarschap nodig, een duidelijke standaard voor wat is toegestaan en een plek in je releaseproces. Wanneer je schema verandert, moet je seeddata ook veranderen, anders breekt je demo en wordt QA onbetrouwbaar.
Als je apps bouwt met tools zoals AppMaster, tonen seeded datasets ook end-to-end flows. Authenticatie, rollen, bedrijfsprocessen en UI-schermen worden begrijpelijker wanneer ze worden gebruikt door geloofwaardige records. Goed gedaan, wordt seeded data de snelste manier om je app te laten zien, testen en vertrouwen zonder iemands privacy in gevaar te brengen.
Waar demo- en QA-data meestal vandaan komt (en waarom het misgaat)
De meeste teams willen hetzelfde: data die echt aanvoelt, snel laadt en veilig te delen is. Het snelste pad naar “realistisch” is vaak het risicovolste.
Veelvoorkomende bronnen zijn productiekopieën (volledig of gedeeltelijk), oude spreadsheets van operations of finance, datasets van derden en willekeurige generators die namen, e-mails en adressen uitspugen.
Productiekopieën gaan mis omdat ze echte mensen bevatten. Zelfs als je voor de hand liggende velden zoals e-mail, telefoon en adres verwijdert, kun je identiteit lekken via combinaties (functie + kleine stad + unieke notities) of via kolommen en tabellen waar je niet aan dacht. Het veroorzaakt ook compliance- en vertrouwensproblemen: één screenshot in een salesgesprek kan een meldingsplichtig incident worden.
Verborgen PII is de gebruikelijke boosdoener omdat het niet in nette kolommen leeft. Let op vrij-tekstvelden (notities, “omschrijving”, chattranscripten), bijlagen (PDF's, afbeeldingen, geëxporteerde rapporten), supporttickets en interne opmerkingen, audit trails en logs die in de database staan en “extra” JSON-blobs of geïmporteerde metadata.
Een andere bron van problemen is het gebruik van het verkeerde soort dataset voor de taak. QA heeft randgevallen en kapotte staten nodig. Salesdemos hebben een schoon verhaal met happy-path records. Support en onboarding hebben herkenbare workflows en labels nodig. Training heeft herhaalbare oefeningen nodig waarbij elke deelnemer dezelfde stappen ziet.
Een simpel voorbeeld: een customer support-demo gebruikt “voor de snelheid” een echte Zendesk-export. De export bevat berichtteksten, handtekeningen en geplakte screenshots. Zelfs als je e-mailadressen maskeert, kan de berichttekst nog steeds volledige namen, ordernummers of afleveradressen bevatten. Zo wordt “veilig genoeg” onveilig.
Stel je dataregels voordat je iets genereert
Voordat je testdata maakt, noteer een paar simpele regels. Dit voorkomt de meest voorkomende fout: iemand kopieert productie “voor nu” en het verspreidt zich stilletjes.
Begin met een harde grens bij PII. De veiligste standaard is simpel: niets in de dataset mag toebehoren aan een echt persoon, klant of medewerker. Dat omvat voor de hand liggende velden, maar ook “bijna PII” die iemand nog steeds kan identificeren wanneer gecombineerd.
Een praktische minimale regelset:
- Geen echte namen, e-mails, telefoonnummers, ID’s, adressen of betaalgegevens.
- Geen gekopieerde tekst uit echte tickets, chats, notities of oproeplogs.
- Geen echte bedrijfsnamen als je app door een kleine set klanten wordt gebruikt.
- Geen echte apparaat-ID’s, IP's of locatie-sporen.
- Geen “verborgen” PII in bijlagen, afbeeldingen of vrij-tekstvelden.
Bepaal daarna wat echt realistisch moet lijken en wat vereenvoudigd kan worden. Formats zijn meestal belangrijk (e-mailvorm, telefoonlengte, postcodes) en relaties zijn nog belangrijker (orders hebben klanten nodig, tickets hebben agents nodig, facturen hebben regelitems). Veel details kunnen echter worden teruggebracht zolang de flows nog werken.
Definieer dataset-grootte tiers vooraf zodat mensen er later niet over hoeven te discussiëren. Een klein “smoke”-dataset moet snel laden en de kernpaden dekken. Een normale QA-set moet typische statussen en rollen dekken. Een zware set is voor performancechecks en moet doelbewust worden gebruikt, niet bij elke build.
Label tenslotte elke dataset zodat het zichzelf uitlegt wanneer het in een omgeving verschijnt: de datasetnaam en beoogd gebruik (demo, QA, perf), een versie die bij de app of het schema past, wanneer het is gemaakt en wat synthetisch is versus geanonimiseerd.
Als je een platform zoals AppMaster gebruikt, houd deze regels dan naast het seedproces zodat geregenereerde apps en geregenereerde data op elkaar afgestemd blijven naarmate het model verandert.
Anonimiseringsmethoden die data realistisch houden
Het doel is helder: data moet eruitzien en zich gedragen als het echte leven, maar nooit naar een echt persoon verwijzen.
Drie termen raken vaak door elkaar:
- Masking verandert hoe een waarde eruitziet (vaak alleen voor weergave).
- Pseudonimisering vervangt identifiers door consistente plaatsvervangers zodat records nog steeds over tabellen heen verbonden blijven.
- Echte anonimisatie verwijdert de mogelijkheid om iemand te her-identificeren, zelfs wanneer data gecombineerd wordt.
Houd de vorm, verander de betekenis
Format-preserving masking houdt hetzelfde “gevoel” zodat UI en validaties nog werken. Een goede fake-e-mail heeft nog steeds een @ en een domein, en een goed fake-telefoonnummer voldoet aan het door je app toegestane formaat.
Voorbeelden:
- E-mail:
[email protected]->[email protected] - Telefoon:
+1 (415) 555-0199->+1 (415) 555-7423 - Adresregel:
742 Evergreen Terrace->615 Pine Street
Dit is beter dan xxxxxx omdat sorteren, zoeken en foutafhandeling zich meer als productie gedragen.
Gebruik tokenisatie om relaties intact te houden
Tokenisatie is een praktische manier om consistente vervangingen over tabellen heen te krijgen. Als één klant voorkomt in Orders, Tickets en Messages, moet die overal dezelfde fake klant worden.
Een eenvoudige aanpak is om een token per oorspronkelijke waarde te genereren en die in een mappingtabel op te slaan (of een deterministische functie te gebruiken). Zo map je customer_id=123 altijd naar dezelfde nepnaam, e-mail en telefoon, en werken joins nog steeds.
Denk ook: “maak niemand niet per ongeluk uniek.” Zelfs als je namen verwijdert, kan een zeldzame functietitel plus een klein stadje plus een exacte geboortedatum naar één persoon wijzen. Mik op groepen vergelijkbare records: rond datums af, groepeer leeftijden en vermijd zeldzame combinaties die opvallen.
PII-hotspots om te scrubben (inclusief wat mensen vergeten)
De voor de hand liggende velden (naam, e-mail) zijn maar de helft van het probleem. Risico zit vaak verborgen op plekken die onpersoonlijk lijken totdat je ze combineert.
Een praktisch begin is een mappingschema van veelvoorkomende PII-velden naar veilige vervangingen. Gebruik consistente vervangingen zodat de data zich nog steeds als echte records gedraagt.
| Field type | Veelvoorkomende voorbeelden | Idee voor veilige vervanging |
|---|---|---|
| Namen | first_name, last_name, full_name | Gegeneerde namen uit een vaste lijst (seeded RNG) |
| E-mails | email, contact_email | example+{id}@demo.local |
| Telefoons | phone, mobile | Valid-uitziende maar niet-routrbare patronen (bijv. 555-01xx) |
| Adressen | street, city, zip | Template-adressen per regio (geen echte straatnamen) |
| Netwerk-ID's | IP, device_id, user_agent | Vervangen door canned waardes per apparaattype |
Vrij-tekstvelden zijn waar PII het meest lekt. Supporttickets, chatberichten, “notities” en “omschrijving”-velden kunnen namen, telefoonnummers, accountnummers en zelfs geplakte screenshots bevatten. Kies voor elk veld één aanpak en houd je eraan: redacteer patronen, vervang met korte sjablonen of genereer onschuldige zinnen die bij de toon passen (klacht, terugbetaling, bugrapport).
Bestanden en afbeeldingen hebben hun eigen behandeling nodig. Vervang uploads door placeholders en strip metadata (EXIF in foto’s bevat vaak locatie en tijdstempels). Controleer ook PDF's, bijlagen en avatarafbeeldingen.
Let tenslotte op re-identificatie. Ongebruikelijke functietitels, exacte verjaardagen, zeldzame postcode+leeftijd-combinaties en kleine afdelingen kunnen naar één persoon wijzen. Generaliseer waarden (maand/jaar in plaats van volledige datum, bredere functiefamilies) en vermijd unieke records in kleine datasets.
Maak seeddata herhaalbaar en makkelijk opnieuw op te bouwen
Als je seeddata elke keer willekeurig is, worden demos en QA-runs lastig om op te vertrouwen. Een bug kan verdwijnen omdat de data veranderde. Een demo-flow die gisteren werkte, kan vandaag breken omdat een cruciaal record ontbreekt.
Behandel seeddata als een build-artifact, niet als een eenmalig script.
Gebruik deterministische generatie (niet pure random)
Genereer data met een vaste seed en regels die altijd hetzelfde resultaat opleveren. Dat geeft stabiele IDs, voorspelbare datums en consistente relaties.
Een praktisch patroon:
- Eén vaste seed per dataset (demo, qa-small, qa-large).
- Deterministische generators (zelfde inputregels, dezelfde resultaten).
- Tijd verankerd aan een referentiedatum zodat “laatste 7 dagen” zinvol blijft.
Maak seed-scripts idempotent
Idempotent betekent veilig om meerdere keren uit te voeren. Dit is belangrijk wanneer QA omgevingen vaak herbouwt of wanneer een demo-database wordt gereset.
Gebruik upserts, stabiele natuurlijke sleutels en expliciete opruimregels. Bijvoorbeeld: insert een “demo” tenant met een bekende sleutel, en upsert dan gebruikers, tickets en orders. Als je deletes nodig hebt, scope die dan nauw (alleen de demo-tenant) zodat je nooit per ongeluk gedeelde data wist.
Versieer je dataset samen met je app. Als QA een bug rapporteert, moeten ze kunnen zeggen “app v1.8.3 + seed v12” en het exact reproduceren.
Bouw scenario-gebaseerde datasets die aansluiten op echte workflows
Willekeurige rijen zijn makkelijk te genereren, maar demo'en zelden goed. Een goede dataset vertelt een verhaal: wie de gebruikers zijn, wat ze proberen te doen en wat er mis kan gaan.
Begin met je schema en relaties, niet met nep-namen. Als je een visuele schema-tool zoals AppMaster’s Data Designer gebruikt, loop dan elk entity na en vraag: wat bestaat er eerst in de echte wereld en wat hangt ervan af?
Een eenvoudige volgorde voorkomt gebroken referenties:
- Maak organisaties of accounts eerst.
- Voeg gebruikers en rollen toe.
- Genereer kernobjecten (tickets, orders, facturen, berichten).
- Voeg afhankelijke records toe (comments, regelitems, bijlagen, events).
- Sluit af met logs en notificaties.
Maak het daarna scenario-gebaseerd. In plaats van “10.000 orders” maak een handvol complete journeys die bij echte workflows passen. Eén klant schrijft zich in, upgrade, opent een supportticket en krijgt een terugbetaling. Een ander voltooit onboarding niet. Weer een ander wordt geblokkeerd door een openstaande betaling.
Voeg opzettelijk randgevallen toe. Meng ontbrekende optionele velden, heel lange waarden (bijv. een adresregel van 500 tekens), uitzonderlijk grote nummers en records die naar oudere versies van data verwijzen.
Statustransities zijn ook belangrijk. Seed entiteiten over meerdere statussen zodat schermen en filters iets hebben om te tonen: New, Active, Suspended, Overdue, Archived.
Wanneer seeddata rond verhalen en statussen is opgebouwd, kan QA de juiste paden testen en kunnen demo's echte uitkomsten laten zien zonder productiegegevens te gebruiken.
Voorbeeld: een realistische dataset voor een customer support-demo
Stel je een eenvoudig supportdashboard voor: agents loggen in, zien een wachtrij met tickets, openen er één, antwoorden en sluiten het. Een goede seedset maakt die flow geloofwaardig zonder echte klantdata in een demo te trekken.
Begin met een klein gezelschap: 25 klanten, 6 agents en ongeveer 120 tickets verdeeld over de laatste 30 dagen. Het doel is niet volume, maar variatie die lijkt op hoe support er op een dinsdagmiddag uitziet.
Wat echt realistisch moet aanvoelen is het patroon, niet de identiteit. Houd namen, e-mails en telefoonnummers synthetisch, maar laat de rest zich gedragen als productie. De “vorm” van de data is wat het verhaal verkoopt.
Neem op:
- Tijdstempels die logisch zijn: pieken tijdens kantooruren, rustige nachten, een paar oudere tickets die nog open zijn.
- Statusprogressie: New -> In Progress -> Waiting on Customer -> Resolved, met realistische tijdsintervallen.
- Toewijzingen: bepaalde agents behandelen bepaalde categorieën (billing vs technical), met af en toe een overdracht.
- Conversatiedraden: 2–6 opmerkingen per ticket, met bijlagen als nep-bestandsnamen.
- Gerelateerde records: klantplan, laatste login en een lichte orders- of facturentabel voor context.
Voeg een paar opzettelijke problemen toe om de lastige delen te testen: twee klanten die op elkaar lijken (zelfde bedrijfsnaam, verschillende contactpersonen), een mislukte betaling die een account blokkeert en één vergrendeld account dat een unlock-workflow triggert.
Nu kan dezelfde dataset een demo-script aandrijven (“toon een geblokkeerde gebruiker en los het op”) en een QA-testcase (verifieer statuswijzigingen, permissies en notificaties).
Dataset-grootte bepalen zonder elke build te vertragen
De beste demo-data is de kleinste dataset die de feature nog bewijst. Als elke rebuild 10 minuten duurt, stopt men met rebuilden. Verouderde data blijft bestaan en fouten sluipen in demo's.
Houd twee of drie datasetgroottes die verschillende taken bedienen. Gebruik hetzelfde schema en regels, maar wijzig het volume. Zo blijft dagelijks werk snel maar kun je nog steeds randgevallen zoals paginering en rapporten ondersteunen.
Een praktische manier om volumes te denken:
- Smoke/UI set (snel): 1 tenant, 5–10 gebruikers, 30–50 kernrecords (bijv. 40 tickets) om schermen en gangbare flows te controleren.
- Functionele set (realistisch): 3–5 tenants, 50–200 gebruikers totaal, 500–5.000 kernrecords om filters, role-based access en basisrapportage te dekken.
- Paginering/rapportage set: genoeg records om elke lijstweergave minstens 3 pagina's te laten zien (vaak 200–1.000 rijen per lijst).
- Performance set (apart): 10x–100x grotere volumes voor loadtesting, gegenereerd zonder PII en nooit gedeeld als een demo.
Variatie is belangrijker dan grootte. Voor een customer support-app is het meestal beter tickets over statussen (New, Assigned, Waiting, Resolved) en kanalen (email, chat) te verspreiden dan 50.000 identieke tickets te dumpen.
Houd distributies deterministisch. Bepaal vaste aantallen per tenant en per status, en genereer volgens regels in plaats van pure random. Bijvoorbeeld: per tenant seed je precies 20 New, 15 Assigned, 10 Waiting, 5 Resolved tickets, plus 2 overdue en 1 escalated. Deterministische data maakt tests stabiel en demo's voorspelbaar.
Veelgemaakte fouten en valkuilen met seeded demo-data
Het snelst werken aan een demo is ook het risicovolste: productie klonen, snel masken en denken dat het veilig is. Eén gemist veld (zoals een notitiekolom) kan namen, e-mails of interne opmerkingen lekken, en je merkt het misschien pas als iemand er een screenshot van maakt.
Een andere valkuil is de data te willekeurig maken. Als elke refresh nieuwe klanten, totals en randgevallen oplevert, kan QA runs niet vergelijken en voelen demo's inconsistent. Je wilt elke keer dezelfde basis, met kleine, gecontroleerde variaties.
Gebroken relaties komen vaak voor en zijn verrassend moeilijk te spotten. Een seed die vreemde sleutels negeert kan verweesde records of onmogelijke staten creëren. Schermen lijken misschien goed tot een knop een ontbrekend gerelateerd item laadt.
Fouten die later meestal het meeste pijn doen:
- Een productieclone als startpunt gebruiken en masken vertrouwen zonder verificatie.
- Waarden onafhankelijk per tabel genereren zodat relaties geen echte workflows weerspiegelen.
- Alles bij elke run overschrijven, waardoor een stabiele basis voor QA verdwijnt.
- Alleen happy paths seeden (geen annuleringen, terugbetalingen, retries, churn of mislukte betalingen).
- Seeddata als een eenmalige taak behandelen in plaats van het bijwerken als de app verandert.
Een simpel voorbeeld: een support-demo heeft 40 open tickets, maar geen enkele is heropend, geen enkele is geëscaleerd en geen enkele hoort bij een klant die churned. Het lijkt netjes tot iemand vraagt: “Wat gebeurt er als de klant annuleert na escalatie?”
Een snelle checklist voordat je een demo-omgeving deelt
Voordat je een demo naar een prospect stuurt of een QA-omgeving aan een ander team geeft, voer één snelle controle uit die ervan uitgaat dat er iets gemist zal worden. De data moet echt aanvoelen, zich als productie gedragen en toch veilig te delen zijn.
Vijf snelle controles die de meeste problemen vangen
- PII-snifftest: doorzoek de database en geëxporteerde bestanden op duidelijke markers zoals
@, veelvoorkomende telefoonvormen (10–15 cijfers, plus tekens, haakjes) en een korte lijst met eerste/achternaam die je team graag in tests gebruikt. Als je één echt-uitziend record vindt, ga ervan uit dat er meer zijn. - Relaties kloppen: open een paar kernschermen en bevestig dat vereiste links bestaan (elke ticket heeft een klant, elke order heeft regelitems, elke factuur heeft een betalingsstatus).
- Tijdsbereiken zien geloofwaardig uit: zorg dat datums verschillende periodes bestrijken (sommige records vandaag, andere vorige maand, weer andere vorig jaar). Als alles “5 minuten geleden” is gemaakt, zien grafieken en activiteitfeed er fake uit.
- Herhaalbaarheid en anchor-records: bouw twee keer opnieuw en bevestig dat je dezelfde aantallen en dezelfde anchor-records krijgt waarop je scenario's vertrouwen (een VIP-klant, een achterstallige factuur, een prioriteits-ticket).
- Verborgen datasources zijn schoon: scan logs, bestandsuploads, e-mail/SMS-templates, berichtgeschiedenissen en bijlagen. PII verbergt zich vaak in errortraces, CSV-imports, PDF-facturen en notities.
Als je demo's in AppMaster bouwt, past dit natuurlijk in een release-routine: regenereer de app, reseed en loop dan de checklist voordat iemand buiten je team toegang krijgt.
Volgende stappen: houd demo-datasets veilig en synchroon naarmate de app evolueert
Veilige demo-data is geen eenmalige taak. Apps veranderen, schema's schuiven en een “tijdelijke” export kan stilletjes een gedeelde omgeving worden. Het doel is van je demo- en QA-dataset iets te maken dat je op aanvraag kunt herbouwen, automatisch kunt verifiëren en als een bekende versie kunt uitrollen.
Een workflow die op de lange termijn standhoudt:
- Definieer een paar scenario's (de exacte journeys die je wilt tonen of testen).
- Genereer seeds vanuit die scenario's (niet vanuit productie-exports).
- Draai controles (PII-scans, sanity-checks, referentiële integriteit).
- Publiceer een datasetversie (tag het aan een appversie en houd een korte changelog bij).
- Herbouw regelmatig (of bij elke release) zodat drift vroeg wordt opgemerkt.
Schema, logica en seeds op één lijn houden is waar teams vaak moeite mee hebben. Als je datamodel verandert, kunnen seed-scripts breken of, nog erger, “werken” maar half-valide data produceren die bugs verbergt.
Met AppMaster is het vaak makkelijker om die onderdelen bij elkaar te houden omdat je datamodel (in de Data Designer) en workflows (in de Business Process Editor) naast de app staan die je genereert. Wanneer eisen veranderen, houdt regeneratie van de applicatie de code schoon en kun je het seedflow gelijktijdig bijwerken volgens dezelfde bedrijfsregels die je product gebruikt.
Om het veilig te houden naarmate het groeit, voeg een paar must-pass checks toe voordat een dataset wordt gedeeld: geen echte e-mails of telefoonnummers, geen vrij-tekstvelden gekopieerd uit productie en geen ID's die via andere systemen naar echte mensen verwijzen.
Kies één scenario (zoals “nieuwe klant maakt een ticket en support lost het op”), bouw een kleine PII-veilige seeddataset daarvoor, herbouw deze twee keer om te bevestigen dat hij herhaalbaar is en breid dan scenario voor scenario uit naarmate de app evolueert.
FAQ
Seeddata maakt de app completer en testbaar. Het laat mensen echte workflows, statussen en randgevallen zien in plaats van lege schermen of een paar tijdelijke records.
Begin niet standaard met productie. Gebruik synthetische data die past bij je schema en workflows, en voeg realistische verdelingen toe (statussen, tijdstempels, fouten) zodat het zich gedraagt als productie zonder iemands gegevens bloot te geven.
PII is alles wat iemand direct of indirect kan identificeren: namen, e-mails, telefoonnummers, adressen, ID’s, IP-adressen, precieze locaties en zelfs unieke combinaties zoals geboortedatum plus postcode. Vrij-tekstvelden en bijlagen zijn gebruikelijke plekken waar PII ongemerkt verschijnt.
Stel eenvoudige, niet-onderhandelbare regels op voordat je iets genereert. Een goede basisregel is “geen data mag toebehoren aan een echt persoon”, met duidelijke verboden op gekopieerde notities, tickets, chats en geüploade bestanden uit echte systemen.
Gebruik format-preserving masking als waarden er alleen geldig uit moeten zien, en tokenisatie of consistente pseudoniemen als relaties tussen tabellen intact moeten blijven. Vermijd vervangingen die per ongeluk unieke, traceerbare patronen creëren.
Werk met een vaste set veilige sjablonen voor notities, omschrijvingen, chats en opmerkingen, en genereer tekst op basis van die patronen. Voor bestanden: gebruik placeholder-bestandsnamen en verwijder metadata zodat je geen locatie of tijdstempels van echte uploads lekt.
Maak generatie deterministisch met een vaste seed en regels die altijd hetzelfde resultaat geven. Anchor tijd aan een referentiedatum zodat “laatste 7 dagen” betekenis houdt, en houd een datasetversie die overeenkomt met je app-/schema-versie.
Ontwerp je seedproces zodat het veilig meerdere keren kan draaien. Gebruik upserts en stabiele natuurlijke sleutels, en als je moet verwijderen, scope dit dan nauw (bijvoorbeeld alleen de demo-tenant) zodat je geen gedeelde data per ongeluk wist.
Bouw een klein aantal complete journeys, niet alleen willekeurige rijen. Creëer gebruikers, rollen, kernobjecten en afhankelijke records in een realistische volgorde, en seed meerdere statussen en opzettelijke randgevallen zodat schermen, filters en transities getest kunnen worden.
Houd een kleine “smoke”-dataset voor snelle rebuilds, een realistische functionele set voor dagelijkse QA en aparte grote datasets voor paginering en performancetesten. Geef de voorkeur aan variatie en gecontroleerde verdelingen boven puur volume zodat builds snel en voorspelbaar blijven.


