他的回复:
覆盖率卡在 60% 通常是三块代码没被覆盖:异常分支、边界条件、以及难以构造输入的私有逻辑。按下面顺序攻。 一,先看报告定位,不要盲补。CodeArts 的覆盖率报告能按文件下钻到行,先按「未覆盖行数 × 业务重要性」排序。经验上 80% 的缺口集中在少数几个类里:工具类、参数校验、异常处理。 二,异常分支是最大的空洞。正常路径 AI 生成得很顺,但 catch 块几乎不会碰。做法是显式告诉它「为每个方法的每个 throw 分支写一个用例」,并给出触发条件。比如空指针、超时、下游返回非 200。 三,边界值。数值取 0、-1、最大值、最大值+1;字符串取空串、单字符、超长;集合取 empty、单元素、null 元素。让 AI 按等价类 + 边界值列表生成,而不是「随便写几个测试」。 四,外部依赖要能注入。覆盖率上不去经常是代码写死了 new 一个客户端,导致分支跑不到。先做构造注入或 setter 注入,再用 mock 构造各种返回值。CodeArts 能识别 Mockito 风格,把依赖注入点告诉它效果明显更好。 五,私有方法和静态方法。私有方法不直接测,测它的调用方;静态工具类可以直接测。实在测不到的,用反射或者在设计上重构为可测形式。 六,排除不该算的行。getter/setter、常量、main 方法、自动生成的代码,用配置排除掉,分母变小覆盖率立刻上升,这部分是合规的,不是作弊。 最后是工程化:把覆盖率门槛写进流水线,比如新增代码行覆盖率低于 70% 就卡住合并。只看总量会一直卡在 60%,只看增量才能持续往上走。