diff --git a/packages/browser/src/client/orchestrator.ts b/packages/browser/src/client/orchestrator.ts index fe0d36050..6c49d73d5 100644 --- a/packages/browser/src/client/orchestrator.ts +++ b/packages/browser/src/client/orchestrator.ts @@ -78,7 +78,8 @@ export class IframeOrchestrator { await this.traces.flush() } - const startTime = performance.now() + // tester iframes have their own time origin + const startTime = performance.timeOrigin + performance.now() this.cancelled = false diff --git a/packages/browser/src/client/tester/tester.ts b/packages/browser/src/client/tester/tester.ts index f24ac7da0..cd9129212 100644 --- a/packages/browser/src/client/tester/tester.ts +++ b/packages/browser/src/client/tester/tester.ts @@ -152,7 +152,7 @@ if (isEmbedded) { let contextSwitched = false -async function prepareTestEnvironment(options: PrepareOptions) { +async function prepareTestEnvironment() { debug?.('trying to resolve the runner') const config = getConfig() @@ -201,8 +201,6 @@ async function prepareTestEnvironment(options: PrepareOptions) { }) } - state.durations.prepare = performance.now() - options.startTime - return { runner, config, @@ -257,17 +255,13 @@ interface PrepareOptions { } async function prepare(options: PrepareOptions) { - preparedData = await prepareTestEnvironment(options) + preparedData = await prepareTestEnvironment() // page is reloading debug?.('runner resolved successfully') const { config, state } = preparedData - state.durations.prepare = performance.now() - state.durations.prepare - - debug?.('prepare time', state.durations.prepare, 'ms') - setupEnv(config.env, state.metaEnv) await Promise.all([ @@ -282,6 +276,9 @@ async function prepare(options: PrepareOptions) { })(), ]) + state.durations.prepare = performance.timeOrigin + performance.now() - options.startTime + debug?.('prepare time', state.durations.prepare, 'ms') + if (!config.browser.trackUnhandledErrors) { getBrowserState().disposeExceptionTracker() } diff --git a/test/browser/specs/prepare-duration.test.ts b/test/browser/specs/prepare-duration.test.ts new file mode 100644 index 000000000..16353e035 --- /dev/null +++ b/test/browser/specs/prepare-duration.test.ts @@ -0,0 +1,43 @@ +import type { TestModule } from 'vitest/node' +import { expect, test } from 'vitest' +import { instances, runInlineBrowserTests } from './utils' + +test('prepareDuration does not include the time of previous files', async () => { + const testFile = ` + import { test } from 'vitest' + test('waits', async () => { + await new Promise((resolve) => setTimeout(resolve, 1000)) + }) + ` + const modulesByProject = new Map() + + const { stderr } = await runInlineBrowserTests( + { + 'first.test.ts': testFile, + 'second.test.ts': testFile, + }, + { + reporters: [ + { + onTestModuleEnd(module) { + const modules = modulesByProject.get(module.project.name) ?? [] + modules.push(module) + modulesByProject.set(module.project.name, modules) + }, + }, + ], + }, + ) + + expect(stderr).toBe('') + expect(modulesByProject.size).toBe(instances.length) + + for (const [project, modules] of modulesByProject) { + expect.soft(modules, project).toHaveLength(2) + const [previous, next] = modules.map((module) => module.diagnostic()) + + expect.soft(previous.prepareDuration, project).toBeGreaterThan(0) + expect.soft(next.prepareDuration, project).toBeGreaterThan(0) + expect.soft(next.prepareDuration, project).toBeLessThan(previous.duration) + } +})