集成测试检查可抛错函数时失败该从何处开始调试排查
存量旧代码触发集成测试抛错的调试优先级方案
出问题的存量代码片段如下:
function foo() { const x = await getData(); if (x && x['token']) { // 业务逻辑 } else { throw Error("Doesn't exist") } }
该错误的直接触发逻辑非常明确:getData()的返回值为假值,或是返回对象中不存在token字段。由于代码本身是未改动的存量逻辑,不需要先翻业务代码,按以下优先级从高到低排查即可,适配大体量项目的调试效率要求:
- 第一优先级:排查测试Mock配置改动
集成测试场景下getData()绝大多数情况会被Mock拦截,这部分改动是此类问题最高发的原因:- 拉取测试目录最近的提交记录,全局搜索
getData方法、其所属数据源模块、token鉴权相关的Mock规则,确认是否有人修改了默认返回值,把原本带token的返回结构改成了undefined、空对象或其他不符合预期的结构 - 直接在失败用例内调用
foo的前一行加日志,打印await getData()的实际返回值,1分钟就能确认是否是Mock返回不符合预期,这类原因占同类问题的80%以上 - 排查是否新增了测试前置/后置钩子,在当前用例执行前清空了登录态、测试凭据缓存
- 拉取测试目录最近的提交记录,全局搜索
- 第二优先级:排查测试环境依赖与配置改动
如果Mock规则没有变动,转向检查测试环境的外部依赖变更:- 确认测试环境对接的后端服务、鉴权服务的种子数据是否被清理或修改,如果
getData没有被Mock而是直连测试环境服务,种子数据丢失会直接导致拿不到有效token - 检查近期的项目依赖升级记录,确认
getData依赖的请求库、鉴权SDK是否有版本升级,是否存在默认传参、鉴权逻辑的breaking change,比如之前默认携带测试环境凭据,升级后不再默认携带
- 确认测试环境对接的后端服务、鉴权服务的种子数据是否被清理或修改,如果
- 第三优先级:排查测试执行逻辑改动
大体量项目的集成测试很容易存在隐式的顺序依赖:- 检查是否有人调整了测试用例的执行顺序,之前运行该用例前会先执行登录逻辑写入有效token,顺序调整后跑
foo时登录步骤还未执行,自然拿不到有效值 - 检查是否新增了其他测试用例,在执行完成后清空了全局token缓存,导致后续跑到该存量用例时缓存已被清除
- 检查是否有人调整了测试用例的执行顺序,之前运行该用例前会先执行登录逻辑写入有效token,顺序调整后跑
- 快速定位技巧:本地切到上一个已知测试全量通过的commit版本,单独运行这个失败的用例:
- 如果老版本同样报错,说明问题出在测试环境、外部依赖,和仓库代码无关
- 如果老版本运行正常,直接对比两个commit之间测试配置、Mock规则、测试脚本相关的diff即可,不需要遍历全量业务代码
内容的提问来源于stack exchange,提问作者sal3jfc
相关产品推荐
相关产品推荐

