想象你带母亲去体检。她每年都量血压、测血糖,心电图、胸片一样不落,自认为身体很健康。可今年医生多加了一项颈动脉超声,竟然查出 70% 狭窄,一家人吓出一身冷汗。问题来了:为什么过去十年的体检都没发现?因为检查项目清单上根本没有这一项——不是医生不认真,而是“该查的没查”。AI 模型的测试也一样:团队可能跑了很多次实验,每次都喂同样的数据、验证同样的场景,就像只查血压血糖却漏掉颈动脉的体检。测试覆盖度(Test Coverage)回答的正是“你的测试到底检查了模型的哪些部分”。它不是问你测了多少次,而是问你该测的项目清单上,有多少项真正被测试覆盖到了。这个清单横跨三个层面:数据层面(输入样本是否覆盖全部类别和场景)、代码层面(模型代码里的每条语句和分支是否被执行)、边界层面(极值和异常输入是否被验证)。这就像一次全面体检要查清单上的每个器官、每条血管,还要做压力测试。接下来,我们将一步步拆解如何建立覆盖度模型、自动统计覆盖率、识别盲区并及时补测,最终把“测过”变成“测全”。

岗位关联

掌握覆盖度建模与自动统计,你能把“测试证明”从主观描述变成可量化的工程证据,避免模型上线后因盲区遗漏导致的线上事故,为团队带来确定性的质量交付。

目录
  1. 可视化演示
  2. 覆盖度概念:体检要有一张完整的检查清单
  3. 数据覆盖:每个“器官系统”都别放过
  4. 代码覆盖:每条“血管通路”都要显影
  5. 边界覆盖:别只在安静时量血压
  6. 覆盖度模型与统计:给体检报告算一个总分
  7. 盲区补充与落地:开加急单并固化进流程
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

特征空间分布 特征维度 1 特征维度 2 ML 测试覆盖度三维可视化:数据覆盖展示特征空间分布密度、代码覆盖展示推理/Pipeline/预处理三层覆盖、边界覆盖展示极端场景测试点。

覆盖度概念:体检要有一张完整的检查清单

有位朋友每年都体检,血常规、胸片、心电图全查,自觉身体很好。可去年体检新增了颈动脉超声,竟查出 70% 狭窄,吓得全家庆幸发现得早。但问题值得深想:他过去十年“年年体检”,为什么没发现?因为检查项目清单里根本没有这个项目。检查再勤,也没用——没上清单的器官,永远不会被发现出了问题。

测试覆盖度回答的正是“你的检查清单有多全”。在 ML 测试里,我们测一个模型,不能只说“测过了”,而要问:哪些数据被覆盖了?哪些代码分支被执行了?哪些极端边界被触碰了?这三类就组成了覆盖度的三个层面:数据覆盖、代码覆盖和边界覆盖。清单里一旦有项目没测,就形成了测试盲区——看不见的风险,比已知风险更可怕。

覆盖率有一个统一的计算思想:用已覆盖的项目数除以应覆盖的项目总数。

覆盖度不是“测试数量多”,而是“该测的项目都测到了”。要建立覆盖度闭环,就得经历“定义项目 → 统计覆盖率 → 识别盲区 → 补充测试 → 再统计”的循环,就像医生每年根据新的风险认知修订体检套餐。

Coverage=NcoveredNtotal\displaystyle \text{Coverage} = \frac{N_{\text{covered}}}{N_{\text{total}}}
覆盖率就是一个比值:该测的项目里,测到了多少。它回答的是“全面性”,而不是“数量多”。
  1. 分子已覆盖项目数:指在当前测试活动中,已经得到验证的数据类别、代码语句或边界场景数量。
    Ncovered=已被测试触及的项目个数\displaystyle N_{\text{covered}} = \text{已被测试触及的项目个数}
  2. 分母应覆盖项目总数:指根据业务需求、代码结构或场景清单清点出的全部待测项目数量。
    Ntotal=待覆盖项目总数\displaystyle N_{\text{total}} = \text{待覆盖项目总数}
  3. 覆盖度的含义两者相除得到一个 0 到 1 之间的比值,1 表示清单全部被检查到。
    Coverage∈[0,1]\displaystyle \text{Coverage} \in [0, 1]

数据覆盖:每个“器官系统”都别放过

全面体检不会只查心脏。你的肺、肝、肾、甲状腺都得看。如果医生只盯着心血管,却对肿瘤标志物不加理会,那再高级的仪器也只能看见局部。数据覆盖也一样,它决定测试输入是否像“全身体检”一样遍历病人的每个系统。

数据覆盖的核心是测试样本能否代表真实世界的多样性。设计数据覆盖时,要检查四件事:数据分布覆盖,测试集各特征的分布要和生产环境真实分布尽量一致;样本多样性,文本、图像、音频等内容的风格和属性足够丰富;场景覆盖,注册、并发高峰、极端天气等完整业务场景有没有对应样本;类别均衡,少数类样本不能几乎没有代表,否则就被多数类样本掩盖了盲区。

如果把类别理解为体检中的“系统”,那么给每个系统按重要性加权,再统计覆盖情况,就是加权数据覆盖率。

加权数据覆盖像体检“按系统加权”——心血管问题权重高、指甲盖问题权重低,这样既不会漏掉高风险系统,也不会被海量普通样本冲淡注意力。

DataCov=∑c=1CwcIc∑c=1Cwc\displaystyle \text{DataCov} = \frac{\sum_{c=1}^{C} w_c I_c}{\sum_{c=1}^{C} w_c}
数据覆盖率是“按重要性加权的类别覆盖程度”,防止少数类盲区被大量常见样本淹没。
  1. 类别总数把所有业务样本分成多个子集,如用户类型、地区、商品分类,就像体检把身体分系统。
    c=1,2,…,C\displaystyle c = 1, 2, \dots, C
  2. 类别权重权重越大说明该类越重要,即便样本数量少也必须在覆盖清单上占一席。
    wc≥0\displaystyle w_c \ge 0
  3. 覆盖指示变量如果类别 c 至少有一个样本被测试到,则记为 1,否则为 0。
    Ic∈{0,1}\displaystyle I_c \in \{0, 1\}
  4. 加权平均分子是每类的权重与覆盖标记的乘积之和,分母是权重之和。
    DataCov=w1I1+w2I2+⋯+wCICw1+w2+⋯+wC\displaystyle \text{DataCov} = \frac{w_1 I_1 + w_2 I_2 + \dots + w_C I_C}{w_1 + w_2 + \dots + w_C}

代码覆盖:每条“血管通路”都要显影

器官都查了,人还是可能突然倒下——原来是颈动脉里的血流通道狭窄了。血液系统是养分通路,模型代码也是“信息通路”。代码覆盖就像血管造影,看每一段通路有没有被真正走过。

代码覆盖关注的不是输入数据,而是模型代码的执行轨迹。它分四个层次:语句覆盖,每条可执行语句是否至少执行一次;分支覆盖,每个 if 条件是否真假两侧都执行过;路径覆盖,从函数入口到出口的多个分支组合路径是否都出现;调用链覆盖,从特征预处理、模型推理到后处理的整条链路上每个环节是否都被真实跑通。

在四个层次中,最基础的语句覆盖可以用这个公式表达:

如果模型代码里有一段逻辑从来没有被执行,那不是“很安全”,而是“不知道危不危险”——就像血管造影时发现一段血管完全没有显影,医生绝不会说它安全,只会怀疑那里有问题。

