如何在Istanbul nyc覆盖率报告中正确排除指定文件
问题根因
你的nyc排除规则不生效,核心是三个问题:
- 你混用了两套独立的代码插桩流程:既手动执行了
nyc instrument做预插桩,又在启动脚本里引入了@cypress/instrument-cra做运行时插桩。nyc的exclude规则仅在插桩执行阶段生效,你写的配置没有被实际执行插桩的程序加载。 - 路径配置不匹配:你配置里的临时目录、报告目录带
app/前缀,如果执行命令的项目根目录下没有app层级,通配符匹配路径时会因为前缀不符无法命中目标文件。 @cypress/instrument-cra默认不会自动读取项目根目录下的.nycrc或package.json中的nyc配置项,你写在这两个位置的排除规则对运行时插桩流程完全无效。
修复步骤
按以下顺序操作即可解决问题:
- 清理旧的插桩产物和缓存,执行以下命令:
rm -rf ./coverage ./app/test/coverage ./app/test/.nyc_output ./node_modules/.cache
- 二选一确定插桩方案,不要混用:
- 方案一(推荐,适配Cypress官方流程):保留
@cypress/instrument-cra的启动参数,删掉你手动执行nyc instrument的步骤,不要提前做预插桩。把nyc配置挪到Cypress的插件配置中,让code-coverage插件直接加载规则:
注意把配置里多余的// cypress/plugins/index.js module.exports = (on, config) => { require('@cypress/code-coverage/task')(on, config) config.env.nyc = { reporter: ["lcov", "text-summary"], sourceMap: true, "temp-dir": "test/.nyc_output", "report-dir": "test/coverage", all: true, exclude: ["**/AddressFormatter.js"], "check-coverage": true } return config }app/路径前缀删掉,路径匹配以你执行yarn start命令的目录为根目录。 - 方案二(原生nyc插桩):把package.json里start脚本的
-r @cypress/instrument-cra参数删掉,恢复成原生的"start": "react-scripts start"。后续执行插桩时显式指定配置文件,命令如下:
同样需要把.nycrc.json里的temp-dir、report-dir的nyc instrument --config .nycrc.json ./src ./coverageapp/前缀删掉,避免路径匹配失败。
- 方案一(推荐,适配Cypress官方流程):保留
- 重新启动项目、执行Cypress用例,新生成的覆盖率报告就会自动排除指定的AddressFormatter.js文件。
内容的提问来源于stack exchange,提问作者user17498878
相关产品推荐
相关产品推荐

