fix(test-runner): do not consider retries for maxFailures (#32533)

Fixes https://github.com/microsoft/playwright/issues/26350
This commit is contained in:
Max Schmitt 2024-09-11 20:35:26 +02:00 committed by GitHub
parent 1f0514536e
commit 7458c3292c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 32 additions and 3 deletions

View File

@ -31,7 +31,8 @@ export class FailureTracker {
}
onTestEnd(test: TestCase, result: TestResult) {
if (result.status !== 'skipped' && result.status !== test.expectedStatus)
// Test is considered failing after the last retry.
if (test.outcome() === 'unexpected' && test.results.length > test.retries)
++this._failureCount;
}

View File

@ -76,8 +76,8 @@ test('max-failures should work with retries', async ({ runInlineTest }) => {
`,
}, { 'max-failures': 2, 'retries': 4 });
expect(result.exitCode).toBe(1);
expect(result.failed).toBe(1);
expect(result.output.split('\n').filter(l => l.includes('Received:')).length).toBe(2);
expect(result.failed).toBe(2);
expect(result.output.split('\n').filter(l => l.includes('Received:')).length).toBe(2 * (4 + 1)); // 2 tests * (4 retries + 1 original)
});
test('max-failures should stop workers', async ({ runInlineTest }) => {
@ -181,3 +181,31 @@ test('max-failures should work across phases', async ({ runInlineTest }) => {
expect(result.output).toContain('running c');
expect(result.output).not.toContain('running d');
});
test('max-failures should not consider retries as failures', async ({ runInlineTest }) => {
const result = await runInlineTest({
'playwright.config.ts': `
export default {
maxFailures: 10,
retries: 10,
};
`,
'example.spec.ts': `
import { test, expect } from '@playwright/test';
test('I fail 9 times 1', () => {
if (test.info().retry < 9)
throw new Error('failing intentionally');
});
test('I fail 9 times 2', () => {
if (test.info().retry < 9)
throw new Error('failing intentionally');
});
`,
}, { workers: 1 });
expect(result.exitCode).toBe(0);
expect(result.failed).toBe(0);
expect(result.flaky).toBe(2);
expect(result.passed).toBe(0);
});