Selenium测试覆盖率文件正常但istanbul(nyc)报告为空如何解决
1. 路径不匹配导致数据被过滤
nyc 生成报告时会校验覆盖率对象内的path字段与本地实际文件路径的一致性,你导出的window.__coverage__中文件路径如果是path/vars.bundle.js这类相对路径,和执行nyc report时工作目录下的实际文件路径不对应,数据就会被默认过滤。
解决方案:
- 执行报告命令时添加
--exclude-after-remap false参数关闭路径过滤 - 配置
.nycrc文件中的root、cwd字段和插桩文件的根目录对齐 - 导出覆盖率数据时统一替换
window.__coverage__内的路径前缀,和本地文件路径保持一致
2. 缺少TS源码映射配置
你是TS编译为JS后再进行插桩,若未配置nyc识别TS文件的规则,或未关联source map,nyc无法将JS覆盖率数据映射到统计维度,会直接丢弃有效数据。
解决方案:
确认插桩时--embed-source true参数已生效,执行报告命令时添加--source-map true参数,同时在项目根目录新增.nycrc配置文件,内容如下:
{ "extension": [".ts", ".js"], "include": ["你的源码目录/**/*", "插桩后JS文件目录/**/*"] }
3. include/exclude规则过滤了目标文件
nyc默认的include规则仅会匹配当前工作目录下的src等常规源码目录,若你的插桩文件存放在dist目录,未显式配置include的话会被直接排除,导致报告无匹配文件、全量显示0覆盖率。
解决方案:
执行报告命令时手动指定需要统计的文件路径,示例:nyc report --cwd . --include ./dist/js/**/* --include ./src/**/*.ts
4. 覆盖率文件格式错误
你提供的覆盖率示例JSON存在语法错误(路径字段后缺少逗号),若实际导出的.nyc_output下的文件存在JSON语法错误、编码异常等问题,nyc在merge阶段不会抛出异常,但解析数据时会跳过无效内容,最终报告为空。
解决方案:
任选一个.nyc_output目录下的JSON文件做格式校验,确认语法无误;导出window.__coverage__时使用JSON.stringify()完整序列化后再写入文件,避免截断或格式损坏。
内容的提问来源于stack exchange,提问作者Bars21

