fix(test runner): more friendly test duration (#15476)

fix(test runner): more firendly test duration

Reported test duration now does not include time spent in
`beforeAll`, `afterAll` and fixtures that have a separate timeout.

This is to avoid different reported test execution time,
depending on the test execution order.
This commit is contained in:
Dmitry Gozman 2022-07-08 11:45:44 -07:00 committed by GitHub
parent 894ead5198
commit 6dc4a51c92
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 4 deletions

View file

@ -76,7 +76,7 @@ export class TestInfoImpl implements TestInfo {
} }
get timeout(): number { get timeout(): number {
return this._timeoutManager.defaultTimeout(); return this._timeoutManager.defaultSlotTimings().timeout;
} }
set timeout(timeout: number) { set timeout(timeout: number) {
@ -178,7 +178,7 @@ export class TestInfoImpl implements TestInfo {
this.status = 'timedOut'; this.status = 'timedOut';
this.errors.push(timeoutError); this.errors.push(timeoutError);
} }
this.duration = (monotonicTime() - this._startTime) | 0; this.duration = this._timeoutManager.defaultSlotTimings().elapsed | 0;
} }
async _runFn(fn: Function, skips?: 'allowSkips'): Promise<TestError | undefined> { async _runFn(fn: Function, skips?: 'allowSkips'): Promise<TestError | undefined> {

View file

@ -60,8 +60,10 @@ export class TimeoutManager {
this._updateRunnables(this._runnable, fixture); this._updateRunnables(this._runnable, fixture);
} }
defaultTimeout() { defaultSlotTimings() {
return this._defaultSlot.timeout; const slot = this._currentSlot();
slot.elapsed = this._timeoutRunner.elapsed();
return this._defaultSlot;
} }
slow() { slow() {

View file

@ -340,3 +340,41 @@ test('test timeout should still run hooks before fixtures teardown', async ({ ru
'%%after-auto', '%%after-auto',
]); ]);
}); });
test('should not include fixtures with own timeout and beforeAll in test duration', async ({ runInlineTest }) => {
const result = await runInlineTest({
'c.spec.ts': `
const test = pwt.test.extend({
foo: [async ({}, use) => {
await new Promise(f => setTimeout(f, 1000));
await use('foo');
}, { timeout: 0 }],
bar: async ({}, use) => {
await new Promise(f => setTimeout(f, 300));
await use('bar');
},
});
test.beforeAll(async () => {
await new Promise(f => setTimeout(f, 1000));
});
test.beforeEach(async () => {
await new Promise(f => setTimeout(f, 300));
});
test.afterEach(async () => {
await new Promise(f => setTimeout(f, 300));
});
test('works', async ({ foo, bar }) => {
await new Promise(f => setTimeout(f, 300));
});
`
}, { timeout: 5000 });
expect(result.exitCode).toBe(0);
const duration = result.results[0].duration;
expect(duration).toBeGreaterThanOrEqual(300 * 4); // Includes test, beforeEach, afterEach and bar.
expect(duration).toBeLessThan(300 * 4 + 1000); // Does not include beforeAll and foo.
});