LineCov=LexecutedLtotal\displaystyle \text{LineCov} = \frac{L_{\text{executed}}}{L_{\text{total}}}
语句覆盖率 = 测试时实际执行到的语句行数 ÷ 全部可执行语句行数。数值越接近 1,说明逻辑通路被走得越多。
  1. 全量语句数模型代码中所有可执行的语句总数,不含注释和空行。
    Ltotal=可执行语句总行数\displaystyle L_{\text{total}} = \text{可执行语句总行数}
  2. 执行语句数测试运行过程中被插桩记录到的已经执行语句数。
    Lexecuted=实际执行语句行数\displaystyle L_{\text{executed}} = \text{实际执行语句行数}
  3. 语句覆盖率的比值执行语句数除以全量语句数,数值越接近 1 说明逻辑通路被走得越多。
    LineCov=LexecutedLtotal\displaystyle \text{LineCov} = \frac{L_{\text{executed}}}{L_{\text{total}}}

边界覆盖:别只在安静时量血压

体检医生不会只让你静坐量血压,还会让你在跑步机上跑起来、憋住呼吸做肺功能测试,目的就是看身体在极限状态下还扛不扛得住。边界覆盖就是这种“极限体检”。平时输入正常,模型没事;一旦数据卡在临界点上,隐藏问题往往一下就爆出来。

边界覆盖包含四类工作:边界值分析,在最小值、最大值以及它们前后各一个点(如 min-1、max+1)设计用例;等价类划分,把输入空间划分为若干个行为相似的区间,每个区间取代表值测试;异常输入测试,传 null、空字符串、类型异常、格式错误的数据;极值压力测试,超长文本、超大 batch、极端像素等资源与数据极限场景。

边界覆盖率的计算也是“已通过的边界点 ÷ 边界点总数”:

平时走路平稳的人不一定心脏健康,只有爬坡、快跑时才暴露问题。覆盖边界、异常和压力,就是让模型在最吃力的“爬坡路段”也经过检验,避免上线后被长尾峰值打垮。

BoundCov=npassNboundary\displaystyle \text{BoundCov} = \frac{n_{\text{pass}}}{N_{\text{boundary}}}
边界覆盖率衡量的是临界点上的行为是否被验证充分。业务线上的宕机、错乱输出,往往发生在边界,而不是中间地带。
  1. 边界清单数量将系统的每个边界点(如年龄上限、文本长度上限、batch 上限)清点出来作为分母。
    Nboundary=边界点总数\displaystyle N_{\text{boundary}} = \text{边界点总数}
  2. 通过边界数在这些边界测试点中得到预期结果的用例数量作为分子。
    npass=边界测试通过数\displaystyle n_{\text{pass}} = \text{边界测试通过数}
  3. 边界覆盖率两者相除,越高说明在临界点上的行为越被验证充分。
    BoundCov=npassNboundary\displaystyle \text{BoundCov} = \frac{n_{\text{pass}}}{N_{\text{boundary}}}

覆盖度模型与统计:给体检报告算一个总分

体检报告不会只列一堆数据就结束,它会给出一个“综合健康评估”,把心血管、代谢、呼吸等系统按风险等级加权汇总。覆盖度模型要做的事正是类似:把数据、代码、边界三类覆盖率融合成一个可度量的总分,而不是让三个数字各说各话。

一个可落地的覆盖度模型需要四步:设计指标体系,先从业务出发确定做什么指标,比如类别覆盖率、语句覆盖率、边界用例通过率;分配权重,结合风险确定权重,例如风控模型更看重边界覆盖,内容推荐更看重数据覆盖;自动统计,用样本元数据映射、代码插桩、测试结果解析等手段免去人工估算;生成报告,输出覆盖度总评分和各项明细,便于追踪趋势和发现缺口。

将三项子覆盖率按权重线性加权,就是综合覆盖度模型:

就像体检总评分揭示整体健康走势,覆盖度总分和分项报告能让每个季度甚至每次发版,都量化看到“测试全面性”是在进步还是在退化,而不是凭感觉拍脑袋。

