核对缺陷与修复代码的关联是否完整,核心是建立“缺陷—提交—合并—发布”的可追溯链路,再用可复算的覆盖率与缺口清单验证。核对前先确定时间窗和纳入范围,明确关联成立的判定口径,然后从缺陷侧和代码侧双向比对,输出未关联缺陷数、无缺陷来源提交数、关联后未合并或未发布数及各自分母,最后区分漏填、误关联与流程未覆盖三类原因。本文给出一套可直接执行的核对方法与计算示例。
要点总览(TL;DR)
- 核对缺陷与修复代码的关联完整性,要同时查两侧:每个已修复缺陷有代码证据,每段修复代码有缺陷来源,只查一侧会漏掉另一半缺口。
- 指标必须带分母和时间窗:缺陷代码关联覆盖率、无缺陷来源提交占比、关联后未发布占比,三者分母不同,不能合并成一个完整率。
- 关联成立按项目实际采用的层级判定,从提交信息引用到合并请求双向关联再到发布记录可追溯,不同层级的数据不混算。
- 核对按五步执行:导出两侧清单、缺陷侧正向核对、代码侧反向核对、交叉验证合并与发布状态、汇总缺口清单并归类原因。
- 覆盖率反映记录完整性,不说明修复质量;通过标准以团队自身基线确定,不套用外部通用达标线。
核对目标:要回答关联完整还是不完整
核对要产出的结论是一个明确判断:在给定时间窗和范围内,已修复缺陷与修复代码的关联是否完整;如果不完整,缺口分布在哪里、属于哪类原因。这个结论通常服务三类决策:发布把关时确认待发布内容中的缺陷修复都有代码证据;缺陷复盘时确认修复过程记录可回溯;流程改进时定位关联动作在哪个环节缺失。
完整性包含两层含义,核对时需分别统计。第一层是缺陷侧完整:每个已修复缺陷都能找到对应的代码证据,即提交、合并请求或发布记录。第二层是代码侧完整:每段修复类代码都能追溯到缺陷来源,不存在无来源的修复提交。两层缺一不可,只查缺陷侧会漏掉未登记缺陷的修复代码,只查代码侧会漏掉已修复但未提交代码记录的缺陷。
核对边界需要提前划定。本文聚焦缺陷与修复代码之间的关联链路,需求覆盖追溯、需求追溯矩阵属于相邻主题,不在核对范围内;跨对象变更治理与影响分析同样另作处理。核对结论只回答“关联记录是否完整”,不回答“修复是否正确”或“代码质量是否达标”,后者需要代码评审和测试证据支撑。
指标与范围:覆盖率怎么定义、核对哪些缺陷
指标只有配上明确的分母和时间窗才能复算。核对开始前先固定纳入范围:时间窗按缺陷关闭时间或修复版本发布时间截取,二者选其一并全程一致;缺陷状态限定为已修复或已关闭;严重级别按核对目的取舍,发布把关可纳入全部级别,流程改进可先聚焦高优先级;所属项目和代码仓库按核对对象限定,跨仓库项目需分别统计再合并。
排除项要显式列出,避免分母被稀释或污染。非代码修复类缺陷(如配置调整、文档修正、数据订正)不计入代码关联覆盖率;重复缺陷合并到主缺陷后只计一次;由外部依赖或第三方组件修复的缺陷,若本项目无代码提交,单独归类而不计入未关联。排除规则需在报告中写明,保证不同批次核对口径一致。
| 指标名 | 公式 | 分子 | 分母 | 时间窗 | 单位 |
|---|---|---|---|---|---|
| 缺陷代码关联覆盖率 | 有有效代码证据的已修复缺陷数 ÷ 纳入核对的已修复缺陷数 | 缺陷侧能追溯到提交、合并请求或发布记录的缺陷数 | 时间窗内状态为已修复或已关闭、且属于代码修复类的缺陷数 | 按缺陷关闭时间截取 | 百分比 |
| 无缺陷来源提交占比 | 无缺陷引用的修复类提交数 ÷ 时间窗内修复类提交总数 | 提交信息与合并请求均未引用缺陷编号的修复类提交数 | 时间窗内标记为修复类的提交总数 | 按提交合入时间截取 | 百分比 |
| 关联后未发布占比 | 已关联但未进入发布记录的缺陷数 ÷ 已关联缺陷数 | 关联了提交或合并请求、但对应提交未包含在任何发布标签中的缺陷数 | 缺陷代码关联覆盖率分子中的缺陷数 | 截至核对日 | 百分比 |
三个指标的分母各不相同,报告时必须分别标注,不能合并成一个“完整率”。缺陷代码关联覆盖率衡量缺陷侧记录完整性,无缺陷来源提交占比衡量代码侧记录完整性,关联后未发布占比衡量链路末端是否闭合。分母为零时该指标记为“不适用”并说明原因,不写成0%或100%。
数据口径与证据:从哪些记录判定关联成立
判定关联成立需要缺陷侧和代码侧的证据字段同时可用。缺陷侧至少包含缺陷编号、状态、修复版本、关联提交或合并请求引用;代码侧至少包含提交哈希、提交信息中的缺陷引用、合并请求描述中的缺陷编号、发布标签及其包含的提交列表。字段缺失时按“未记录”处理,不推断为“未修复”,并在缺口清单中单独标注。
关联成立可以分三个层级,核对时按项目实际采用的层级判定,不同层级的数据不混算。层级越高,证据链越完整,核对成本也越高。
| 判定层级 | 成立条件 | 证据强度 | 适用场景 |
|---|---|---|---|
| L1 提交信息引用 | 提交信息中包含缺陷编号,缺陷侧可检索到该提交 | 基础 | 快速筛查,适合提交规范执行较好的仓库 |
| L2 合并请求双向关联 | 合并请求描述引用缺陷编号,缺陷记录同时关联该合并请求 | 中等 | 常规核对,能覆盖多提交合并的修复 |
| L3 发布记录可追溯 | 在L2基础上,合并后的提交出现在某个发布标签中 | 完整 | 发布把关,确认修复实际进入交付版本 |
口径不一致的处理要写成规则。例如缺陷侧记录了合并请求编号但代码侧未回填缺陷号,按单向关联计入“部分关联”,不计入覆盖率分子,同时列入待补录清单;提交信息引用格式不统一(如缺陷号带前缀或不带前缀)时,核对脚本需覆盖多种格式,无法匹配的记录人工复核后再定性。缺失值集中出现的仓库或项目,优先检查关联动作是否在流程中被要求,而不是逐条追补。
核对步骤:双向抽样与全量比对怎么做
核对按五步执行,前四步产出数据,第五步产出可分配待办的缺口清单。数据量在可处理范围内时做全量比对,数据量过大时对缺陷侧和代码侧分别抽样,抽样比例和抽样方法需在报告中注明,保证下期可复现。
- 导出两侧清单。从缺陷管理系统导出时间窗内已修复或已关闭的缺陷清单,字段含编号、状态、修复版本、关联提交或合并请求;从代码托管平台导出同时间窗内的提交与合并请求记录,字段含提交哈希、提交信息、合并请求描述、目标分支。两侧清单以缺陷编号和提交哈希为键建立对照表。
- 缺陷侧正向核对。逐条检查纳入范围的缺陷是否存在有效代码证据,按项目采用的判定层级确认证据是否成立。无证据的缺陷标记为“未关联”,有证据但仅单向引用的标记为“部分关联”,两类分别计数。
- 代码侧反向核对。识别时间窗内属于修复类的提交,检查其提交信息或所属合并请求是否引用缺陷编号。无引用的提交标记为“无缺陷来源”,并区分是漏填引用还是确实对应未登记缺陷,后者转入缺陷补登流程。
- 交叉验证合并与发布状态。对已关联的缺陷,确认对应提交已合入目标分支,并检查该提交是否包含在发布标签中。已合入未发布的标记为“待发布”,未合入的标记为“关联未合并”,两类都计入链路未闭合项。
- 汇总缺口清单并归类原因。将上述标记汇总为一张缺口清单,每条记录包含缺陷编号或提交哈希、缺口类型、所属项目、疑似原因、责任人、处理状态。疑似原因按漏填、误关联、流程未覆盖三类初判,复核后确认。
缺口清单建议固定字段:对象标识、缺口类型(未关联、部分关联、无缺陷来源、关联未合并、待发布)、发现日期、所属仓库与项目、疑似原因、处理动作、关闭日期。清单按缺口类型和周批次分组,便于按原因批量处理,而不是逐条追补。
当缺陷记录与代码提交分别存放在不同系统时,关联动作需要有承载位置。ONES 支持在工作项中记录缺陷与代码提交、合并请求的关联关系,核对时可直接从工作项追溯关联记录,减少两侧手工对照的工作量;具体集成方式按团队实际使用的代码托管平台配置。
例子:一次月度核对的完整计算
以下为演示情景,数字仅用于说明计算过程。某项目组核对某月关闭的缺陷,时间窗为该月1日至月末,按缺陷关闭时间截取,判定层级采用L2(合并请求双向关联)。
导出后得到:纳入核对的已修复缺陷120个,其中能追溯到有效代码证据的102个;时间窗内修复类提交共340个,其中未引用缺陷编号的提交28个;已关联的102个缺陷中,对应提交尚未进入任何发布标签的有9个。
- 缺陷代码关联覆盖率 = 102 ÷ 120 = 85.0%。分子为有有效代码证据的缺陷数,分母为纳入核对的已修复缺陷数,单位百分比。
- 无缺陷来源提交占比 = 28 ÷ 340 ≈ 8.2%。分子为无缺陷引用的修复类提交数,分母为修复类提交总数。
- 关联后未发布占比 = 9 ÷ 102 ≈ 8.8%。分子为已关联但未发布的缺陷数,分母为已关联缺陷数。
缺口清单由此生成:18个未关联缺陷进入缺陷侧待补录,28个无来源提交进入代码侧核查,9个待发布缺陷进入发布检查。若某仓库当月无已修复缺陷,其覆盖率分母为零,该仓库记为“不适用”,不参与项目组合并计算,合并时只汇总有分母的仓库并注明覆盖范围。
数据缺失时的处理同样要写进示例口径。若某项目缺陷记录中关联字段整体为空,先抽查10条确认是系统未回填还是确实未关联,确认为系统未回填的,该项目本期覆盖率标记为“数据不可用”,不按0%计入,并在下期核对前完成字段补录。
解读与限制:结果能说明什么、不能说明什么
覆盖率反映的是关联记录的完整性,不能直接等同于修复质量。85%的覆盖率说明15%的缺陷缺少可追溯的代码证据,可能来自漏填、跨仓库提交未关联或流程未要求,但不说明已关联的修复是否正确、是否引入回归。把覆盖率当作质量指标使用,会掩盖代码评审和测试环节的问题。
不同项目、不同判定层级之间的数据不可直接比较。采用L1判定的项目覆盖率天然高于采用L3判定的项目,跨仓库项目与单仓库项目的统计口径也不同。做横向对比时,先统一判定层级、时间窗和排除规则,否则只做各自趋势观察,不做排名。
三类原因的区分方法影响后续动作。漏填表现为缺陷和提交都存在、引用字段为空,处理动作是补录并检查提交模板;误关联表现为引用了错误编号或关联了无关提交,处理动作是更正关联并复核引用规范;流程未覆盖表现为某类修复(如热修复、配置变更)在流程中未被要求关联,处理动作是调整流程要求而非追责个人。三类原因的数量分布决定改进重点。
复核节奏按发布周期设定较为自然:每次发布前核对待发布范围内的缺陷关联,每月或每迭代做一次全量核对。通过标准由团队根据基线确定,例如以本期覆盖率为基线、下期不低于基线且缺口清单按期关闭,不套用外部通用达标线。连续多期覆盖率稳定且缺口清单收敛,可适当降低核对频率,改为抽样复核。
常见问题
缺陷记录里关联字段整体为空,应该按未关联统计还是先补录?
先判断是系统未回填还是确实未关联,不要直接按未关联计入。做法是抽查若干条记录,确认缺陷对应的提交或合并请求是否实际存在:存在但字段为空,属于漏填,本期该项目的覆盖率标记为“数据不可用”,不按0%计入,并在下期核对前完成字段补录;确实找不到代码证据的,才计入未关联缺陷。
如果多个项目同时出现字段整体为空,优先检查关联动作是否在流程中被要求,从流程上补,而不是逐条追补。
一个缺陷对应多个提交或跨仓库提交,覆盖率怎么算?
覆盖率按缺陷计数,不按提交计数。一个缺陷只要存在至少一条有效代码证据,就计入分子一次;对应多个提交时,核对时确认这些提交是否都已合入并进入发布记录,未合入或未发布的按“关联未合并”“待发布”单独标记,不影响该缺陷在覆盖率分子中的计数。
跨仓库提交需要在导出清单时按缺陷编号合并各仓库记录,再统一判定,避免同一缺陷在不同仓库被重复统计或漏计。
提交信息里写了缺陷号,但缺陷记录没有回填合并请求,算关联成立吗?
按项目采用的判定层级处理。如果项目采用L1(提交信息引用),可以判定成立;如果采用L2或L3,这种单向引用只能算“部分关联”,不计入覆盖率分子,同时列入待补录清单,由缺陷负责人回填合并请求后再复核。
这类情况集中出现时,说明关联动作只在一侧执行,需要检查提交模板和缺陷关闭流程是否都要求填写关联信息。
覆盖率连续几期都稳定,可以停止核对吗?
可以降低频率,改为抽样复核,不建议完全停止。稳定说明记录完整性维持得较好,但流程变更、人员调整或新仓库接入都可能让关联动作松动。常见做法是发布前保留待发布范围的核对,全量核对改为按季度或按迭代抽样,抽样比例和判定层级在报告中注明,保证前后可比。
如果抽样中发现缺口明显上升,恢复全量核对并排查原因。
不同项目覆盖率差异很大,能直接排名比较吗?
不能直接比较。判定层级不同会带来系统性差异,采用L1的项目覆盖率天然高于采用L3的项目;时间窗、排除规则、仓库数量不同也会影响结果。做横向观察前先统一判定层级、时间窗和排除规则,统一后仍建议看各自趋势,不做排名。
需要跨项目汇总时,只汇总有分母的项目并注明覆盖范围,分母为零的项目记为“不适用”。
