Skip to main content

Vitest Runner

Since v7.0

A plugin to use the vitest test runner in Stryker.


Install @stryker-mutator/vitest-runner locally within your project folder, like so:

npm i --save-dev @stryker-mutator/vitest-runner

Bring your own test runner

This plugin does not come packaged with it's own version of vitest, instead install your own version of vitest in your project. See @stryker-mutator/vitest-runner's package.json file to discover the minimal required version of vitest.


You can configure the @stryker-mutator/vitest-runner using the stryker.config.json (or stryker.config.js) config file.

"testRunner": "vitest",
"vitest": {
"configFile": "vitest.config.js",
"dir": "packages"

vitest.configFile [string | undefined]

Default: undefined

Specify a 'vitest.config.js' file to be loaded. By default vitest will look for a vitest.config.js (or .ts) file in the root of your project.

vitest.dir [string | undefined]

Since v7.1

Default: undefined

Configure the --dir <path> command line option. See

Non overridable options

The following options will be set by Stryker and cannot be overridden:

threads: true,
coverage: { enabled: false },
singleThread: true,
watch: false,
bail: options.disableBail ? 0 : 1,
onConsoleLog: () => false,

As you can see, the vitest runner:

  • Will run your tests in a single thread
    This is done because StrykerJS uses it's own parallel workers.
  • Will bail on the first test failure (unless you set disableBail to true).
    This is done to boost performance.
  • Will disable code coverage reporting
    This is done because StrykerJS uses it's own coverage analysis, which is supported.

In-source testing

Vitest's in-source testing is supported. However, since your tests are in the same file as your code-under-test, you will need to make sure to exclude your tests from being mutated.

For example, you can add the Stryker disable comment (// Stryker disable all) right before if (import.meta.vitest) like so:

 export function add(...args: number[]) {
return args.reduce((a, b) => a + b, 0)

// in-source test suites
+// Stryker disable all: Unit tests start here
if (import.meta.vitest) {
const { it, expect } = import.meta.vitest
it('add', () => {
expect(add(1, 2, 3)).toBe(6)


The vitest runner has the following limitations:

  • Currently, only threads: true is supported. If you need it if off, please let us know by opening a feature request.
  • Currently, Browser Mode is not supported. If you're using browser mode and want support for it in StrykerJS, please open a feature request
  • Your coverageAnalysis property is ignored. The vitest runner plugin will always use "perTest" coverage analysis (which yields the best performance anyway).