TotalCov=wD⋅DataCov+wC⋅CodeCov+wB⋅BoundCov\displaystyle \text{TotalCov} = w_D \cdot \text{DataCov} + w_C \cdot \text{CodeCov} + w_B \cdot \text{BoundCov}
综合覆盖度 = 数据覆盖 × 数据权重 + 代码覆盖 × 代码权重 + 边界覆盖 × 边界权重。权重按业务风险确定。
  1. 三类标准化的子覆盖率数据、代码、边界覆盖率都已归一化,范围均为 0 到 1。
    DataCov,CodeCov,BoundCov∈[0,1]\displaystyle \text{DataCov}, \text{CodeCov}, \text{BoundCov} \in [0, 1]
  2. 权重关系权重之和为 1,权重越高代表该项对总分的决策影响越大。
    wD+wC+wB=1\displaystyle w_D + w_C + w_B = 1
  3. 综合加权计算将三项覆盖率分别乘以其权重再相加,得到覆盖度总分。
    TotalCov=wDDataCov+wCCodeCov+wBBoundCov\displaystyle \text{TotalCov} = w_D \text{DataCov} + w_C \text{CodeCov} + w_B \text{BoundCov}

盲区补充与落地:开加急单并固化进流程

医生看完体检报告,发现“颈动脉超声”从没做过,于是马上开加急检查单,同时把它列入明年标准套餐。这就是覆盖度盲区处理的完整姿势:识别遗漏、立即补测、固化到流程。

工程化落地包含四个环节:盲区识别,用热度图、特征相似度聚类和未覆盖清单反向定位从来没测到的数据区间、代码分支和边界点;测试补充策略,针对盲区构造新样本、新用例,例如补少数类数据、增加分支触发的条件组合;持续迭代机制,将补充用例并入回归集,每次发版都重新计算覆盖率,防止覆盖率回退;工程落地协作,把覆盖率统计接入 CI/CD 流水线,质量看板实时展示,让测试团队和算法工程师共用同一份“体检报告”。

每次补测带来的覆盖率提升,可以用增量公式表达:

一次体检不是终点,逐年修订检查套餐才是长期健康保证。覆盖度也一样:上线不是终点,而是持续补充盲区、防止覆盖率回退的循环开始。

ΔCov=NnewNtotal\displaystyle \Delta\text{Cov} = \frac{N_{\text{new}}}{N_{\text{total}}}
覆盖率增量 = 本轮新增覆盖的项目数 ÷ 全部待覆盖项目数。持续迭代累计增量,让覆盖率逐步逼近目标值。
  1. 本轮新增覆盖数本次补充测试后新覆盖到的项目数量,例如新增了少数类样本覆盖。
    Nnew=新增覆盖项目数\displaystyle N_{\text{new}} = \text{新增覆盖项目数}
  2. 总数不变总分母仍是全量应覆盖项目数,因此每补充一个项目都会让覆盖率上升。
    Ntotal=待覆盖项目总数\displaystyle N_{\text{total}} = \text{待覆盖项目总数}
  3. 覆盖率增量增量等于新增覆盖项目除以总数,迭代累计的增量让覆盖率逐步逼近并守住目标值。
    ΔCov=NnewNtotal\displaystyle \Delta\text{Cov} = \frac{N_{\text{new}}}{N_{\text{total}}}

AI 应用场景

智能客服上线前覆盖度评估

阶段:模型测试与质量保障

解决的问题:传统测试只给训练集上的准确率,无法暴露“客服样本只覆盖了问价格场景、却没覆盖退换货场景”的问题。通过数据覆盖率统计,测试团队先把业务场景清单和样本类别对应起来,自动算出覆盖缺口,再针对缺口补充场景样本。

具体案例:某电商智能客服准备上线。质量团队将对话按“售前咨询、售后退款、物流查询、投诉纠纷、优惠活动”等 30 类场景建清单,从真实日志中抽取样本,用覆盖率工具统计后发现“投诉纠纷”覆盖仅 40%,随即补充 3000 条该类样本并重新跑回归,使场景覆盖率提升到 90% 以上。

