chore: fix total progress reporting w/ deps (#27716)
This commit is contained in:
parent
d003945a7b
commit
f46c889449
|
|
@ -129,7 +129,7 @@ export type JsonEvent = {
|
||||||
export class TeleReporterReceiver {
|
export class TeleReporterReceiver {
|
||||||
private _rootSuite: TeleSuite;
|
private _rootSuite: TeleSuite;
|
||||||
private _pathSeparator: string;
|
private _pathSeparator: string;
|
||||||
private _reporter: ReporterV2;
|
private _reporter: Partial<ReporterV2>;
|
||||||
private _tests = new Map<string, TeleTestCase>();
|
private _tests = new Map<string, TeleTestCase>();
|
||||||
private _rootDir!: string;
|
private _rootDir!: string;
|
||||||
private _listOnly = false;
|
private _listOnly = false;
|
||||||
|
|
@ -139,7 +139,7 @@ export class TeleReporterReceiver {
|
||||||
private _config!: FullConfig;
|
private _config!: FullConfig;
|
||||||
private _stringPool = new StringInternPool();
|
private _stringPool = new StringInternPool();
|
||||||
|
|
||||||
constructor(pathSeparator: string, reporter: ReporterV2, reuseTestCases: boolean, reportConfig?: MergeReporterConfig) {
|
constructor(pathSeparator: string, reporter: Partial<ReporterV2>, reuseTestCases: boolean, reportConfig?: MergeReporterConfig) {
|
||||||
this._rootSuite = new TeleSuite('', 'root');
|
this._rootSuite = new TeleSuite('', 'root');
|
||||||
this._pathSeparator = pathSeparator;
|
this._pathSeparator = pathSeparator;
|
||||||
this._reporter = reporter;
|
this._reporter = reporter;
|
||||||
|
|
@ -199,7 +199,7 @@ export class TeleReporterReceiver {
|
||||||
this._rootDir = this._reportConfig?.rootDir || config.rootDir;
|
this._rootDir = this._reportConfig?.rootDir || config.rootDir;
|
||||||
this._listOnly = config.listOnly;
|
this._listOnly = config.listOnly;
|
||||||
this._config = this._parseConfig(config);
|
this._config = this._parseConfig(config);
|
||||||
this._reporter.onConfigure(this._config);
|
this._reporter.onConfigure?.(this._config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _onProject(project: JsonProject) {
|
private _onProject(project: JsonProject) {
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,7 @@ export const UIModeView: React.FC<{}> = ({
|
||||||
setTestModel({ config, rootSuite, loadErrors });
|
setTestModel({ config, rootSuite, loadErrors });
|
||||||
setProjectFilters(new Map(projectFilters));
|
setProjectFilters(new Map(projectFilters));
|
||||||
if (runningState && newProgress)
|
if (runningState && newProgress)
|
||||||
setProgress({ ...newProgress, total: runningState.testIds.size });
|
setProgress(newProgress);
|
||||||
else if (!newProgress)
|
else if (!newProgress)
|
||||||
setProgress(undefined);
|
setProgress(undefined);
|
||||||
}, [projectFilters, runningState]);
|
}, [projectFilters, runningState]);
|
||||||
|
|
@ -157,7 +157,7 @@ export const UIModeView: React.FC<{}> = ({
|
||||||
|
|
||||||
const time = ' [' + new Date().toLocaleTimeString() + ']';
|
const time = ' [' + new Date().toLocaleTimeString() + ']';
|
||||||
xtermDataSource.write('\x1B[2m—'.repeat(Math.max(0, xtermSize.cols - time.length)) + time + '\x1B[22m');
|
xtermDataSource.write('\x1B[2m—'.repeat(Math.max(0, xtermSize.cols - time.length)) + time + '\x1B[22m');
|
||||||
setProgress({ total: testIds.size, passed: 0, failed: 0, skipped: 0 });
|
setProgress({ total: 0, passed: 0, failed: 0, skipped: 0 });
|
||||||
setRunningState({ testIds });
|
setRunningState({ testIds });
|
||||||
|
|
||||||
await sendMessage('run', { testIds: [...testIds], projects: [...projectFilters].filter(([_, v]) => v).map(([p]) => p) });
|
await sendMessage('run', { testIds: [...testIds], projects: [...projectFilters].filter(([_, v]) => v).map(([p]) => p) });
|
||||||
|
|
@ -614,6 +614,8 @@ const TraceView: React.FC<{
|
||||||
};
|
};
|
||||||
|
|
||||||
let receiver: TeleReporterReceiver | undefined;
|
let receiver: TeleReporterReceiver | undefined;
|
||||||
|
let lastRunReceiver: TeleReporterReceiver | undefined;
|
||||||
|
let lastRunTestCount: number;
|
||||||
|
|
||||||
let throttleTimer: NodeJS.Timeout | undefined;
|
let throttleTimer: NodeJS.Timeout | undefined;
|
||||||
let throttleData: { config: FullConfig, rootSuite: Suite, loadErrors: TestError[], progress: Progress } | undefined;
|
let throttleData: { config: FullConfig, rootSuite: Suite, loadErrors: TestError[], progress: Progress } | undefined;
|
||||||
|
|
@ -638,6 +640,7 @@ const refreshRootSuite = (eraseResults: boolean): Promise<void> => {
|
||||||
let rootSuite: Suite;
|
let rootSuite: Suite;
|
||||||
const loadErrors: TestError[] = [];
|
const loadErrors: TestError[] = [];
|
||||||
const progress: Progress = {
|
const progress: Progress = {
|
||||||
|
total: 0,
|
||||||
passed: 0,
|
passed: 0,
|
||||||
failed: 0,
|
failed: 0,
|
||||||
skipped: 0,
|
skipped: 0,
|
||||||
|
|
@ -648,11 +651,22 @@ const refreshRootSuite = (eraseResults: boolean): Promise<void> => {
|
||||||
|
|
||||||
onConfigure: (c: FullConfig) => {
|
onConfigure: (c: FullConfig) => {
|
||||||
config = c;
|
config = c;
|
||||||
|
// TeleReportReceiver is merging everything into a single suite, so when we
|
||||||
|
// run one test, we still get many tests via rootSuite.allTests().length.
|
||||||
|
// To work around that, have a dedicated per-run receiver that will only have
|
||||||
|
// suite for a single test run, and hence will have correct total.
|
||||||
|
lastRunReceiver = new TeleReporterReceiver(pathSeparator, {
|
||||||
|
onBegin: (suite: Suite) => {
|
||||||
|
lastRunTestCount = suite.allTests().length;
|
||||||
|
lastRunReceiver = undefined;
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
onBegin: (suite: Suite) => {
|
onBegin: (suite: Suite) => {
|
||||||
if (!rootSuite)
|
if (!rootSuite)
|
||||||
rootSuite = suite;
|
rootSuite = suite;
|
||||||
|
progress.total = lastRunTestCount;
|
||||||
progress.passed = 0;
|
progress.passed = 0;
|
||||||
progress.failed = 0;
|
progress.failed = 0;
|
||||||
progress.skipped = 0;
|
progress.skipped = 0;
|
||||||
|
|
@ -729,6 +743,9 @@ const dispatchEvent = (method: string, params?: any) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The order of receiver dispatches matters here, we want to assign `lastRunTestCount`
|
||||||
|
// before we use it.
|
||||||
|
lastRunReceiver?.dispatch({ method, params })?.catch(() => {});
|
||||||
receiver?.dispatch({ method, params })?.catch(() => {});
|
receiver?.dispatch({ method, params })?.catch(() => {});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -764,6 +781,7 @@ const collectTestIds = (treeItem?: TreeItem): Set<string> => {
|
||||||
};
|
};
|
||||||
|
|
||||||
type Progress = {
|
type Progress = {
|
||||||
|
total: number;
|
||||||
passed: number;
|
passed: number;
|
||||||
failed: number;
|
failed: number;
|
||||||
skipped: number;
|
skipped: number;
|
||||||
|
|
|
||||||
|
|
@ -394,3 +394,51 @@ test('should remove output folder before test run', async ({ runUITest }) => {
|
||||||
`);
|
`);
|
||||||
await expect(page.getByTestId('status-line')).toHaveText('1/1 passed (100%)');
|
await expect(page.getByTestId('status-line')).toHaveText('1/1 passed (100%)');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should show proper total when using deps', async ({ runUITest }) => {
|
||||||
|
const { page } = await runUITest({
|
||||||
|
'playwright.config.ts': `
|
||||||
|
import { defineConfig } from "@playwright/test";
|
||||||
|
export default defineConfig({
|
||||||
|
projects: [
|
||||||
|
{ name: "setup", grep: /@setup/, },
|
||||||
|
{ name: "chromium", grep: /@chromium/, dependencies: ["setup"], },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
`,
|
||||||
|
'a.test.ts': `
|
||||||
|
import { expect, test } from "@playwright/test";
|
||||||
|
test("run @setup", async ({ page }) => {
|
||||||
|
console.log("Test setup executed");
|
||||||
|
});
|
||||||
|
test("run @chromium", async ({ page }) => {
|
||||||
|
console.log("Test chromium executed");
|
||||||
|
});
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
await page.getByText('Status:').click();
|
||||||
|
await page.getByLabel('setup').setChecked(true);
|
||||||
|
await page.getByLabel('chromium').setChecked(true);
|
||||||
|
|
||||||
|
await expect.poll(dumpTestTree(page)).toContain(`
|
||||||
|
▼ ◯ a.test.ts
|
||||||
|
`);
|
||||||
|
|
||||||
|
await page.getByTitle('run @setup').dblclick();
|
||||||
|
await expect.poll(dumpTestTree(page)).toBe(`
|
||||||
|
▼ ◯ a.test.ts
|
||||||
|
✅ run @setup <=
|
||||||
|
◯ run @chromium
|
||||||
|
`);
|
||||||
|
await expect(page.getByTestId('status-line')).toHaveText('1/1 passed (100%)');
|
||||||
|
|
||||||
|
await page.getByTitle('run @chromium').dblclick();
|
||||||
|
await expect.poll(dumpTestTree(page)).toBe(`
|
||||||
|
▼ ✅ a.test.ts
|
||||||
|
✅ run @setup
|
||||||
|
✅ run @chromium <=
|
||||||
|
`);
|
||||||
|
await expect(page.getByTestId('status-line')).toHaveText('2/2 passed (100%)');
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue