Skip to content

Commit 152891b

Browse files
authored
fix(browser): print screenshot path alongside the test error message (#5992)
1 parent b9fb92c commit 152891b

File tree

6 files changed

+22
-6
lines changed

6 files changed

+22
-6
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export function createBrowserRunner(
5656

5757
onTaskFinished = async (task: Task) => {
5858
if (this.config.browser.screenshotFailures && task.result?.state === 'fail') {
59-
await page.screenshot()
59+
task.meta.failScreenshotPath = await page.screenshot()
6060
}
6161
}
6262

packages/vitest/src/node/error.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ interface PrintErrorOptions {
2727
fullStack?: boolean
2828
showCodeFrame?: boolean
2929
printProperties?: boolean
30+
screenshotPaths?: string[]
3031
}
3132

3233
interface PrintErrorResult {
@@ -110,14 +111,19 @@ export function printError(
110111
}
111112
})
112113

113-
const errorProperties = printProperties
114-
? getErrorProperties(e)
115-
: {}
116-
117114
if (type) {
118115
printErrorType(type, project.ctx)
119116
}
120117
printErrorMessage(e, logger)
118+
if (options.screenshotPaths?.length) {
119+
const length = options.screenshotPaths.length
120+
logger.error(`\nFailure screenshot${length > 1 ? 's' : ''}:`)
121+
logger.error(options.screenshotPaths.map(p => ` - ${c.dim(relative(process.cwd(), p))}`).join('\n'))
122+
if (!e.diff) {
123+
logger.error()
124+
}
125+
}
126+
121127
if (e.codeFrame) {
122128
logger.error(`${e.codeFrame}\n`)
123129
}
@@ -132,6 +138,10 @@ export function printError(
132138
logger.error(c.yellow(e.frame))
133139
}
134140
else {
141+
const errorProperties = printProperties
142+
? getErrorProperties(e)
143+
: {}
144+
135145
printStack(logger, project, stacks, nearest, errorProperties, (s) => {
136146
if (showCodeFrame && s === nearest && nearest) {
137147
const sourceCode = readFileSync(nearest.file, 'utf-8')

packages/vitest/src/node/logger.ts

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ interface ErrorOptions {
1717
fullStack?: boolean
1818
project?: WorkspaceProject
1919
verbose?: boolean
20+
screenshotPaths?: string[]
2021
}
2122

2223
const ESC = '\x1B['
@@ -99,6 +100,7 @@ export class Logger {
99100
showCodeFrame: true,
100101
logger: this,
101102
printProperties: options.verbose,
103+
screenshotPaths: options.screenshotPaths,
102104
})
103105
}
104106

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -603,8 +603,9 @@ export abstract class BaseReporter implements Reporter {
603603
)}${name}`,
604604
)
605605
}
606+
const screenshots = tasks.filter(t => t.meta?.failScreenshotPath).map(t => t.meta?.failScreenshotPath as string)
606607
const project = this.ctx.getProjectByTaskId(tasks[0].id)
607-
this.ctx.logger.printError(error, { project, verbose: this.verbose })
608+
this.ctx.logger.printError(error, { project, verbose: this.verbose, screenshotPaths: screenshots })
608609
errorDivider()
609610
}
610611
}

packages/vitest/src/types/global.ts

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ declare module '@vitest/runner' {
8181
interface TaskMeta {
8282
typecheck?: boolean
8383
benchmark?: boolean
84+
failScreenshotPath?: string
8485
}
8586

8687
interface File {

test/browser/specs/runner.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ describe('running browser tests', async () => {
3636
expect(stderr).toMatch(/- 2\s+\+ 1/)
3737
expect(stderr).toContain('Expected to be')
3838
expect(stderr).toContain('But got')
39+
expect(stderr).toContain('Failure screenshot')
40+
expect(stderr).toContain('__screenshots__/failing')
3941
})
4042

4143
test('logs are redirected to stdout', () => {

0 commit comments

Comments
 (0)