信贷风控模型边界覆盖专项审计

阶段:模型验收与合规审计

解决的问题:风控模型最怕“额度临界点”踩线错判。边界覆盖审计把“信用额度 min/max、年龄上下限、收入为零、空值字段”等边界点逐一列出,用自动化脚本逐个测试,及时发现模型在 max+1 处输出跳变异常。

具体案例:某银行风控模型上线前,测试团队列出 20 个边界点,发现“收入字段为 0”时模型直接拒绝,但“收入字段为负数”时模型却给出高额授信,明显是特征工程没做边界清洗。修复后补充边界用例并纳入回归集,防止回归。

Python 演示

python57 行
class CoverageGuard:    def __init__(self):        self.data_items = []        self.code_items = []        self.boundary_items = []     def add_data(self, category, covered):        self.data_items.append((category, covered))     def add_code(self, module, line_id, executed):        self.code_items.append((module, line_id, executed))     def add_boundary(self, point_name, passed):        self.boundary_items.append((point_name, passed))     def _rate(self, items, idx):        if not items:            return 0.0        passed = sum(1 for it in items if it[idx] is True)        return passed / len(items)     def data_coverage(self):        return self._rate(self.data_items, 1)     def code_coverage(self):        return self._rate(self.code_items, 2)     def boundary_coverage(self):        return self._rate(self.boundary_items, 1)     def report(self):        d = self.data_coverage()        c = self.code_coverage()        b = self.boundary_coverage()        total = 0.4 * d + 0.35 * c + 0.25 * b        return {'数据覆盖': d, '代码覆盖': c, '边界覆盖': b, '综合得分': total} if __name__ == '__main__':    guard = CoverageGuard()    for cat in ['中年人', '年轻人', '老年人', '自雇人士', '大学生', '偏远地区用户']:        guard.add_data(cat, True)    guard.add_data('低收入极少数', False)     for i in range(10):        guard.add_code('preprocess', i, i % 3 != 0)    for i in range(6):        guard.add_code('predict', i, i % 2 == 0)     guard.add_boundary('最小龄-1', True)    guard.add_boundary('最大龄+1', True)    guard.add_boundary('空输入', True)    guard.add_boundary('超长文本', True)    guard.add_boundary('超大batch', False)     rep = guard.report()    for key, value in rep.items():        print('{}: {:.2f}'.format(key, value))
目的:用一个轻量的 CoverageGuard 类,演示从数据、代码、边界三个维度自动统计覆盖率并加权汇总为综合覆盖度。
  1. self.data_items.append((category, covered))把已测试的数据类别登记进覆盖清单。
  2. def _rate(self, items, idx):通用统计逻辑:取元组中指定位置的状态位,计算 True 数量占总数的比例。
  3. d = self.data_coverage()数据覆盖:查看类别清单中已覆盖多少类。
  4. c = self.code_coverage()代码覆盖:查看每条代码行有没有执行到。
  5. b = self.boundary_coverage()边界覆盖:查看边界用例通过的比例。
  6. total = 0.4 * d + 0.35 * c + 0.25 * b按业务风险把三类覆盖率加权平均成总分。
  7. for key, value in rep.items():把覆盖度结果像体检报告一样逐项打印出来。

常见误区

误区我只要把测试集从 1 万条扩到 10 万条,数据覆盖率肯定就高了。反正样本多,总比少强。

正解覆盖度关心的是“该测的项目清单上有没有代表”,而不是样本数量。如果 10 万条样本全部来自同一类用户、同一个地区,覆盖度可能依然是几十分之一。就像体检增加十次血常规,也替代不了没做过的颈动脉超声。正确做法是先列类别清单,再看每个类别是否有样本覆盖,缺哪类补哪类。

为何常见:直觉上“多 = 全”,所以大家误以为扩样本量就能提升覆盖度。实际上重复覆盖同一区域,对别的区域毫无助益。

