From 91dcf5752162227925694b4c1a24ed51112e18a6 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 6 Nov 2023 12:15:20 +1300 Subject: [PATCH 1/2] add failing browser shard test --- .gitignore | 1 + test/browser/specs/shard.test.mjs | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 test/browser/specs/shard.test.mjs diff --git a/.gitignore b/.gitignore index e6fecff012e2..04640776c300 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ ltex* bench/test/*/*/ **/benchmark/bench.json **/browser/browser.json +**/browser/browser-shard.json cypress/videos cypress/downloads cypress/screenshots diff --git a/test/browser/specs/shard.test.mjs b/test/browser/specs/shard.test.mjs new file mode 100644 index 000000000000..42ad4db7eb18 --- /dev/null +++ b/test/browser/specs/shard.test.mjs @@ -0,0 +1,22 @@ +import assert from 'node:assert' +import { readFile } from 'node:fs/promises' +import test from 'node:test' +import { execa } from 'execa' + +const browser = process.env.BROWSER || (process.env.PROVIDER === 'playwright' ? 'chromium' : 'chrome') + +await execa('npx', ['vitest', '--run', '--shard=1/2', `--browser.name=${browser}`, '--browser.headless', '--outputFile=browser-shard.json'], { + env: { + ...process.env, + CI: 'true', + NO_COLOR: 'true', + }, + reject: false, +}) + +const browserResult = await readFile('./browser-shard.json', 'utf-8') +const browserResultJson = JSON.parse(browserResult) + +await test('shard option runs portion of tests', async () => { + assert.strictEqual(browserResultJson.numTotalTests, 12) +}) From f8a0fc45f3f7b723b9ba410bd4476d8f25be5678 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 6 Nov 2023 12:56:13 +1300 Subject: [PATCH 2/2] apply sequencer to browser tests --- packages/vitest/src/node/pools/browser.ts | 13 +++++++++++-- test/browser/specs/shard.test.mjs | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/vitest/src/node/pools/browser.ts b/packages/vitest/src/node/pools/browser.ts index 20f282d0ba59..ec71c6b2ddfa 100644 --- a/packages/vitest/src/node/pools/browser.ts +++ b/packages/vitest/src/node/pools/browser.ts @@ -1,7 +1,7 @@ import { createDefer } from '@vitest/utils' import { relative } from 'pathe' import type { Vitest } from '../core' -import type { ProcessPool } from '../pool' +import type { ProcessPool, WorkspaceSpec } from '../pool' import type { WorkspaceProject } from '../workspace' import type { BrowserProvider } from '../../types/browser' @@ -27,6 +27,9 @@ export function createBrowserPool(ctx: Vitest): ProcessPool { } } + const Sequencer = ctx.config.sequence.sequencer + const sequencer = new Sequencer(ctx) + const runTests = async (project: WorkspaceProject, files: string[]) => { ctx.state.clearFiles(project, files) @@ -39,7 +42,13 @@ export function createBrowserPool(ctx: Vitest): ProcessPool { providers.add(provider) const origin = `http://${ctx.config.browser.api?.host || 'localhost'}:${project.browser!.config.server.port}` - const paths = files.map(file => relative(project.config.root, file)) + + let specs: Array = files.map(file => [project, file]) + if (ctx.config.shard) + specs = await sequencer.shard(specs) + specs = await sequencer.sort(specs) + + const paths = specs.map(([,file]) => relative(project.config.root, file)) if (project.config.browser.isolate) { for (const path of paths) { diff --git a/test/browser/specs/shard.test.mjs b/test/browser/specs/shard.test.mjs index 42ad4db7eb18..57160bfcb8c0 100644 --- a/test/browser/specs/shard.test.mjs +++ b/test/browser/specs/shard.test.mjs @@ -5,7 +5,7 @@ import { execa } from 'execa' const browser = process.env.BROWSER || (process.env.PROVIDER === 'playwright' ? 'chromium' : 'chrome') -await execa('npx', ['vitest', '--run', '--shard=1/2', `--browser.name=${browser}`, '--browser.headless', '--outputFile=browser-shard.json'], { +await execa('npx', ['vitest', '--run', '--shard=1/2', `--browser.name=${browser}`, '--browser.headless', '--outputFile=./browser-shard.json'], { env: { ...process.env, CI: 'true', @@ -18,5 +18,5 @@ const browserResult = await readFile('./browser-shard.json', 'utf-8') const browserResultJson = JSON.parse(browserResult) await test('shard option runs portion of tests', async () => { - assert.strictEqual(browserResultJson.numTotalTests, 12) + assert.strictEqual(browserResultJson.testResults.length, 4) })