Skip to content

Commit a3ed42a

Browse files
authored
fix(browser): measure prepare duration with one clock (#11667)
1 parent 3c6d6dd commit a3ed42a

3 files changed

Lines changed: 50 additions & 9 deletions

File tree

‎packages/browser/src/client/orchestrator.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ export class IframeOrchestrator {
7878
await this.traces.flush()
7979
}
8080

81-
const startTime = performance.now()
81+
// tester iframes have their own time origin
82+
const startTime = performance.timeOrigin + performance.now()
8283

8384
this.cancelled = false
8485

‎packages/browser/src/client/tester/tester.ts‎

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ if (isEmbedded) {
152152

153153
let contextSwitched = false
154154

155-
async function prepareTestEnvironment(options: PrepareOptions) {
155+
async function prepareTestEnvironment() {
156156
debug?.('trying to resolve the runner')
157157
const config = getConfig()
158158

@@ -201,8 +201,6 @@ async function prepareTestEnvironment(options: PrepareOptions) {
201201
})
202202
}
203203

204-
state.durations.prepare = performance.now() - options.startTime
205-
206204
return {
207205
runner,
208206
config,
@@ -257,17 +255,13 @@ interface PrepareOptions {
257255
}
258256

259257
async function prepare(options: PrepareOptions) {
260-
preparedData = await prepareTestEnvironment(options)
258+
preparedData = await prepareTestEnvironment()
261259

262260
// page is reloading
263261
debug?.('runner resolved successfully')
264262

265263
const { config, state } = preparedData
266264

267-
state.durations.prepare = performance.now() - state.durations.prepare
268-
269-
debug?.('prepare time', state.durations.prepare, 'ms')
270-
271265
setupEnv(config.env, state.metaEnv)
272266

273267
await Promise.all([
@@ -282,6 +276,9 @@ async function prepare(options: PrepareOptions) {
282276
})(),
283277
])
284278

279+
state.durations.prepare = performance.timeOrigin + performance.now() - options.startTime
280+
debug?.('prepare time', state.durations.prepare, 'ms')
281+
285282
if (!config.browser.trackUnhandledErrors) {
286283
getBrowserState().disposeExceptionTracker()
287284
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import type { TestModule } from 'vitest/node'
2+
import { expect, test } from 'vitest'
3+
import { instances, runInlineBrowserTests } from './utils'
4+
5+
test('prepareDuration does not include the time of previous files', async () => {
6+
const testFile = `
7+
import { test } from 'vitest'
8+
test('waits', async () => {
9+
await new Promise((resolve) => setTimeout(resolve, 1000))
10+
})
11+
`
12+
const modulesByProject = new Map<string, TestModule[]>()
13+
14+
const { stderr } = await runInlineBrowserTests(
15+
{
16+
'first.test.ts': testFile,
17+
'second.test.ts': testFile,
18+
},
19+
{
20+
reporters: [
21+
{
22+
onTestModuleEnd(module) {
23+
const modules = modulesByProject.get(module.project.name) ?? []
24+
modules.push(module)
25+
modulesByProject.set(module.project.name, modules)
26+
},
27+
},
28+
],
29+
},
30+
)
31+
32+
expect(stderr).toBe('')
33+
expect(modulesByProject.size).toBe(instances.length)
34+
35+
for (const [project, modules] of modulesByProject) {
36+
expect.soft(modules, project).toHaveLength(2)
37+
const [previous, next] = modules.map((module) => module.diagnostic())
38+
39+
expect.soft(previous.prepareDuration, project).toBeGreaterThan(0)
40+
expect.soft(next.prepareDuration, project).toBeGreaterThan(0)
41+
expect.soft(next.prepareDuration, project).toBeLessThan(previous.duration)
42+
}
43+
})

0 commit comments

Comments
 (0)