From 7e7e35cb4177b83b68ae1b97f42196c639ad8244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Thu, 23 Jul 2026 11:51:58 +0300 Subject: [PATCH] perf(coverage): reduce RPC data and unnecessary serializations (#10781) --- packages/coverage-istanbul/package.json | 4 + packages/coverage-istanbul/rollup.config.js | 1 + packages/coverage-istanbul/src/base.ts | 48 +++++++++++ packages/coverage-istanbul/src/browser.ts | 28 +++++++ packages/coverage-istanbul/src/commands.ts | 38 +++++++++ packages/coverage-istanbul/src/index.ts | 51 ++++-------- packages/coverage-istanbul/src/provider.ts | 9 +++ packages/coverage-v8/src/browser.ts | 52 +----------- packages/coverage-v8/src/commands.ts | 81 ++++++++++++++++++- packages/coverage-v8/src/index.ts | 11 ++- packages/vitest/src/integrations/coverage.ts | 5 +- .../vitest/src/node/config/serializeConfig.ts | 5 +- packages/vitest/src/node/coverage.ts | 54 +++---------- packages/vitest/src/runtime/config.ts | 2 + packages/vitest/src/utils/coverage.ts | 15 +++- .../test/mixed-versions-warning.unit.test.ts | 1 + .../test/temporary-files.unit.test.ts | 18 +---- test/coverage-test/vitest.config.ts | 4 + 18 files changed, 269 insertions(+), 158 deletions(-) create mode 100644 packages/coverage-istanbul/src/base.ts create mode 100644 packages/coverage-istanbul/src/browser.ts create mode 100644 packages/coverage-istanbul/src/commands.ts diff --git a/packages/coverage-istanbul/package.json b/packages/coverage-istanbul/package.json index 49dfe1bc4..7f22bfdb5 100644 --- a/packages/coverage-istanbul/package.json +++ b/packages/coverage-istanbul/package.json @@ -28,6 +28,10 @@ "types": "./dist/index.d.ts", "default": "./dist/index.js" }, + "./browser": { + "types": "./dist/browser.d.ts", + "default": "./dist/browser.js" + }, "./*": "./*" }, "main": "./dist/index.js", diff --git a/packages/coverage-istanbul/rollup.config.js b/packages/coverage-istanbul/rollup.config.js index e641d66f6..78d254efa 100644 --- a/packages/coverage-istanbul/rollup.config.js +++ b/packages/coverage-istanbul/rollup.config.js @@ -12,6 +12,7 @@ const pkg = require('./package.json') const entries = { index: 'src/index.ts', + browser: 'src/browser.ts', provider: 'src/provider.ts', } diff --git a/packages/coverage-istanbul/src/base.ts b/packages/coverage-istanbul/src/base.ts new file mode 100644 index 000000000..556468319 --- /dev/null +++ b/packages/coverage-istanbul/src/base.ts @@ -0,0 +1,48 @@ +import type { CoverageMapData } from 'istanbul-lib-coverage' +import type { IstanbulCoverageProvider } from './provider' +import { COVERAGE_STORE_KEY } from './constants' + +export const BaseCoverageProviderModule = { + takeCoverage(): CoverageMapData | undefined { + // @ts-expect-error -- untyped global + return globalThis[COVERAGE_STORE_KEY] + }, + + // Reset coverage map to prevent duplicate results if this is called twice in row + startCoverage(): void { + // @ts-expect-error -- untyped global + const coverageMap = globalThis[COVERAGE_STORE_KEY] as CoverageMapData + + // When isolated, there are no previous results + if (!coverageMap) { + return + } + + for (const filename in coverageMap) { + const branches = coverageMap[filename].b + + for (const key in branches) { + branches[key] = branches[key].map(() => 0) + } + + for (const metric of ['f', 's'] as const) { + const entry = coverageMap[filename][metric] + + for (const key in entry) { + entry[key] = 0 + } + } + } + }, + + async getProvider(): Promise { + // to not bundle the provider + const providerPath = './provider.js' + const { IstanbulCoverageProvider } = (await import( + /* @vite-ignore */ + providerPath, + )) as typeof import('./provider') + + return new IstanbulCoverageProvider() + }, +} diff --git a/packages/coverage-istanbul/src/browser.ts b/packages/coverage-istanbul/src/browser.ts new file mode 100644 index 000000000..c9d110810 --- /dev/null +++ b/packages/coverage-istanbul/src/browser.ts @@ -0,0 +1,28 @@ +import type { CoverageProviderModule } from 'vitest/node' +import { BaseCoverageProviderModule } from './base' + +function triggerCommand(command: string, args: any[] = []): Promise { + return (globalThis as any).__vitest_browser_runner__?.commands?.triggerCommand?.(command, args) +} + +const mod: CoverageProviderModule = { + takeCoverage() { + const coverage = BaseCoverageProviderModule.takeCoverage() + + if (!coverage) { + return + } + + return triggerCommand('__vitest_writeCoverageFile', [coverage]) + }, + + startCoverage() { + BaseCoverageProviderModule.startCoverage() + }, + + getProvider() { + return BaseCoverageProviderModule.getProvider() + }, +} + +export default mod diff --git a/packages/coverage-istanbul/src/commands.ts b/packages/coverage-istanbul/src/commands.ts new file mode 100644 index 000000000..eba50f935 --- /dev/null +++ b/packages/coverage-istanbul/src/commands.ts @@ -0,0 +1,38 @@ +import type { BrowserCommand } from 'vitest/node' +import type { IstanbulCoverageProvider } from './provider' +import { randomUUID } from 'node:crypto' +import { existsSync } from 'node:fs' +import { writeFile } from 'node:fs/promises' +import { resolve } from 'pathe' + +export const commands: Record> = { + writeCoverageFile(context, coverage: unknown) { + const provider = context.project.vitest.coverageProvider as IstanbulCoverageProvider + + return writeCoverageFile(provider.coverageFilesDirectory, coverage) + }, +} + +export async function writeCoverageFile(coverageFilesDirectory: string, coverage: unknown): Promise { + // Write results on file system directly and transfer only the filename over RPC + const filename = resolve( + coverageFilesDirectory, + `coverage-${randomUUID()}.json`, + ) + + try { + await writeFile(filename, JSON.stringify(coverage), 'utf-8') + } + catch (error) { + if (!existsSync(coverageFilesDirectory)) { + throw new Error( + `Something removed the coverage directory "${coverageFilesDirectory}" Vitest created earlier. Make sure you are not running multiple Vitests with the same "coverage.reportsDirectory" at the same time.`, + { cause: error }, + ) + } + + throw error + } + + return filename +} diff --git a/packages/coverage-istanbul/src/index.ts b/packages/coverage-istanbul/src/index.ts index 8feaf6b16..7772ed388 100644 --- a/packages/coverage-istanbul/src/index.ts +++ b/packages/coverage-istanbul/src/index.ts @@ -1,50 +1,29 @@ -import type { CoverageMapData } from 'istanbul-lib-coverage' import type { CoverageProviderModule } from 'vitest/node' -import type { IstanbulCoverageProvider } from './provider' -import { COVERAGE_STORE_KEY } from './constants' +import assert from 'node:assert' +import { BaseCoverageProviderModule } from './base' +import { writeCoverageFile } from './commands' const mod: CoverageProviderModule = { - takeCoverage() { - // @ts-expect-error -- untyped global - return globalThis[COVERAGE_STORE_KEY] - }, - - // Reset coverage map to prevent duplicate results if this is called twice in row - startCoverage() { - // @ts-expect-error -- untyped global - const coverageMap = globalThis[COVERAGE_STORE_KEY] as CoverageMapData + takeCoverage(options) { + const coverage = BaseCoverageProviderModule.takeCoverage() - // When isolated, there are no previous results - if (!coverageMap) { + if (!coverage) { return } - for (const filename in coverageMap) { - const branches = coverageMap[filename].b - - for (const key in branches) { - branches[key] = branches[key].map(() => 0) - } - - for (const metric of ['f', 's'] as const) { - const entry = coverageMap[filename][metric] + const coverageFilesDirectory = options?.coverageFilesDirectory + assert(coverageFilesDirectory, 'coverageFilesDirectory is required') - for (const key in entry) { - entry[key] = 0 - } - } - } + return writeCoverageFile(coverageFilesDirectory, coverage) }, - async getProvider(): Promise { - // to not bundle the provider - const providerPath = './provider.js' - const { IstanbulCoverageProvider } = (await import( - /* @vite-ignore */ - providerPath, - )) as typeof import('./provider') + startCoverage() { + BaseCoverageProviderModule.startCoverage() + }, - return new IstanbulCoverageProvider() + getProvider() { + return BaseCoverageProviderModule.getProvider() }, } + export default mod diff --git a/packages/coverage-istanbul/src/provider.ts b/packages/coverage-istanbul/src/provider.ts index 8cba21b56..b15630978 100644 --- a/packages/coverage-istanbul/src/provider.ts +++ b/packages/coverage-istanbul/src/provider.ts @@ -17,6 +17,7 @@ import { createDebug } from 'obug' import c from 'tinyrainbow' import { BaseCoverageProvider, isCSSRequest } from 'vitest/node' import { version } from '../package.json' with { type: 'json' } +import { commands } from './commands' import { COVERAGE_STORE_KEY } from './constants' const debug = createDebug('vitest:coverage') @@ -31,6 +32,14 @@ export class IstanbulCoverageProvider extends BaseCoverageProvider implements Co initialize(ctx: Vitest): void { this._initialize(ctx) + for (const project of ctx.projects) { + if (project.isBrowserEnabled() && project.browser) { + for (const [name, command] of Object.entries(commands)) { + project.browser.registerCommand(`__vitest_${name}` as any, command) + } + } + } + if (this.options.instrumenter) { this.instrumenter = this.options.instrumenter({ coverageVariable: COVERAGE_STORE_KEY, diff --git a/packages/coverage-v8/src/browser.ts b/packages/coverage-v8/src/browser.ts index cf5b72c4f..e98489c48 100644 --- a/packages/coverage-v8/src/browser.ts +++ b/packages/coverage-v8/src/browser.ts @@ -1,12 +1,9 @@ -import type { Profiler } from 'node:inspector' import type { CoverageProviderModule } from 'vitest/node' import type { V8CoverageProvider } from './provider' import { loadProvider } from './load-provider' let enabled = false -type ScriptCoverage = Profiler.TakePreciseCoverageReturnType - function triggerCommand(command: string, args: any[] = []): Promise { return (globalThis as any).__vitest_browser_runner__.commands.triggerCommand(command, args) } @@ -22,21 +19,8 @@ const mod: CoverageProviderModule = { await triggerCommand('__vitest_startV8Coverage') }, - async takeCoverage(): Promise<{ result: any[] }> { - const coverage: ScriptCoverage = await triggerCommand('__vitest_takeV8Coverage') - const result: typeof coverage.result = [] - - // Reduce amount of data sent over rpc by doing some early result filtering - for (const entry of coverage.result) { - if (filterResult(entry)) { - result.push({ - ...entry, - url: decodeURIComponent(entry.url.replace(window.location.origin, '')), - }) - } - } - - return { result } + async takeCoverage(): Promise { + return triggerCommand('__vitest_takeV8Coverage', [window.location.href]) }, stopCoverage() { @@ -48,35 +32,3 @@ const mod: CoverageProviderModule = { }, } export default mod - -function filterResult(coverage: ScriptCoverage['result'][number]): boolean { - if (!coverage.url.startsWith(window.location.origin)) { - return false - } - - if (coverage.url.includes('/node_modules/')) { - return false - } - - if (coverage.url.includes('__vitest_browser__')) { - return false - } - - if (coverage.url.includes('__vitest__/assets')) { - return false - } - - if (coverage.url === window.location.href) { - return false - } - - if (coverage.url.includes('/@id/@vitest/')) { - return false - } - - if (coverage.url.includes('/@vite/client')) { - return false - } - - return true -} diff --git a/packages/coverage-v8/src/commands.ts b/packages/coverage-v8/src/commands.ts index f160d0162..d37d91859 100644 --- a/packages/coverage-v8/src/commands.ts +++ b/packages/coverage-v8/src/commands.ts @@ -1,7 +1,12 @@ import type { CDPSession } from '@vitest/browser-playwright' import type { BrowserCommand, BrowserCommandContext } from 'vitest/node' +import type { V8CoverageProvider } from './provider' +import { randomUUID } from 'node:crypto' +import { existsSync } from 'node:fs' +import { writeFile } from 'node:fs/promises' +import { resolve } from 'pathe' -export const commands: Record = { +export const commands: Record> = { startV8Coverage, takeV8Coverage, } @@ -15,7 +20,77 @@ async function startV8Coverage(context: BrowserCommandContext): Promise { }) } -async function takeV8Coverage(context: BrowserCommandContext): Promise { +async function takeV8Coverage(context: BrowserCommandContext, pageUrl: string): Promise { const session: CDPSession = await context.__ensureCDPHandler() - return session.send('Profiler.takePreciseCoverage') + const coverage = await session.send('Profiler.takePreciseCoverage') + + const origin = new URL(pageUrl).origin + const result: typeof coverage.result = [] + + for (const entry of coverage.result) { + if (filterResult(entry.url, origin, pageUrl)) { + entry.url = decodeURIComponent(entry.url.replace(origin, '')) + result.push(entry) + } + } + + const provider = context.project.vitest.coverageProvider as V8CoverageProvider + + return await writeCoverageFile(provider.coverageFilesDirectory, { result }) +} + +export async function writeCoverageFile(coverageFilesDirectory: string, coverage: unknown): Promise { + // Write results on file system directly and transfer only the filename over RPC + const filename = resolve( + coverageFilesDirectory, + `coverage-${randomUUID()}.json`, + ) + + try { + await writeFile(filename, JSON.stringify(coverage), 'utf-8') + } + catch (error) { + if (!existsSync(coverageFilesDirectory)) { + throw new Error( + `Something removed the coverage directory "${coverageFilesDirectory}" Vitest created earlier. Make sure you are not running multiple Vitests with the same "coverage.reportsDirectory" at the same time.`, + { cause: error }, + ) + } + + throw error + } + + return filename +} + +function filterResult(url: string, origin: string, pageUrl: string): boolean { + if (!url.startsWith(origin)) { + return false + } + + if (url.includes('/node_modules/')) { + return false + } + + if (url.includes('__vitest_browser__')) { + return false + } + + if (url.includes('__vitest__/assets')) { + return false + } + + if (url === pageUrl) { + return false + } + + if (url.includes('/@id/@vitest/')) { + return false + } + + if (url.includes('/@vite/client')) { + return false + } + + return true } diff --git a/packages/coverage-v8/src/index.ts b/packages/coverage-v8/src/index.ts index b89b29a16..6a6d6805d 100644 --- a/packages/coverage-v8/src/index.ts +++ b/packages/coverage-v8/src/index.ts @@ -1,6 +1,7 @@ import type { Profiler } from 'node:inspector' import type { CoverageProviderModule } from 'vitest/node' import type { ScriptCoverageWithOffset, V8CoverageProvider } from './provider' +import assert from 'node:assert' import { randomUUID } from 'node:crypto' import { existsSync } from 'node:fs' import { readdir, readFile, rm } from 'node:fs/promises' @@ -9,6 +10,7 @@ import { resolve } from 'node:path' import { fileURLToPath } from 'node:url' import { normalize } from 'pathe' import { provider } from 'std-env' +import { writeCoverageFile } from './commands' import { loadProvider } from './load-provider' let enabled = false @@ -41,9 +43,9 @@ const mod: CoverageProviderModule & { await session.post('Profiler.startPreciseCoverage', { callCount: true, detailed: true }) }, - async takeCoverage(options): Promise<{ result: ScriptCoverageWithOffset[] }> { + async takeCoverage(options): Promise { if (provider === 'stackblitz') { - return { result: [] } + return } const session = this.session as inspector.Session @@ -93,7 +95,10 @@ const mod: CoverageProviderModule & { } } - return { result } + const coverageFilesDirectory = options?.coverageFilesDirectory + assert(coverageFilesDirectory, 'coverageFilesDirectory is required') + + return await writeCoverageFile(coverageFilesDirectory, { result }) }, async stopCoverage({ isolate }) { diff --git a/packages/vitest/src/integrations/coverage.ts b/packages/vitest/src/integrations/coverage.ts index 85b5e60ec..56584f0a8 100644 --- a/packages/vitest/src/integrations/coverage.ts +++ b/packages/vitest/src/integrations/coverage.ts @@ -27,7 +27,10 @@ export async function takeCoverageInsideWorker( const coverageModule = await resolveCoverageProviderModule(options, loader) if (coverageModule) { - return coverageModule.takeCoverage?.({ moduleExecutionInfo: loader.moduleExecutionInfo }) + return coverageModule.takeCoverage?.({ + moduleExecutionInfo: loader.moduleExecutionInfo, + coverageFilesDirectory: options.coverageFilesDirectory, + }) } return null diff --git a/packages/vitest/src/node/config/serializeConfig.ts b/packages/vitest/src/node/config/serializeConfig.ts index 8037eb074..4f697f98d 100644 --- a/packages/vitest/src/node/config/serializeConfig.ts +++ b/packages/vitest/src/node/config/serializeConfig.ts @@ -3,6 +3,7 @@ import type { SerializedConfig } from '../../runtime/config' import type { TestProject } from '../project' import { resolve } from 'node:path' import { configDefaults } from '../../defaults' +import { getCoverageFilesDirectory } from '../../utils/coverage' import { isAgent, isForceColor } from '../../utils/env' export function serializeConfig(project: TestProject): SerializedConfig { @@ -51,8 +52,10 @@ export function serializeConfig(project: TestProject): SerializedConfig { snapshotEnvironment: config.snapshotEnvironment, passWithNoTests: config.passWithNoTests, coverage: ((coverage) => { + const reportsDirectory = resolve(globalConfig.root, coverage.reportsDirectory) return { - reportsDirectory: resolve(globalConfig.root, coverage.reportsDirectory), + reportsDirectory, + coverageFilesDirectory: getCoverageFilesDirectory(reportsDirectory, globalConfig.shard), provider: coverage.provider, enabled: coverage.enabled, customProviderModule: 'customProviderModule' in coverage diff --git a/packages/vitest/src/node/coverage.ts b/packages/vitest/src/node/coverage.ts index e1da252e8..f58ca17a1 100644 --- a/packages/vitest/src/node/coverage.ts +++ b/packages/vitest/src/node/coverage.ts @@ -18,7 +18,7 @@ import { glob } from 'tinyglobby' import c from 'tinyrainbow' import { coverageConfigDefaults } from '../defaults' import { resolveCoverageReporters } from '../node/config/resolveConfig' -import { resolveCoverageProviderModule } from '../utils/coverage' +import { getCoverageFilesDirectory, resolveCoverageProviderModule } from '../utils/coverage' type Threshold = 'lines' | 'functions' | 'statements' | 'branches' @@ -65,7 +65,6 @@ const THRESHOLD_KEYS: Readonly = [ ] const GLOBAL_THRESHOLDS_KEY = 'global' const DEFAULT_PROJECT: unique symbol = Symbol.for('default-project') -let uniqueId = 0 export async function getCoverageProvider( options: SerializedCoverageConfig | undefined, @@ -90,7 +89,6 @@ export class BaseCoverageProvider { globMatchers?: { matchExclude: (file: string) => boolean; matchInclude: (file: string) => boolean } coverageFiles: CoverageFiles = new Map() - pendingPromises: Promise[] = [] coverageFilesDirectory!: string reportsDirectoryLock!: ReportsDirectoryLock roots: string[] = [] @@ -137,14 +135,9 @@ export class BaseCoverageProvider { }, } - const shard = this.ctx.config.shard - const tempDirectory = `.tmp${ - shard ? `-${shard.index}-${shard.count}` : '' - }` - - this.coverageFilesDirectory = resolve( + this.coverageFilesDirectory = getCoverageFilesDirectory( this.options.reportsDirectory, - tempDirectory, + this.ctx.config.shard, ) this.reportsDirectoryLock = new ReportsDirectoryLock(resolve(this.options.reportsDirectory)) @@ -289,23 +282,6 @@ export class BaseCoverageProvider { await fs.mkdir(this.coverageFilesDirectory, { recursive: true }) this.coverageFiles = new Map() - this.pendingPromises = [] - } - - private normalizeCoverageFileError(error: unknown): unknown { - if ( - error instanceof Error - && 'code' in error - && error.code === 'ENOENT' - && !existsSync(this.coverageFilesDirectory) - ) { - return new Error( - `Something removed the coverage directory "${this.coverageFilesDirectory}" Vitest created earlier. Make sure you are not running multiple Vitests with the same "coverage.reportsDirectory" at the same time.`, - { cause: error }, - ) - } - - return error } onAfterSuiteRun({ coverage, environment, projectName, testFiles }: AfterSuiteRunMeta): void { @@ -313,6 +289,11 @@ export class BaseCoverageProvider { return } + if (typeof coverage !== 'string') { + throw new TypeError(`Expected string coverage payload, received ${typeof coverage}, ${JSON.stringify(coverage)}`) + } + const filename = coverage + let entry = this.coverageFiles.get(projectName || DEFAULT_PROJECT) if (!entry) { @@ -321,20 +302,9 @@ export class BaseCoverageProvider { } const testFilenames = testFiles.join() - const filename = resolve( - this.coverageFilesDirectory, - `coverage-${uniqueId++}.json`, - ) - entry[environment] ??= {} // If there's a result from previous run, overwrite it entry[environment][testFilenames] = filename - - const promise = fs.writeFile(filename, JSON.stringify(coverage), 'utf-8') - .catch((error) => { - throw this.normalizeCoverageFileError(error) - }) - this.pendingPromises.push(promise) } async readCoverageFiles({ onFileRead, onFinished, onDebug }: { @@ -345,10 +315,7 @@ export class BaseCoverageProvider { onDebug: ((...logs: any[]) => void) & { enabled: boolean } }): Promise { let index = 0 - const total = this.pendingPromises.length - - await Promise.all(this.pendingPromises) - this.pendingPromises = [] + const total = this.coverageFiles.size for (const [projectName, coveragePerProject] of this.coverageFiles.entries()) { for (const [environment, coverageByTestfiles] of Object.entries(coveragePerProject) as Entries) { @@ -363,9 +330,6 @@ export class BaseCoverageProvider { await Promise.all(chunk.map(async (filename) => { const contents = await fs.readFile(filename, 'utf-8') - .catch((error) => { - throw this.normalizeCoverageFileError(error) - }) const coverage = JSON.parse(contents) onFileRead(coverage) diff --git a/packages/vitest/src/runtime/config.ts b/packages/vitest/src/runtime/config.ts index 4c66f5606..584d0f55b 100644 --- a/packages/vitest/src/runtime/config.ts +++ b/packages/vitest/src/runtime/config.ts @@ -175,6 +175,8 @@ export interface SerializedConfig { export interface SerializedCoverageConfig { provider: 'istanbul' | 'v8' | 'custom' | undefined reportsDirectory: string + /** Directory where workers write raw coverage results, shard-aware */ + coverageFilesDirectory: string htmlDir: string | undefined enabled: boolean customProviderModule: string | undefined diff --git a/packages/vitest/src/utils/coverage.ts b/packages/vitest/src/utils/coverage.ts index 49b9ac982..f6141ea1e 100644 --- a/packages/vitest/src/utils/coverage.ts +++ b/packages/vitest/src/utils/coverage.ts @@ -1,4 +1,12 @@ import type { SerializedCoverageConfig } from '../runtime/config' +import { resolve } from 'pathe' + +export function getCoverageFilesDirectory( + reportsDirectory: string, + shard: { index: number; count: number } | undefined, +): string { + return resolve(reportsDirectory, `.tmp${shard ? `-${shard.index}-${shard.count}` : ''}`) +} export interface RuntimeCoverageModuleLoader { import: (id: string) => Promise<{ default: RuntimeCoverageProviderModule }> @@ -26,7 +34,10 @@ export interface RuntimeCoverageProviderModule { /** * Executed on after each run in the worker thread. Possible to return a payload passed to the provider */ - takeCoverage?: (runtimeOptions?: { moduleExecutionInfo?: Map }) => unknown | Promise + takeCoverage?: (runtimeOptions?: { + moduleExecutionInfo?: Map + coverageFilesDirectory: string + }) => unknown | Promise /** * Executed after all tests have been run in the worker thread. @@ -52,7 +63,7 @@ export async function resolveCoverageProviderModule( if (provider === 'v8' || provider === 'istanbul') { let builtInModule = CoverageProviderMap[provider] - if (provider === 'v8' && loader.isBrowser) { + if (loader.isBrowser) { builtInModule += '/browser' } diff --git a/test/coverage-test/test/mixed-versions-warning.unit.test.ts b/test/coverage-test/test/mixed-versions-warning.unit.test.ts index a1a3bb34f..50aea5c99 100644 --- a/test/coverage-test/test/mixed-versions-warning.unit.test.ts +++ b/test/coverage-test/test/mixed-versions-warning.unit.test.ts @@ -39,6 +39,7 @@ test('istanbul provider logs warning if versions do not match', async () => { logger: { warn }, config: configDefaults, _coverageOptions: configDefaults.coverage, + projects: [], } as any) expect(warn).toHaveBeenCalled() diff --git a/test/coverage-test/test/temporary-files.unit.test.ts b/test/coverage-test/test/temporary-files.unit.test.ts index 316944413..f374a8679 100644 --- a/test/coverage-test/test/temporary-files.unit.test.ts +++ b/test/coverage-test/test/temporary-files.unit.test.ts @@ -1,26 +1,10 @@ import { spawn } from 'node:child_process' import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' -import { join, resolve, sep } from 'node:path' +import { join, sep } from 'node:path' import { assert, expect, onTestFinished, test } from 'vitest' import { BaseCoverageProvider } from 'vitest/node' -test('missing coverage temp directory throws an actionable error', async () => { - const provider = new BaseCoverageProvider() - provider.coverageFilesDirectory = resolve('missing-coverage-directory', '.tmp') - - provider.onAfterSuiteRun({ - coverage: { '/src/math.ts': {} }, - environment: 'ssr', - projectName: '', - testFiles: ['math.test.ts'], - } as any) - - await expect(Promise.all(provider.pendingPromises)).rejects.toThrow( - `Something removed the coverage directory "${provider.coverageFilesDirectory}" Vitest created earlier. Make sure you are not running multiple Vitests with the same "coverage.reportsDirectory" at the same time.`, - ) -}) - test('clean() acquires the reportsDirectory lock and cleanAfterRun() releases it', async () => { const { provider, lockFile } = createProvider() diff --git a/test/coverage-test/vitest.config.ts b/test/coverage-test/vitest.config.ts index eac33c781..15af893e7 100644 --- a/test/coverage-test/vitest.config.ts +++ b/test/coverage-test/vitest.config.ts @@ -13,6 +13,10 @@ const FIXTURES = '**/fixtures/**' export default defineConfig({ test: { fsModuleCache: true, + watchTriggerPatterns: [{ + pattern: /test\/coverage-test\/fixtures/, + testsToRun: () => [], + }], reporters: process.env.CI ? 'minimal' : 'verbose', isolate: false, setupFiles: ['./setup.ts'], -- 2.51.2