测试覆盖率
测试覆盖率是指衡量现有测试是否完全覆盖代码的做法。它标记出代码中被测试和未被测试的条件、逻辑分支、函数和变量。
覆盖率测试会根据一组行业接受的最佳实践来检查经过插桩的代码。它们充当了 QA 的最后一道防线,以提高测试套件的质量。
每个项目的覆盖率报告都会有所不同,但需要注意的要点是:
- 总体行/分支覆盖率,作为高级健康检查。
- 未覆盖的特定行/分支,这是潜在的测试差距。
当您使用 Vitest 插件 运行组件测试时,它可以生成覆盖率报告。结果会汇总在测试小部件中,显示被测试的 stories 所覆盖的语句百分比。

如果您无法在项目中将 Vitest 插件与覆盖率结合使用,您仍然可以使用 test-runner 生成代码覆盖率。请遵循 test-runner 文档 中的说明,在您的项目中设置 test-runner 和代码覆盖率。
设置
覆盖率包含在 Vitest 插件 中,启用后,在运行项目组件测试时将计算覆盖率。要启用覆盖率,请勾选测试小部件中的覆盖率复选框。

在计算覆盖率之前,您可能需要安装与您的 覆盖率提供商 相对应的支持包。
# For v8
npm install --save-dev @vitest/coverage-v8
# For istanbul
npm install --save-dev @vitest/coverage-istanbul用法
由于覆盖率已内置到 Vitest 插件中,因此您可以在运行测试的任何地方使用它。
Storybook UI
当您在 Storybook UI 中启用覆盖率时,在运行测试后,覆盖率报告将生成并汇总在测试小部件中。您可以看到被测试的 stories 所覆盖的语句百分比,以及覆盖率是否满足 水印。
此外,完整的覆盖率报告将在您正在运行的 Storybook 的 /coverage/index.html 路由下提供。

该报告是交互式的。您可以点击进入组件以查看其源代码,并了解代码的哪些部分被测试覆盖或未被覆盖。

重要的是要理解,Storybook UI 中报告的覆盖率有三个主要限制:
- 覆盖率是使用您编写的 stories 计算的,而不是整个代码库。换句话说,它不包括任何其他 Vitest 测试。
- 覆盖率只能为项目中的所有 stories 计算,而不能为单个 story 或一组 stories 计算。
- 在 watch 模式激活时,不会计算覆盖率。当启用覆盖率时,启用 watch 模式将禁用覆盖率。
CLI
与 Storybook Test 的其他部分一样,覆盖率是建立在 Vitest 之上的。这意味着您可以使用 Vitest CLI 来生成覆盖率报告。
假设您使用类似以下的包脚本运行测试:
{
"scripts": {
"test-storybook": "vitest --project=storybook"
}
}然后您可以通过以下方式生成覆盖率报告:
npm run test-storybook -- --coverage
覆盖率报告将保存在您项目中的 配置的覆盖率报告目录(默认为 ./coverage)中。
上面的命令将仅计算您编写的 stories 的覆盖率,而不是整个代码库。
由于覆盖率在考虑项目中的所有测试时最准确,您还可以运行以下命令来计算项目中的所有测试的覆盖率:
npx vitest --coverage编辑器扩展
通过 Vitest 的 IDE 集成 也可以使用覆盖率。您可以在编辑器中直接计算和显示覆盖率结果。

请注意,此覆盖率将包括您项目中的所有测试,而不仅仅是您编写的 stories。
CI
要在 CI 管道中生成覆盖率报告,您可以使用 CLI。
例如,这是一个简化的 GitHub Actions 工作流,它运行您的测试并生成覆盖率报告:
name: Storybook Tests
on: push
jobs:
test:
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20.x'
- name: Install dependencies
run: yarn
# 👇 This will run all Vitest tests, including Storybook tests
- name: Run tests
run: yarn test --coverage为什么我们要运行所有测试(yarn test),而不是只运行 Storybook 测试(yarn test-storybook)?因为覆盖率报告在考虑项目中的所有测试时最准确,而不仅仅是您编写的 stories。
查看 Storybook 特定的覆盖率 可能很有帮助,但在 CI 输出中,您希望看到项目的综合覆盖率。
有关在 CI 中进行测试的更多信息,请参阅 专用指南。
配置
覆盖率提供商
您可以通过在 Vitest 配置中设置 coverage.provider 选项来选择用于计算覆盖率的提供商,例如 v8(默认)或 Istanbul。
import { defineConfig } from 'vitest/config';
export default defineConfig({
// ...
test: {
// ...
coverage: {
// ...
provider: 'istanbul', // 'v8' is the default
},
},
});水印
这两个覆盖率提供商都支持 水印,它们是覆盖率的阈值。低水印是测试通过所需的最低覆盖率,高水印是认为良好所需的最低覆盖率。介于低水印和高水印之间的覆盖率百分比将被视为可接受但非理想。
在测试小部件中,覆盖率摘要将显示被测试的 stories 所覆盖的语句百分比,以及覆盖率是否满足水印。低于低水印的图标将是红色的,介于低水印和高水印之间将是橙色的,高于高水印将是绿色的。
要配置水印,您可以调整 Vitest 配置:
import { defineConfig } from 'vitest/config';
export default defineConfig({
// ...
test: {
// ...
coverage: {
// ...
watermarks: {
// These are the default values
statements: [50, 80],
},
},
},
});其他配置
您可以在 Vitest 文档 中找到更多关于覆盖率的配置选项。
在 Storybook UI 中计算覆盖率时,以下选项始终被忽略:
enabledcleancleanOnRerunreportOnFailurereporterreportsDirectory
更多测试资源
- Vitest addon for running tests in Storybook
- Interaction testing for user behavior simulation
- 可访问性测试用于可访问性
- Visual testing for appearance
- Snapshot testing for rendering errors and warnings
- CI for running tests in your CI/CD pipeline
- End-to-end testing for simulating real user scenarios
- Unit testing for functionality
- Test runner to automate test execution
