From 10dda30c7f417a92f782e21368fbb211a679838a Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Mon, 11 Dec 2023 21:18:48 -0800 Subject: [PATCH] fix(reporters): carefully handle empty lines (#28591) In some circumstances, like "No tests found" error, reporters produce a lot of unnecessary empty lines: ``` $ npx playwright test Error: No tests found $ ``` Also, `line` reporter removes the `npx playwright test` command entirely when `onError` happens before `onBegin`. --- packages/playwright/src/reporters/base.ts | 2 +- packages/playwright/src/reporters/line.ts | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/playwright/src/reporters/base.ts b/packages/playwright/src/reporters/base.ts index 7e94cb2f6a..de5a26640f 100644 --- a/packages/playwright/src/reporters/base.ts +++ b/packages/playwright/src/reporters/base.ts @@ -470,7 +470,7 @@ export function formatError(error: TestError, highlightCode: boolean): ErrorDeta tokens.push(snippet); } - if (parsedStack) { + if (parsedStack && parsedStack.stackLines.length) { tokens.push(''); tokens.push(colors.dim(parsedStack.stackLines.join('\n'))); } diff --git a/packages/playwright/src/reporters/line.ts b/packages/playwright/src/reporters/line.ts index a44f29d02e..7d875d0f31 100644 --- a/packages/playwright/src/reporters/line.ts +++ b/packages/playwright/src/reporters/line.ts @@ -21,6 +21,7 @@ class LineReporter extends BaseReporter { private _current = 0; private _failures = 0; private _lastTest: TestCase | undefined; + private _didBegin = false; override printsToStdio() { return true; @@ -28,8 +29,12 @@ class LineReporter extends BaseReporter { override onBegin(suite: Suite) { super.onBegin(suite); - console.log(this.generateStartingMessage()); - console.log(); + const startingMessage = this.generateStartingMessage(); + if (startingMessage) { + console.log(startingMessage); + console.log(); + } + this._didBegin = true; } override onStdOut(chunk: string | Buffer, test?: TestCase, result?: TestResult) { @@ -105,15 +110,15 @@ class LineReporter extends BaseReporter { override onError(error: TestError): void { super.onError(error); - const message = formatError(error, colors.enabled).message + '\n\n'; - if (!process.env.PW_TEST_DEBUG_REPORTERS) + const message = formatError(error, colors.enabled).message + '\n'; + if (!process.env.PW_TEST_DEBUG_REPORTERS && this._didBegin) process.stdout.write(`\u001B[1A\u001B[2K`); process.stdout.write(message); console.log(); } override async onEnd(result: FullResult) { - if (!process.env.PW_TEST_DEBUG_REPORTERS) + if (!process.env.PW_TEST_DEBUG_REPORTERS && this._didBegin) process.stdout.write(`\u001B[1A\u001B[2K`); await super.onEnd(result); this.epilogue(false);