Skip to content

Community pain points ​

Tracked while designing untestutils. Status: addressed (first-class in the harness), documented (clear docs / escape hatches), out-of-scope (unit-env / framework bugs we do not claim to replace).

Proof dogfood (external consumer): nuxt-i18n-micro CI — 265 e2e tests in ~4 minutes (test:e2e step), shared prepare via untestutils.

@nuxt/test-utils — e2e speed / reuse ​

PainIssueStatusHow untestutils handles it
Slow setup on every rerun#314addressedShared prepare + content-hash cache + prewarm
Opt-in Nuxt app reuse across workers#1750addressed (e2e)Target registry + lock-by-identity; one prepare, many workers — e2e only; unit reuse is separate (see below)
Shared server faster in CI#925addressedFirst-class shared serve / recipe identity
Vitest workspaces#664documentedAbsolute recipe roots; e2e vs unit as separate Vitest projects
Playwright fixture timeout#861documentedReadiness HTTP + sane hook timeouts
Firefox hydration waitUntil#1671out-of-scopeBrowser-specific; Chromium dogfood first
Cookies in context#325documentedLive target + Playwright context; utils for cookie asserts
Nitro Azure preset e2e#908out-of-scopev1: node / static / Nuxt server modes
setup() clobbers console.log#350addressedChild stdout passthrough by default; opt-in capture
multiApp breaks test-utils#1521addressedExplicit recipe root / id per app

@nuxt/test-utils — unit / Nuxt environment ​

Mostly out-of-scope for the recipe e2e core. Optional @untestutils/nuxt + vitest-environment-untestutils cover a separate unit surface — not a drop-in for every mock/mountSuspended request.

PainIssueStatus
Opt-in worker-scoped Nuxt app reuse (unit)#1750, untestutils#1, #1821addressed (appIsolation: 'worker' + soft reset + browser-entry; 0.7.2 hardens per-file hook re-register, keyed resets, document cookie tracker + jsdom jar clear, maxConcurrency: 1, override APIs)
Server environment for unit#531documented (partial; optional package)
Server-only setup()#921out-of-scope
useRuntimeConfig without Nuxt instance#949out-of-scope
mockNuxtImport expose mocks#541out-of-scope
Mock already-loaded #app/nuxt#693out-of-scope
setupFiles before Nuxt env#577documented
Middleware in component tests#526out-of-scope
msw + Nuxt env#1222documented
Browser mode + projects#1322, #984documented (e2e ≠ browser mode)
Vitest 4 environment stub#1482, #1656, #1452addressed (own env package)
Pinia / blank router path#523, #513documented

Vitest platform ​

PainIssueStatusHow untestutils handles it
Monorepo first-class#256documentedRecipe map + abs paths (workspaces exist; harness stays root-safe)
cwd = workspace root in subprojects#5277addressedResolve recipe / fixture roots via absolute paths
Vite root ignored on workspace#6855addressedSame — never rely on process cwd alone
Timeout abort → orphan processes#3077addressedPID teardown + stale lock cleanup
Hangs / close timed out#2008addressedTeardown budgets + force-kill path
Forks runner timeout (v4)#8968documentedPool / isolate defaults for e2e
isolate: false mock bleed#11152documentedPrefer isolate for e2e
Isolate + workspace quirks#6258documentedDogfood matrix
Sharding docs / CI#4269documentedCI shard guidance

Playwright (adjacent) ​

PainIssueStatusHow untestutils handles it
Multiple web servers#8206addressedMulti-recipe / multi-target registry
Locks vs concurrent tests#21484addressedFile locks per build identity
Teardown vs test timeout#15019addressedSeparate teardown budgets
Global beforeEach hooks#9468documentedVitest + Playwright fixtures over shared recipes

Released under the MIT License.