v4.1.0
Vitest 4.1 is out!
This release page lists all changes made to the project during the 4.1 beta. To get a review of all the new features, read our blog post.
🚀 Features
- Return a disposable from doMock() - by @kirkwaiblinger in https://github.com/vitest-dev/vitest/issues/9332 <samp>(e3e65)</samp>
- Added chai style assertions - by @ronnakamoto and @sheremet-va in https://github.com/vitest-dev/vitest/issues/8842 <samp>(841df)</samp>
- Update to sinon/fake-timers v15 and add
setTickModeto timer controls - by @atscott and @sheremet-va in https://github.com/vitest-dev/vitest/issues/8726 <samp>(4b480)</samp> - Expose matcher types - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9448 <samp>(3e4b9)</samp>
- Add
toTestSpecificationto reported tasks - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9464 <samp>(1a470)</samp> - Show a warning if
vi.mockorvi.hoistedare declared outside of top level of the module - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9387 <samp>(5db54)</samp> - Track and display expectedly failed tests (.fails) in UI and CLI - by @Copilot, sheremet-va and @sheremet-va in https://github.com/vitest-dev/vitest/issues/9476 <samp>(77d75)</samp>
- Support tags - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9478 <samp>(de7c8)</samp>
- Implement
aroundEachandaroundAllhooks - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9450 <samp>(2a8cb)</samp> - Stabilize experimental features - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9529 <samp>(b5fd2)</samp>
- Accept
neworallin--updateflag - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9543 <samp>(a5acf)</samp> - Support
metain test options - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9535 <samp>(7d622)</samp> - Support type inference with a new
test.extendsyntax - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9550 <samp>(e5385)</samp> - Support vite 8 beta, fix type issues in the config with different vite versions - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9587 <samp>(99028)</samp>
- Add assertion helper to hide internal stack traces - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9594 <samp>(eeb0a)</samp>
- Store failure screenshots using artifacts API - by @macarie in https://github.com/vitest-dev/vitest/issues/9588 <samp>(24603)</samp>
- Allow
vitest listto statically collect tests instead of running files to collect them - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9630 <samp>(7a8e7)</samp> - Add
--detect-async-leaks- by @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9528 <samp>(c594d)</samp> - Implement
mockThrowandmockThrowOnce- by @thor-juhasz and @sheremet-va in https://github.com/vitest-dev/vitest/issues/9512 <samp>(61917)</samp> - Support
update: "none"and add docs about snapshots behavior on CI - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9700 <samp>(05f18)</samp> - Support playwright
launchOptionswithconnectOptions- by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9702 <samp>(f0ff1)</samp> - Add
page/locator.markAPI to enhance playwright trace - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9652 <samp>(d0ee5)</samp> - api:
- Support tests starting or ending with
testinexperimental_parseSpecification- by @jgillick and Jeremy Gillick in https://github.com/vitest-dev/vitest/issues/9235 <samp>(2f367)</samp> - Add filters to
createSpecification- by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9336 <samp>(c8e6c)</samp> - Expose
runTestFilesas alternative torunTestSpecifications- by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9443 <samp>(43d76)</samp> - Add
allowWriteandallowExecoptions toapi- by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9350 <samp>(20e00)</samp> - Allow passing down test cases to
toTestSpecification- by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9627 <samp>(6f17d)</samp>
- Support tests starting or ending with
- browser:
- Add
userEvent.wheelAPI - by @macarie in https://github.com/vitest-dev/vitest/issues/9188 <samp>(66080)</samp> - Add
filterNodeoption to prettyDOM for filtering browser assertion error output - by @Copilot, sheremet-va and @sheremet-va in https://github.com/vitest-dev/vitest/issues/9475 <samp>(d3220)</samp> - Support playwright persistent context - by @hi-ogawa, Claude Opus 4.6 and @sheremet-va in https://github.com/vitest-dev/vitest/issues/9229 <samp>(f865d)</samp>
- Added
detailsPanelPositionoption and button - by @shairez in https://github.com/vitest-dev/vitest/issues/9525 <samp>(c8a31)</samp> - Use BlazeDiff instead of pixelmatch - by @macarie in https://github.com/vitest-dev/vitest/issues/9514 <samp>(30936)</samp>
- Add
findElementand enable strict mode in webdriverio and preview - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9677 <samp>(c3f37)</samp>
- Add
- cli:
- Add @bomb.sh/tab completions - by @AmirSa12 and @sheremet-va in https://github.com/vitest-dev/vitest/issues/8639 <samp>(200f3)</samp>
- coverage:
- Support
ignore start/stopignore hints - by @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9204 <samp>(e59c9)</samp> - Add
coverage.changedoption to report only changed files - by @kykim00 and @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9521 <samp>(1d939)</samp>
- Support
- experimental:
- Add
onModuleRunnerhook toworker.init- by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9286 <samp>(e977f)</samp> - Option to disable the module runner - by @sheremet-va and @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9210 <samp>(9be61)</samp>
- Add
importDurations: { limit, print }options - by @hi-ogawa, Claude Opus 4.6 and @sheremet-va in https://github.com/vitest-dev/vitest/issues/9401 <samp>(7e10f)</samp> - Add print and fail thresholds for
importDurations- by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9533 <samp>(3f7a5)</samp>
- Add
- fixtures:
- Pass down file context to
beforeAll/afterAll- by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9572 <samp>(c8339)</samp>
- Pass down file context to
- reporters:
- Add
agentreporter to reduce ai agent token usage - by @cpojer in https://github.com/vitest-dev/vitest/issues/9779 <samp>(3e9e0)</samp>
- Add
- runner:
- Enhance
retryoptions - by @MazenSamehR, Matan Shavit, @AriPerkkio and @sheremet-va in https://github.com/vitest-dev/vitest/issues/9370 <samp>(9e4cf)</samp>
- Enhance
- ui:
- Allow run individual test/suites - by @userquin in https://github.com/vitest-dev/vitest/issues/9465 <samp>(73b10)</samp>
- Add project filter/sort support - by @userquin in https://github.com/vitest-dev/vitest/issues/8689 <samp>(0c7ea)</samp>
- Add duration sorting to explorer - by @julianhahn and @cursoragent in https://github.com/vitest-dev/vitest/issues/9603 <samp>(209b1)</samp>
- Implement filter for slow tests - by @DerYeger and @userquin in https://github.com/vitest-dev/vitest/issues/9705 <samp>(8880c)</samp>
- vitest:
- Add run summary in GitHub Actions Reporter - by @macarie and jhnance in https://github.com/vitest-dev/vitest/issues/9579 <samp>(96bfc)</samp>
🐞 Bug Fixes
- Deprecate several vitest/* entry points - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9347 <samp>(fd459)</samp>
- Use
meta.urlincreateRequire- by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9441 <samp>(e3422)</samp> - Preact browser mode init example of render function not async - by @WuMingDao in https://github.com/vitest-dev/vitest/issues/9375 <samp>(2bea5)</samp>
- Deprecate unused types in matcher context - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9449 <samp>(20f87)</samp>
- Handle
external/noExternalduringconfigEnvironmenthook - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9508 <samp>(59ea2)</samp> - Replace default ssr environment runner with Vitest server module runner - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9506 <samp>(cd5db)</samp>
- Propagate experimental CLI options to child projects - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9531 <samp>(b624f)</samp>
- Show a warning when
browser.isolateis used - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9410 <samp>(3d48e)</samp> - Fix
vi.mock({ spy: true })node v8 coverage - by @hi-ogawa, hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9541 <samp>(687b6)</samp> - Don't show internal ssr handler in errors - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9547 <samp>(76c43)</samp>
- Close vitest if it failed to start - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9573 <samp>(728ba)</samp>
- Fix ssr environment runner in project - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9584 <samp>(09006)</samp>
- Trim trailing white spaces in code block - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9591 <samp>(f78be)</samp>
- Support inline snapshot inside test.for/each - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9590 <samp>(615fd)</samp>
- Apply source maps for external module stack trace - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9152 <samp>(79e20)</samp>
- Remove the
.namefrom statically collected test - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9596 <samp>(b66ff)</samp> - Don't suppress warnings on pnp - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9602 <samp>(89cbd)</samp>
- Support snapshot with
expect.soft- by @iumehara, @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9231 <samp>(3eb2c)</samp> - Log seed when only
sequence.shuffle.testsis enabled - by @kaigritun, Kai Gritun and @sheremet-va in https://github.com/vitest-dev/vitest/issues/9576 <samp>(8182b)</samp> - Externalize
expect/src/utilsfromvitest- by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9616 <samp>(48739)</samp> - Ignore test.override during static collection - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9620 <samp>(09174)</samp>
- Increase stacktrace limit for
--detect-async-leaks- by @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9638 <samp>(9fd4c)</samp> - Hanging-reporter link in cli - by @flx-sta in https://github.com/vitest-dev/vitest/issues/9649 <samp>(7c103)</samp>
- Fix teardown timeout of
aroundEach/Allwhen inneraroundEach/Allthrows - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9657 <samp>(4ec6c)</samp> - Fix ui mode / html reporter and coverage integration - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9626 <samp>(86fad)</samp>
- Don't continue when
aroundEach/Allsetup timed out - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9670 <samp>(bb013)</samp> - Align
VitestRunnerConfigoptional fields withSerializedConfig- by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9661 <samp>(79520)</samp> - Handle Symbol values in format utility - by @nami8824 in https://github.com/vitest-dev/vitest/issues/9658 <samp>(0583f)</samp>
- Deprecate
toBe*spy assertions in favor oftoHaveBeen*(andtoThrowError) - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9665 <samp>(4d390)</samp> - Don't propagate nested
aroundEach/Allerrors but aggregate them on runner - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9673 <samp>(b6365)</samp> - Show a better error if there is a pending dynamic import - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9676 <samp>(7ef5c)</samp>
- Preserve stack trace of
resolves/rejectschained assertion error - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9679 <samp>(c6151)</samp> - Handle module-sync condition in vmThreads/vmForks require - by @lesleh in https://github.com/vitest-dev/vitest/issues/9650 and https://github.com/vitest-dev/vitest/issues/9651 <samp>(bb203)</samp>
- Hooks should respect
maxConcurrency- by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9653 <samp>(16d13)</samp> - Recursively autospy module object - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9687 <samp>(695a8)</samp>
- Remove trailing spaces from diff error log - by @hi-ogawa and @sheremet-va in https://github.com/vitest-dev/vitest/issues/9680 <samp>(395d1)</samp>
- Respect project
resolve.conditionsfor externals - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9717 <samp>(1d498)</samp> - Use object for WeakMap instead of a symbol to support webcontainers - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9731 <samp>(c5225)</samp>
- Fix re-mocking virtual module - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9748 <samp>(3cbbb)</samp>
- Cancelling should stop current test immediately - by @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9729 <samp>(0cb2f)</samp>
- Make
mockObjectchange backwards compatible - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9744 <samp>(84c69)</samp> - Fix
URL.nameon jsdom - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9767 <samp>(031f3)</samp> - Save and restore module graph in blob reporter - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9740 <samp>(84355)</samp>
- Don't silence reporter errors from test runtime events handler in normal run and --merge-reports - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9727 <samp>(4072d)</samp>
- Fix
vi.importActual()for virtual modules - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9772 <samp>(1e89e)</samp> - Throw
FixtureAccessErrorif suite hook accesses undefined fixture - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9786 <samp>(fc2ce)</samp> - Allow hyphens in project config file name pattern - by @Koutaro-Hanabusa and @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9760 <samp>(33e96)</samp>
- Manual and redirect mock shouldn't
loadortransformoriginal module - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9774 <samp>(a8216)</samp> hideSkippedTestsshould not hidetest.todo- by @oilater in https://github.com/vitest-dev/vitest/issues/9562 and https://github.com/vitest-dev/vitest/issues/9781 <samp>(8181e)</samp>- Allow catch/finally for async assertion - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9827 <samp>(031f0)</samp>
- Resolve fixture overrides from test's suite in
beforeEachhooks - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9826 <samp>(99e52)</samp> - Use isAgent check, not just TTY, for watch mode - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9841 <samp>(c3cac)</samp>
- Use
performance.nowto measure test timeout duration - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9795 <samp>(f48a6)</samp> - Correctly identify concurrent test during static analysis - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9846 <samp>(1de0a)</samp>
- browser:
- Avoid updating screenshots when
toMatchScreenshotpasses - by @macarie in https://github.com/vitest-dev/vitest/issues/9289 <samp>(46aab)</samp> - Hide injected data-testid attributes - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9503 <samp>(c8d2c)</samp>
- Throw an error if iframe was reloaded - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9516 <samp>(73a81)</samp>
- Encode projectName in browser client URL - by @dkkim0122 in https://github.com/vitest-dev/vitest/issues/9523 <samp>(5b164)</samp>
- Don't take failure screenshot if tests have artifacts created by
toMatchScreenshot- by @macarie in https://github.com/vitest-dev/vitest/issues/9552 <samp>(83ca0)</samp> - Remove
--remote-debugging-addressfrom chrome args - by @hi-ogawa and @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9712 <samp>(f09bb)</samp> - Make sure userEvent actions support
ensureAwaited- by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9732 <samp>(97685)</samp> - Types of
getCDPSessionandcdp()- by @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9716 <samp>(689a2)</samp> - Skip esbuild.legalComments when using rolldown-vite - by @Copilot, hi-ogawa and @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9803 <samp>(3505f)</samp>
- Avoid updating screenshots when
- chai:
- Don't allow
deepEqualin the config because it's not serializable - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9666 <samp>(9ee99)</samp>
- Don't allow
- coverage:
- Infer transform mode for uncovered files - by @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9435 <samp>(f3967)</samp>
thresholds.autoUpdateto preserve ending whitespace - by @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9436 <samp>(7e534)</samp>
- deps:
- Update all non-major dependencies - by @hi-ogawa in https://github.com/vitest-dev/vitest/issues/9192 <samp>(90c30)</samp>
- Update all non-major dependencies - in https://github.com/vitest-dev/vitest/issues/9485 <samp>(c0118)</samp>
- Update all non-major dependencies - in https://github.com/vitest-dev/vitest/issues/9567 <samp>(13c9e)</samp>
- docs:
- Fix old
/config/#optionhash links causing hydration errors - by @hi-ogawa, Claude Opus 4.6 and @sheremet-va in https://github.com/vitest-dev/vitest/issues/9610 <samp>(a603c)</samp>
- Fix old
- expect:
toMatchObject(Map/Set)should expectMap/Seton left hand side - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9532 <samp>(381da)</samp>- Fix objectContaining with proxy - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9554 <samp>(7ce34)</samp>
- Support arbitrary value equality for
toThrowand make Error detection robust - by @hi-ogawa and Claude Opus 4.6 in https://github.com/vitest-dev/vitest/issues/9570 <samp>(de215)</samp>
- mock:
- Inject helpers after hashbang if present - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9545 <samp>(65432)</samp>
- mocker:
- Update vite's peer dependency range - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9808 <samp>(36f9a)</samp>
- reporter:
dotreporter leaves pending tests - by @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9684 <samp>(4d793)</samp>
- runner:
- Mark repeated tests as finished on last run - by @AriPerkkio in https://github.com/vitest-dev/vitest/issues/9707 <samp>(cc735)</samp>
- spy:
- Support deep partial in vi.mocked - by @j2h30728 in https://github.com/vitest-dev/vitest/issues/8152 and https://github.com/vitest-dev/vitest/issues/9493 <samp>(71cb5)</samp>
- Fallback to object accessor if descriptor's value is
undefined- by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9511 <samp>(6f181)</samp> - Throw correct errors when shorthand methods are used on a class - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9513 <samp>(5d0fd)</samp>
- types:
bench.reportersno longer gives type errors when passing file name string paths - by @Bertie690 in https://github.com/vitest-dev/vitest/issues/9695 <samp>(093c8)</samp>
- ui:
- Process artifact attachments when generating HTML reporter - by @macarie in https://github.com/vitest-dev/vitest/issues/9472 <samp>(96eb9)</samp>
- Don't fail if --ui and --root are specified together - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9536 <samp>(d9305)</samp>
🏎 Performance
- pretty-format: Combine DOMElement plugins - by @sheremet-va in https://github.com/vitest-dev/vitest/issues/9581 <samp>(da85a)</samp>
View changes on GitHub
Fetched June 1, 2026