Echte fout onderscheiden van onbetrouwbare test
Voer de test meerdere keren uit met herhalingspogingen uitgeschakeld en tel de resultaten. Bij een echte fout mislukt elke uitvoering op dezelfde manier; een onbetrouwbare test slaagt de ene keer en mislukt de andere keer zonder dat er iets is veranderd. Het onderstaande voorbeeld doet precies dat op elke machine met Playwright en laat vervolgens zien wat Nexus Studio met elk resultaat doet.
Door het Nexus Studio-team, Verdict System LLC. 27 oktober 2026.
Hoe kan ik ze binnen één minuut onderscheiden?
Voer de test meerdere keren achter elkaar uit met herhalingspogingen uitgeschakeld. In Playwright doe je dat met twee opties: --retries=0, zodat een herhalingspoging een mislukking niet kan verbergen, en --repeat-each=6, waarmee elke test zes keer wordt uitgevoerd. Tel vervolgens de resultaten van elke test.
- Elke keer mislukt: behandel dit als een fout totdat je het tegendeel kunt aantonen. Een mislukking bij elke uitvoering kan ook aan de omgeving liggen, zoals een geblokkeerd verzoek of een onbereikbare host, dus lees eerst de foutmelding.
- Soms geslaagd en soms mislukt: de test is onbetrouwbaar. De code en de test zijn tussen die uitvoeringen niet veranderd, dus er is iets instabiels in de toepassing of in de test.
- Elke keer geslaagd: voorlopig is er niets te zien. Een defect dat eens in de vijftig uitvoeringen optreedt, vereist meer uitvoeringen of een blik op de geschiedenis van de test.
Kan ik dit uitproberen met een uitvoerbaar voorbeeld?
Sla dit op als bug-or-flaky.spec.js. De eerste test simuleert onbetrouwbaar gedrag: één op de drie uitvoeringen mislukt. De tweede test betreft een echte fout: de pagina zegt "Welcome" en de test verwacht "Welcome back", dus geen enkele uitvoering kan slagen.
import { test, expect } from '@playwright/test';
// Fails on its first attempt of every third run, passes otherwise: a simulated flake.
test('flaky: a slow load now and then', async ({ page }, info) => {
await page.setContent('<h1>Welcome</h1>');
expect((info.repeatEachIndex + info.retry) % 3, 'simulated slow load').not.toBe(0);
});
// Fails the same way every time: the heading says "Welcome", the test expects "Welcome back".
test('real bug: wrong heading', async ({ page }) => {
await page.setContent('<h1>Welcome</h1>');
await expect(page.locator('h1')).toHaveText('Welcome back', { timeout: 300 });
});
Voer dit zes keer uit met herhalingspogingen uitgeschakeld:
npx playwright test --retries=0 --repeat-each=6
Playwright eindigt met 8 mislukte en 4 geslaagde uitvoeringen. Het aantal per test beantwoordt de vraag, en dat is wat de lijstreporter regel voor regel heeft weergegeven:
flaky: a slow load now and then 4 passed, 2 failed
real bug: wrong heading 0 passed, 6 failed
Voer dit nu één keer uit met twee herhalingspogingen:
npx playwright test --retries=2
Playwright eindigt met één test in elke groep. De onbetrouwbare test mislukte bij de eerste poging en slaagde bij herhalingspoging #1. De test met de echte fout mislukte bij alle drie de pogingen.
1 failed
bug-or-flaky.spec.js:10:1 › real bug: wrong heading
1 flaky
bug-or-flaky.spec.js:4:1 › flaky: a slow load now and then
Betekent een geslaagde herhalingspoging dat de toepassing in orde is?
Nee. Een geslaagde herhalingspoging vertelt je alleen dat de pogingen verschillende resultaten opleverden. Als de uitvoering groen wordt en niemand verder kijkt, wordt een sporadisch defect in de toepassing, zoals een raceconditie, gedeelde gegevens of een trage afhankelijkheid, onzichtbaar. Juist die defecten zijn vaak het duurst om op te sporen. Beschouw een onbetrouwbaar resultaat als een bevinding, niet als een geslaagde test die je kunt negeren, en ga er niet van uit dat de fout in de test zit.
Wat doet Nexus Studio met elk resultaat?
Nexus Studio legt elke poging vast en geeft het resultaat een eigen oordeel, zodat een herhalingspoging een defect nooit in een gewone groene uitvoering verandert.
- FLAKY: de test mislukte en slaagde vervolgens bij een herhalingspoging, zonder dat er iets is hersteld. De afsluitcode is 0, dus het bouwproces mislukt niet, en het rapport en de geschiedenis tonen het voorbehoud.
- BREACHED: de test mislukte bij één poging en geen enkel patroon in de omgeving of het testraamwerk verklaart de fout. De afsluitcode is 1.
- BREACHED_FLAKY: de test mislukte bij de laatste poging na een eerdere herhalingspoging, en geen enkel omgevingspatroon verklaart dit. De afsluitcode is 1. Vergelijk de pogingen voordat je een fout meldt.
De geschiedenis bewaart één rij per uitvoering van elke test, zodat een test die groen, rood en weer groen wordt als een trend zichtbaar blijft in plaats van te verdwijnen in herhalingen. De gids voor onbetrouwbare tests vermeldt welke bestanden elk oordeel achterlaat.
Wat zijn de beperkingen?
- Het onbetrouwbare gedrag in het voorbeeld wordt met een berekening gesimuleerd, zodat het zich herhaalt. Echt onbetrouwbaar gedrag heeft een oorzaak, en die vinden blijft mensenwerk.
- Zes uitvoeringen zijn een snelle controle, geen statistiek. Een test die eens in de vijftig uitvoeringen mislukt, kan zes keer slagen.
- Een mislukking bij elke uitvoering is niet altijd een fout in je toepassing: een traag netwerk, een blokkeerpagina of een vastgelopen browser kan tests ook laten mislukken. De gids voor onterechte mislukkingen laat zien hoe je het onderscheid maakt.
- Als herhaalpogingen uitstaan, geldt een incidentele fout in Nexus Studio als BREACHED, omdat alleen een herhaalpoging FLAKY van een gewone fout kan onderscheiden. De classificatie is gebaseerd op de fouttekst, dus open metadata.json als een oordeel je verrast.
Waar kan ik het zien?
De gids voor oordelen legt uit in welke volgorde de engine alle 14 oordelen bepaalt, en de Evidence-pagina volgt één mislukte test door alle bestanden die deze achterlaat. De proefversie van 30 dagen gebruikt dezelfde engine voor je eigen tests.