Test coverage

Watch a video tutorial on the Storybook channel

Test coverage is the practice of measuring whether existing tests fully cover your code. That means surfacing areas which aren't currently being tested, such as: conditions, logic branches, functions and variables.

Coverage tests examine the instrumented code against a set of industry-accepted best practices. They act as the last line of QA to improve the quality of your test suite.

Code instrumentation with the coverage addon

Storybook provides an official test coverage addon. Powered by Istanbul, which allows out-of-the-box code instrumentation for the most commonly used frameworks and builders in the JavaScript ecosystem.

Set up the coverage addon

Engineered to work alongside modern testing tools (e.g., Playwright), the coverage addon automatically instruments your code and generates code coverage data. For an optimal experience, we recommend using the test runner alongside the coverage addon to run your tests.

Run the following command to install the addon.

Update your Storybook configuration (in .storybook/main.js|ts) to include the coverage addon.

Start your Storybook with:

Finally, open a new terminal window and run the test-runner with:

Coverage test output

Configure

By default, the @storybook/addon-coverage offers zero-config support for Storybook and instruments your code via istanbul-lib-instrument for Webpack, or vite-plugin-istanbul for Vite. However, you can extend your Storybook configuration file (i.e., .storybook/main.js|ts) and provide additional options to the addon. Listed below are the available options and examples of how to use them.

The available options if your project uses Webpack5 are as follows:

Option nameDescriptionTypeDefault
cwdSet the working directoryStringprocess.cwd()
nycrcPathPath to specific nyc config to use instead of automatically searching for a nycconfig.string-
includeGlob pattern to include files. It has precedence over the include definition from your nyc configArray<String>-
excludeGlob pattern to exclude files. It has precedence over the exclude definition from your nyc configArray<String>defaultExclude in https://github.com/storybookjs/addon-coverage/blob/main/src/constants.ts
extensionList of supported extensions. It has precedence over the extension definition from your nyc configArray<String>['.js', '.cjs', '.mjs', '.ts', '.tsx', '.jsx', '.vue', '.svelte]
coverageVariableThe global variable name that Istanbul will use to store coverage results.string-
preserveCommentsIndicates whether comments in the code should be preserved during the instrumentation process.booleantrue
compactControls whether the output of instrumented code is compacted. Useful for debugging when set to false.booleanfalse
esModulesDetermines whether the code to be instrumented uses ES Module syntax.booleantrue
autoWrapWhen set to true, wraps program code in a function to enable top-level return statements.booleantrue
produceSourceMapIf true, instructs Istanbul to produce a source map for the instrumented code.booleantrue
sourceMapUrlCallbackA callback function that gets invoked with the filename and the source map URL when a source map is generated.function-
debugEnables the debug mode, providing additional logging information during the instrumentation process.boolean-

Note: If you're using TypeScript, you can import the type for the options like so:

Loading...

The available options if your project uses Vite are as follows:

Option nameDescriptionTypeDefault
cwdSet the working directoryStringprocess.cwd()
includeSee here for more infoArray<String> or string['**']
excludeSee here for more infoArray<String> or stringlist
extensionList of extensions that nyc should attempt to handle in addition to .jsArray<String> or string['.js', '.cjs', '.mjs', '.ts', '.tsx', '.jsx', '.vue', '.svelte]
requireEnv Optional boolean to require the environment variable (defaults to VITE_COVERAGE) to equal true in order to instrument the code. Otherwise it will instrument even if env variable is not set. However if requireEnv is not set the instrumentation will stop if the environment variable is equal to false.boolean-
cypress Optional boolean to change the environment variable to CYPRESS_COVERAGE instead of VITE_COVERAGE. For ease of use with @cypress/code-coverage coverageboolean-
checkProd Optional boolean to enforce the plugin to skip instrumentation for production environments. Looks at Vite's isProduction key from the ResolvedConfig.boolean-
forceBuildInstrument Optional boolean to enforce the plugin to add instrumentation in build mode.booleanfalse
nycrcPath Path to specific nyc config to use instead of automatically searching for a nycconfig. This parameter is just passed down to @istanbuljs/load-nyc-config.string-

Note: If you're using TypeScript, you can import the type for the options like so:

Loading...

What about other coverage reporting tools?

Out of the box, code coverage tests work seamlessly with Storybook's test-runner and the @storybook/addon-coverage. However, that doesn't mean you can't use additional reporting tools (e.g., Codecov). For instance, if you're working with LCOV, you can use the generated output (in coverage/storybook/coverage-storybook.json) and create your own report with:


Troubleshooting

Run test coverage in other frameworks

If you intend on running coverage tests in frameworks with special files like Vue 3 or Svelte, you'll need to adjust your configuration and enable the required file extensions. For example, if you're using Vue, you'll need to add the following to your nyc configuration file (i.e., .nycrc.json or nyc.config.js):

The coverage addon doesn't support optimized builds

If you generated a production build optimized for performance with the --test flag, and you're using the coverage addon to run tests against your Storybook, you may run into a situation where the coverage addon doesn't instrument your code. This is due to how the flag works, as it removes addons that have an impact on performance (e.g., Docs, coverage addon). To resolve this issue, you'll need to adjust your Storybook configuration file (i.e., .storybook/main.js|ts) and include the disabledAddons option to allow the addon to run tests at the expense of a slower build.

The coverage addon doesn't support instrumented code

As the coverage addon is based on Webpack5 loaders and Vite plugins for code instrumentation, frameworks that don't rely upon these libraries (e.g., Angular configured with Webpack), will require additional configuration to enable code instrumentation. In that case, you can refer to the following repository for more information.

Learn about other UI tests

Was this page helpful?

Markdown accepted ([link text](url), _italic_, **bold**, etc). Your anonymous feedback will be posted publicly on GitHub.

✍️ Edit on GitHub – PRs welcome!
Storybook
Join the community
6,560 developers and counting
WhyWhy StorybookComponent-driven UI
DocsGuidesTutorialsChangelogTelemetryStatus
CommunityIntegrationsGet involvedBlog
ShowcaseExploreProjectsComponent glossary
Open source software
Storybook

Maintained by
Chromatic
Special thanks to Netlify and CircleCI