vitest-dev/vitest · error · Error

@vitest/coverage-v8 does not work with

Error message

@vitest/coverage-v8 does not work with
${browserConfig}

Use either:
${correctExample}

...or change your coverage provider to:
${coverageExample}

What it means

V8 coverage (`@vitest/coverage-v8`) collects coverage through Node's V8 inspector and only works while tests execute in a Node-controlled Chromium over CDP. When a browser project runs through the `preview` provider or a non-Chromium browser (playwright firefox/webkit, or webdriverio with a non-chrome/edge browser), V8 coverage cannot collect anything, so Vitest aborts project resolution and prints both a working browser-provider example and an Istanbul-coverage alternative.

Solutions

  1. Switch coverage to Istanbul: set `coverage: { provider: 'istanbul' }` in the project config (or globally).
  2. Or keep v8 coverage and point the browser instance at a Chromium-based target: `provider: 'playwright'` with `browser: 'chromium'`, or `provider: 'webdriverio'` with `browser: 'chrome'`/`'edge'`.
  3. Or disable coverage for that browser project (`coverage: { enabled: false }`).

Example fix

// before
export default defineConfig({
  test: {
    coverage: { provider: 'v8', enabled: true },
    browser: { provider: 'playwright', instances: [{ browser: 'firefox' }] },
  },
})

// after (option A: istanbul)
export default defineConfig({
  test: {
    coverage: { provider: 'istanbul', enabled: true },
    browser: { provider: 'playwright', instances: [{ browser: 'firefox' }] },
  },
})

// after (option B: chromium so v8 works)
export default defineConfig({
  test: {
    coverage: { provider: 'v8', enabled: true },
    browser: { provider: 'playwright', instances: [{ browser: 'chromium' }] },
  },
})
Defensive patterns

Strategy: validation

Validate before calling

// Reject v8 coverage combined with a non-CDP browser instance before starting Vitest.
function isChromiumTarget(provider: string | undefined, browser: string) {
  if (provider === 'playwright') return browser === 'chromium'
  if (provider === 'webdriverio') return browser === 'chrome' || browser === 'edge'
  return false // 'preview' and others are non-CDP
}
function assertCoverageBrowserCompatible(test: { coverage?: any; browser?: any }) {
  const v8 = test.coverage?.enabled && test.coverage?.provider === 'v8'
  if (!v8) return
  const instances = test.browser?.instances ?? []
  for (const i of instances) {
    const provider = i.provider?.name ?? test.browser?.provider?.name ?? 'preview'
    if (provider === 'preview' || !isChromiumTarget(provider, i.browser)) {
      throw new Error(
        `coverage 'v8' is incompatible with browser instance '${i.name ?? i.browser}' ` +
        `(provider '${provider}'). Use provider 'istanbul' or a Chromium target.`,
      )
    }
  }
}

Prevention

When it happens

Trigger: `projectConfig.coverage.enabled === true` AND `projectConfig.coverage.provider === 'v8'` AND a browser instance whose effective `provider` is `preview`, or whose `(provider, browser)` pair is non-Chromium per `isChromiumName` (playwright requires `chromium`; webdriverio requires `chrome` or `edge`). The check lives in the CDP-only branch at resolveProjects.ts:891-932.

Common situations: Copying a Node-oriented vitest config (with the default `provider: 'v8'`) into a project that enables `browser.instances` with the preview provider or playwright+firefox/webkit; enabling browser mode without realizing the default coverage provider is v8.

Related errors


AI-assisted analysis of vitest-dev/vitest@1fa9837ec2 (2026-08-11). Data as JSON: /api/errors/415f6816e52d90c4. Report an issue: GitHub.

Appendix: source

Thrown at packages/vitest/src/node/projects/resolveProjects.ts:927

  browser: {
    provider: ${preferredProvider}(),
    instances: [
      { browser: '${preferredBrowser}' }
    ],
  },
}
          `.trim()

        if (projectConfig.coverage.enabled && projectConfig.coverage.provider === 'v8') {
          const coverageExample = `
{
  coverage: {
    provider: 'istanbul',
  },
}
            `.trim()

          throw new Error(
            `@vitest/coverage-v8 does not work with\n${browserConfig}\n`
            + `\nUse either:\n${correctExample}`
            + `\n\n...or change your coverage provider to:\n${coverageExample}\n`,
          )
        }

        if (globalConfig.inspect || globalConfig.inspectBrk) {
          const inspectOption = `--inspect${globalConfig.inspectBrk ? '-brk' : ''}`

          throw new Error(
            `${inspectOption} does not work with\n${browserConfig}\n`
            + `\nUse either:\n${correctExample}`
            + `\n\n...or disable ${inspectOption}\n`,
          )
        }
      }

      if (names.has(name)) {

View on GitHub (pinned to 1fa9837ec2)