playwright/tests/playwright-test/reporter-line.spec.ts
Dmitry Gozman 767babc3a2
fix(test runner): handle istty in line reporter (#15455)
When running without tty, line reporter outputs a line for each
percent of the tests, thus limiting the output to ~100 lines.

In addition, reporters now support PLAYWRIGHT_LIVE_TERMINAL
env variable to force tty mode.
2022-07-07 09:55:12 -07:00

237 lines
7.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Copyright (c) Microsoft Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { test, expect, stripAnsi, trimLineEnds } from './playwright-test-fixtures';
test('should work with tty', async ({ runInlineTest }, testInfo) => {
const result = await runInlineTest({
'a.test.js': `
const { test } = pwt;
test.skip('skipped test', async ({}) => {
});
test('flaky test', async ({}, testInfo) => {
expect(testInfo.retry).toBe(1);
});
test('passing test', async ({}) => {
});
test('failing test', async ({}) => {
expect(1).toBe(0);
});
`,
}, { retries: '1', reporter: 'line', workers: '1' }, {
PLAYWRIGHT_LIVE_TERMINAL: '1',
FORCE_COLOR: '0',
PW_TEST_DEBUG_REPORTERS: '1',
});
expect(result.exitCode).toBe(1);
expect(trimLineEnds(result.output)).toContain(trimLineEnds(`Running 4 tests using 1 worker
<lineup><erase>[1/4] a.test.js:6:12 skipped test
<lineup><erase>[2/4] a.test.js:8:7 flaky test
<lineup><erase>[3/4] a.test.js:8:7 flaky test (retry #1)
<lineup><erase> 1) a.test.js:8:7 flaky test ====================================================================
Error: expect(received).toBe(expected) // Object.is equality
Expected: 1
Received: 0
7 | });
8 | test('flaky test', async ({}, testInfo) => {
> 9 | expect(testInfo.retry).toBe(1);
| ^
10 | });
11 | test('passing test', async ({}) => {
12 | });
at ${testInfo.outputPath('a.test.js')}:9:32
<lineup><erase>[4/4] a.test.js:11:7 passing test
<lineup><erase>[5/4] (retries) a.test.js:13:7 failing test
<lineup><erase>[6/4] (retries) a.test.js:13:7 failing test (retry #1)
<lineup><erase> 2) a.test.js:13:7 failing test =================================================================
Error: expect(received).toBe(expected) // Object.is equality
Expected: 0
Received: 1
12 | });
13 | test('failing test', async ({}) => {
> 14 | expect(1).toBe(0);
| ^
15 | });
16 |
at ${testInfo.outputPath('a.test.js')}:14:19
Retry #1 ---------------------------------------------------------------------------------------
Error: expect(received).toBe(expected) // Object.is equality
Expected: 0
Received: 1
12 | });
13 | test('failing test', async ({}) => {
> 14 | expect(1).toBe(0);
| ^
15 | });
16 |
at ${testInfo.outputPath('a.test.js')}:14:19
<lineup><erase>
1 failed
a.test.js:13:7 failing test ==================================================================
1 flaky
a.test.js:8:7 flaky test =====================================================================
1 skipped
1 passed`));
});
test('should work with non-tty', async ({ runInlineTest }, testInfo) => {
const result = await runInlineTest({
'a.test.js': `
const { test } = pwt;
test.skip('skipped test', async ({}) => {
});
test('flaky test', async ({}, testInfo) => {
expect(testInfo.retry).toBe(1);
});
test('passing test', async ({}) => {
});
test('failing test', async ({}) => {
expect(1).toBe(0);
});
`,
}, { retries: '1', reporter: 'line', workers: '1' }, {
FORCE_COLOR: '0',
PW_TEST_DEBUG_REPORTERS: '1',
});
expect(result.exitCode).toBe(1);
expect(trimLineEnds(result.output)).toContain(trimLineEnds(`Running 4 tests using 1 worker
[25%] a.test.js:6:12 skipped test
[50%] a.test.js:8:7 flaky test
[75%] a.test.js:8:7 flaky test (retry #1)
1) a.test.js:8:7 flaky test ====================================================================
Error: expect(received).toBe(expected) // Object.is equality
Expected: 1
Received: 0
7 | });
8 | test('flaky test', async ({}, testInfo) => {
> 9 | expect(testInfo.retry).toBe(1);
| ^
10 | });
11 | test('passing test', async ({}) => {
12 | });
at ${testInfo.outputPath('a.test.js')}:9:32
[99%] a.test.js:11:7 passing test
2) a.test.js:13:7 failing test =================================================================
Error: expect(received).toBe(expected) // Object.is equality
Expected: 0
Received: 1
12 | });
13 | test('failing test', async ({}) => {
> 14 | expect(1).toBe(0);
| ^
15 | });
16 |
at ${testInfo.outputPath('a.test.js')}:14:19
Retry #1 ---------------------------------------------------------------------------------------
Error: expect(received).toBe(expected) // Object.is equality
Expected: 0
Received: 1
12 | });
13 | test('failing test', async ({}) => {
> 14 | expect(1).toBe(0);
| ^
15 | });
16 |
at ${testInfo.outputPath('a.test.js')}:14:19
[100%]
1 failed
a.test.js:13:7 failing test ==================================================================
1 flaky
a.test.js:8:7 flaky test =====================================================================
1 skipped
1 passed`));
});
test('should spare status updates in non-tty mode', async ({ runInlineTest }) => {
const result = await runInlineTest({
'a.test.js': `
const { test } = pwt;
for (let i = 0; i < 300; i++) {
test('test' + i, () => {});
}
`,
}, { reporter: 'line', workers: '1' }, {
FORCE_COLOR: '0',
PW_TEST_DEBUG_REPORTERS: '1',
});
expect(result.exitCode).toBe(0);
const lines = [`Running 300 tests using 1 worker`, `[0%] a.test.js:7:9 test0`];
for (let i = 1; i <= 99; i++)
lines.push(`[${i}%] a.test.js:7:9 test${3 * i - 2}`);
lines.push('[100%]');
lines.push('');
lines.push(' 300 passed');
expect(trimLineEnds(result.output)).toContain(lines.join('\n'));
});
test('should print output', async ({ runInlineTest }) => {
const result = await runInlineTest({
'a.spec.ts': `
const { test } = pwt;
test('foobar', async ({}, testInfo) => {
process.stdout.write('one');
process.stdout.write('two');
console.log('full-line');
});
`
}, { reporter: 'line' });
expect(result.exitCode).toBe(0);
expect(stripAnsi(result.output)).toContain([
'a.spec.ts:6:7 foobar',
'one',
'',
'two',
'',
'full-line',
].join('\n'));
});