Skip to content

Commit 7f36b6f

Browse files
authored
perf(reporters): update summary only when needed (#7291)
1 parent 99732d9 commit 7f36b6f

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

packages/vitest/src/node/reporters/dot.ts

+3
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,13 @@ export class DotReporter extends BaseReporter {
6666
return
6767
}
6868
this.tests.set(test.id, test.result().state || 'run')
69+
this.renderer?.schedule()
6970
}
7071

7172
onTestCaseResult(test: TestCase) {
7273
this.finishedTests.add(test.id)
7374
this.tests.set(test.id, test.result().state || 'skipped')
75+
this.renderer?.schedule()
7476
}
7577

7678
onTestModuleEnd() {
@@ -104,6 +106,7 @@ export class DotReporter extends BaseReporter {
104106
}
105107

106108
this.ctx.logger.log(formatTests(states))
109+
this.renderer?.schedule()
107110
}
108111

109112
private createSummary() {

packages/vitest/src/node/reporters/renderers/windowedRenderer.ts

+18-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { Writable } from 'node:stream'
22
import type { Vitest } from '../../core'
33
import { stripVTControlCharacters } from 'node:util'
44

5-
const DEFAULT_RENDER_INTERVAL = 16
5+
const DEFAULT_RENDER_INTERVAL_MS = 1_000
66

77
const ESC = '\x1B['
88
const CLEAR_LINE = `${ESC}K`
@@ -27,14 +27,15 @@ export class WindowRenderer {
2727
private streams!: Record<StreamType, Vitest['logger']['outputStream' | 'errorStream']['write']>
2828
private buffer: { type: StreamType; message: string }[] = []
2929
private renderInterval: NodeJS.Timeout | undefined = undefined
30+
private renderScheduled = false
3031

3132
private windowHeight = 0
3233
private finished = false
3334
private cleanups: (() => void)[] = []
3435

3536
constructor(options: Options) {
3637
this.options = {
37-
interval: DEFAULT_RENDER_INTERVAL,
38+
interval: DEFAULT_RENDER_INTERVAL_MS,
3839
...options,
3940
}
4041

@@ -59,7 +60,7 @@ export class WindowRenderer {
5960

6061
start() {
6162
this.finished = false
62-
this.renderInterval = setInterval(() => this.flushBuffer(), this.options.interval).unref()
63+
this.renderInterval = setInterval(() => this.schedule(), this.options.interval).unref()
6364
}
6465

6566
stop() {
@@ -77,6 +78,20 @@ export class WindowRenderer {
7778
clearInterval(this.renderInterval)
7879
}
7980

81+
/**
82+
* Queue new render update
83+
*/
84+
schedule() {
85+
if (!this.renderScheduled) {
86+
this.renderScheduled = true
87+
this.flushBuffer()
88+
89+
setTimeout(() => {
90+
this.renderScheduled = false
91+
}, 100).unref()
92+
}
93+
}
94+
8095
private flushBuffer() {
8196
if (this.buffer.length === 0) {
8297
return this.render()

packages/vitest/src/node/reporters/summary.ts

+6
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ export class SummaryReporter implements Reporter {
109109
}
110110

111111
this.runningModules.set(module.id, initializeStats(module))
112+
this.renderer.schedule()
112113
}
113114

114115
onTestModuleCollected(module: TestModule) {
@@ -124,6 +125,7 @@ export class SummaryReporter implements Reporter {
124125
stats.total = total
125126

126127
this.maxParallelTests = Math.max(this.maxParallelTests, this.runningModules.size)
128+
this.renderer.schedule()
127129
}
128130

129131
onHookStart(options: ReportedHookContext) {
@@ -213,6 +215,8 @@ export class SummaryReporter implements Reporter {
213215
else if (!result?.state || result?.state === 'skipped') {
214216
this.tests.skipped++
215217
}
218+
219+
this.renderer.schedule()
216220
}
217221

218222
onTestModuleEnd(module: TestModule) {
@@ -247,6 +251,8 @@ export class SummaryReporter implements Reporter {
247251
// Remove finished test immediatelly.
248252
this.removeTestModule(module.id)
249253
}
254+
255+
this.renderer.schedule()
250256
}
251257

252258
private getHookStats({ entity }: ReportedHookContext) {

0 commit comments

Comments
 (0)