在 Cypress 中测量代码覆盖率

在 Cypress 中测量代码覆盖率

覆盖率报告需要应用先经过 Istanbul 插桩,Cypress 插件再收集浏览器计数并生成报告;可以合并单测、端到端与服务端数据,但覆盖率只能说明代码执行,不代表断言有效。

覆盖率数据从哪里来

浏览器在测试时执行的是经过插桩的应用代码。Istanbul 在构建产物中加入计数器;运行后,window.__coverage__ 暴露每个文件的语句、函数和分支计数。Cypress 负责执行应用并收集浏览器覆盖对象,nyc 再将原始计数转成文本、HTML 或 LCOV 报告。仅安装 Cypress 不会自动插桩应用。

按构建工具插桩

Babel 应用可在测试构建中加入 babel-plugin-istanbul,或使用 nyc 的 instrument 能力。Webpack 项目把 Istanbul 插件接在测试专用 loader/plugin 配置中;Vite 项目使用对应的 Vite Istanbul 插件。应让生产构建保持正常代码路径,只在 Cypress、端到端或 CI 覆盖率任务启用插桩。版本组合按项目 lockfile 固定,并检查测试构建实际包含计数器。

插件也要分别在 Cypress 的浏览器支持代码和 Node 事件处理器中注册。前者收集应用窗口中的覆盖对象;后者初始化 coverage task,并可在运行结束后合并或输出报告。下面仅表示配置职责,模块格式与具体导入路径应按当前插件版本核对:

// cypress/support/e2e.js
import "@cypress/code-coverage/support";

// cypress.config.js 中 setupNodeEvents(on, config)
require("@cypress/code-coverage/task")(on, config);
return config;

不要把来自未受信任测试页面的 coverage JSON 当成代码执行,也不要为启用覆盖率而在公网生产服务暴露内部报告接口。

运行端到端测试并读报告

启用插桩后,Cypress 访问应用并执行测试。测试通过或失败都可能留下已执行部分的计数;插件在测试结束时保存它们。报告能指出哪些行、函数或分支没有被走到。代码被执行不代表测试能发现错误;仍需断言输出、状态变化和错误行为。未覆盖分支适合指导补测,不是自动风险评分。

合并单测、前端与服务端数据

同一工程还可将 Jest、Mocha 或服务端测试产生的原始覆盖计数合并,再由 nyc 生成统一报告。各类测试必须对应相同源码版本并保留正确 source map,否则计数可能映射到错误位置。若单测已经由 Babel 插桩,不要让 nyc 再对相同文件重复插桩。服务端 coverage endpoint 只供本地或隔离 CI 使用;报告可能包含源码路径和内部模块结构,需限制上传访问权限。

商业 UI Coverage 是可选产品能力,不是基础代码覆盖率流程的必要条件。关注语句、函数和分支覆盖率的定义与阈值时,也应结合测试断言质量和实际风险审阅。

源代码构建先做 Istanbul 插桩,浏览器端 Cypress 执行后收集覆盖计数,由 nyc 汇总成报告。
Cypress 负责运行和收集,应用构建工具负责插桩。示意图由本稿绘制。

作者:Cypress 文档贡献者(页面未列个人署名)。原文:Measuring code coverage in Cypress。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容