误区语句覆盖率跑到 100%,模型代码里的每一行都执行过了,输出肯定没问题,可以放心上线。

正解代码覆盖只证明语句被“跑过”,不证明它被“测对”。语句覆盖 100% 也可能漏掉分支真假的某一侧,更可能漏掉没有出现在代码里的数据分布和边界场景。覆盖率是必要条件,不是充分条件。就像血管全部显影了,也不能保证没有功能性病变,还要看血流速度等维度。

为何常见:覆盖率从 0% 涨到 100% 有很直观的成就感,让人产生“达标即安全”的错觉,忽略了断言是否严格、数据是否真实、边界是否覆盖。

误区我在每个等价类里都取了代表值测过,比如额度区间 1000-5000 测了 3000,都通过了,那这个区间肯定安全。

正解等价类代表的是“中间地带”,而 bug 往往藏在边界。比如信用额度 4999 和 5000 可能落在不同分支,5000 和 5001 也可能触发不同逻辑。只测中间值,无法预判边界附近代码分支是否切换正确。边界值分析要求单独测试 min、max、min-1、max+1,而不是用中间值代替。

为何常见:人的直觉关注“典型情况”,但程序的分支切换通常发生在临界点上,这种“差一点也不行”的微妙之处反直觉。

误区我们团队一直靠手工把测试用例分类,然后自己数覆盖率。虽然累,但至少心里有数。

正解手工估计既慢又容易错。数据覆盖可以用样本元数据映射到全类别清单自动统计;代码覆盖可以用插桩工具自动采集;边界覆盖可以按边界清单自动比对。只要组织好“应覆盖清单 → 测试结果”之间的映射,覆盖率统计完全可以自动化,并输出标准化报告。

为何常见:教材里通常只讲“覆盖率 = 已覆盖 / 总量”这个公式,没讲清楚数字从哪来,导致很多人以为只能手工换算。

面试题

Q1. 要衡量“测试样本是否覆盖了全部用户类型”,应该看哪个指标?

单选题 · easy

  • A.语句覆盖率
  • B.数据覆盖率← 正确答案
  • C.路径覆盖率
  • D.边界覆盖率

答案:B。用户类型属于输入数据的类别属性,数据覆盖率衡量的是测试样本对类别维度的覆盖情况。语句覆盖、路径覆盖关注代码执行轨迹,边界覆盖关注极值输入,都无法回答“样本类别全不全”的问题。就像判断“肝查没查”,只能看体检清单里有没有肝功能项目,而不是看心电图做得有多细。

Q2. 代码语句覆盖率的计算公式是?

单选题 · easy

  • A.已执行语句数 / 总语句数← 正确答案
  • B.出错语句数 / 错误总数
  • C.已执行用例数 / 全部用例数
  • D.已覆盖行数 / 已执行行数

答案:A。语句覆盖率是测试期间实际执行到的语句行数除以全部可执行语句行数。B 描述的是错误率,C 描述的是用例执行比例,D 的分母本身是已执行行数,结果必然接近 1,没有区分度。代码覆盖度量的是“代码通路被跑了多少”,而不是“错了多少”。

Q3. 边界值分析的核心思路是?

单选题 · mid

  • A.在每类随机取一个代表样本
  • B.在最小最大值及附近取值测试← 正确答案
  • C.把测试数据集中在中间范围
  • D.用大量边界数据做模型训练

答案:B。边界值分析专门针对临界区取值:最小值、最大值,以及 min-1、max+1 这类紧邻边界的点。随机取代表样本是等价类划分的做法,集中在中间范围反而会漏掉最容易出错的边界,用边界数据训练模型属于数据增强,不是测试方法。

Q4. 以下哪些属于数据覆盖的检查内容?

多选题 · mid

  • A.样本是否覆盖全部类别← 正确答案
  • B.数据分布是否对齐线上← 正确答案
  • C.每条语句是否被执行
  • D.场景是否覆盖核心流程← 正确答案

