You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Istanbul统计Playwright测试覆盖率时非测试文件覆盖率为0

解决Playwright + Istanbul/NYC仅统计测试文件覆盖率的问题

核心原因

当前nyc未对业务代码进行插桩(instrument),导致测试执行时无法收集到业务文件的覆盖数据,仅能捕获测试脚本自身的执行情况。

解决方案步骤

1. 明确指定需要统计的业务文件路径

你的.nycrc中include字段为空,nyc不知道要监控哪些业务代码,需要补充业务文件的路径规则:

{
  "extends": "@istanbuljs/nyc-config-typescript",
  "all": true,
  "check-coverage": true,
  "include": [
    "src/**/*.ts", // 替换成你的业务代码根目录,比如src下所有ts文件
    "lib/**/*.ts"  // 如果有编译后的代码目录也可按需添加
  ],
  "exclude": [
    "playwright.config.ts",
    "**/*.hot-update.js",
    "**/adminFixture.ts",
    "**/baseFixtures.ts",
    "**/userFixture.ts",
    "**/apiFixture.ts"
  ],
  "reporter": ["text", "json-summary", "html"]
}
  • 注意:include的路径要和你实际项目中业务代码的位置匹配,比如如果业务代码在src/components/、src/utils/下,用src/**/*.ts就能覆盖所有子目录的ts文件。

2. 确保Babel插桩插件正确配置

既然使用了babel-plugin-istanbul,需要在Babel配置文件(.babelrc或babel.config.js)中启用该插件,且仅在测试环境生效:

// babel.config.js
module.exports = {
  presets: [/* 你的现有preset,比如@babel/preset-typescript */],
  env: {
    test: {
      plugins: ["istanbul"]
    }
  }
};
  • 这样配置可以避免插桩代码被打包到生产环境,仅在测试时生效。

3. 调整NYC执行命令,确保代码被插桩

直接运行npx nyc playwright test可能无法正确插桩浏览器端的业务代码,需要添加--instrument参数强制nyc对代码进行插桩:

npx nyc --instrument playwright test HistoryTMZDownload.spec.ts

如果你的业务代码是通过Webpack/Vite等构建工具打包的,还需要确保构建过程中启用了Istanbul插桩(比如在测试环境的构建配置中加入babel-plugin-istanbul)。

4. 验证TypeScript配置支持覆盖率映射

因为使用了@istanbuljs/nyc-config-typescript,需要确保你的tsconfig.json中开启了sourceMap:

{
  "compilerOptions": {
    "sourceMap": true, // 必须开启,否则nyc无法将编译后的代码映射回源码
    // 其他配置...
  }
}

5. 检查是否误排除了业务文件

确认.nycrc的exclude规则没有覆盖到业务代码,比如不要出现src/**/*.ts这类排除规则,避免把需要统计的文件排除在外。

验证方法

运行测试后,查看生成的coverage目录下的html报告,检查业务文件是否出现在报告中。如果还是没有,可临时在业务文件中加一行console.log(__cov__),运行测试后查看控制台是否输出覆盖率对象,以此判断代码是否被正确插桩。

内容的提问来源于stack exchange,提问作者dogowar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:58:25