答案:ABD。数据覆盖检查测试样本是否遍布所有类别、分布是否和生产环境一致、关键业务场景是否齐全。语句执行情况属于代码覆盖的范畴,数据覆盖回答的是“输入空间够不够多样”,而不是“代码跑没跑”。

Q5. 分支覆盖与语句覆盖的区别是?

单选题 · mid

  • A.检查每个条件表达式的真假
  • B.同时覆盖分支真假两个路径← 正确答案
  • C.语句覆盖只追踪未执行的语句
  • D.代码覆盖只看异常处理分支

答案:B。分支覆盖要求 if 条件的真假两个方向都至少执行一次,语句覆盖只要求每条语句被执行过,不关心条件的两侧是否都出现过。A 描述的是更强的条件覆盖概念,C 说法不成立,D 只是分支覆盖里的一个子集,无法概括二者区别。

Q6. 在覆盖度模型中,下列哪项最能防止“少数类盲区”?

单选题 · mid

  • A.提高样本总量使数据集足够大
  • B.为每类分配权重并计入覆盖度← 正确答案
  • C.让模型更复杂以拟合少数类样本
  • D.用全部样本做交叉验证来避免偏差

答案:B。少数类盲区靠“类别权重 + 覆盖指示变量”在覆盖度计算中强制拉高关注度。单纯增加样本总量不一定能增加少数类的代表,加深模型只影响拟合能力,交叉验证评估的是稳定性。权重机制像体检时给高风险系统更高优先级,保证它们必须被覆盖。

Q7. 覆盖率自动统计通常需要哪些基础?

多选题 · hard

  • A.全量应覆盖项目的清单已知← 正确答案
  • B.测试结果能映射到清单项目← 正确答案
  • C.每轮测试后人工手写报告
  • D.插桩或数据采集记录机制← 正确答案

答案:ABD。自动统计要求三件事:完整清单、结果映射、采集通道。人工手写报告是自动化的反面。就像体检要自动算出肝功能覆盖率,必须先有“应检项清单”、每项检查的结果,以及结果采集系统,三者齐备才能自动出报告。

Q8. 覆盖度公式“已覆盖项目 / 应覆盖项目”体现的核心思想是?

单选题 · easy

  • A.测试用例数量越多就越全面
  • B.检查项目清单决定测试完整度← 正确答案
  • C.模型参数量决定测试效果
  • D.测试只要跑通过一次就算有效

答案:B。公式的本质是“以清单为准绳”。清单上漏项,测试再多也只覆盖了已列项目,永远发现不了清单之外的问题。模型参数量、测试次数都不是覆盖度的决定因素,跑过一次只代表执行过,不说明清单完整性。

Q9. 以下关于边界覆盖的说法正确的是?

多选题 · hard

  • A.边界值包含最小值附近的临界点← 正确答案
  • B.空值和超长文本属于异常输入测试← 正确答案
  • C.边界覆盖完成代表代码覆盖完成
  • D.极值压力测试能发现资源耗尽问题← 正确答案

答案:ABD。边界覆盖包括临界点取值、异常输入和压力测试。但边界覆盖完成不等于代码覆盖完成,因为边界用例通常走的是少数几条主干路径,无法覆盖代码里全部分支组合。二者是正交的质量维度,就像做了极限运动测试也不代表做过完整血管造影。

Q10. 盲区识别最直接的做法是?

单选题 · mid

  • A.反向查找未被覆盖的项目清单← 正确答案
  • B.把测试集扩大一倍再说
  • C.用更高精度的模型替代当前模型
  • D.让测试团队超时加班补用例

答案:A。盲区识别最直接的办法,是拿着“应覆盖项目清单”反查哪些项目没有对应的测试结果,再按风险排序补齐。盲目扩大测试集、换更强的模型、无方向地加班补用例,都缺乏针对性。就像体检后反查“哪些项目没做”,比大量重复做已有项目更有价值。