美食评论家阿尝接到一个神秘任务:暗访一家名为“云顶融合菜”的新餐厅,评估它的真实功力。阿尝深知,一家餐厅的真正水平不在招牌菜里,而在那些“几乎没人会点”的奇怪组合上。于是他故意点出“冰淇淋配辣椒油”“奶茶加热后再加冰”“甜品要求做成咸的”——后厨手忙脚乱的样子,才是这家餐厅最真实的面孔。这就像 AI 测试中的罕见输入组合测试:不测高频正常输入,而是主动构造小概率出现的输入组合,去暴露模型在长尾场景下的缺陷。真实系统里,用户行为千奇百怪,两个“正常”的参数拼在一起,可能就变成灾难现场。罕见组合测试要解决三件事:哪些组合罕见且危险?如何高效生成这些组合?如何衡量测试覆盖是否充分?掌握了这套方法,你就能像阿尝一样,用最少的“刁钻点菜”,摸清一个 AI 模型的安全底线。

岗位关联

对 AI 从业者而言,掌握罕见组合测试意味着能发现别人测不出的缺陷,把模型在长尾输入下的崩溃风险扼杀在上线之前——这是评测工程师的核心竞争力,也是技术管理者建立质量防线的必修课。

目录
  1. 可视化演示
  2. 组合测试基础
  3. 罕见组合识别
  4. 生成策略方法
  5. 覆盖评估度量
  6. 评测实施流程
  7. 鲁棒性提升
  8. 工具与工程
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示AI模型罕见组合测试的完整流程:长尾分布识别、联合概率分析、组合生成策略与覆盖评估,揭示低频输入组合的缺陷发现能力。

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

长尾分布与罕见组合 常见组合集中于分布头部高频区域 罕见组合位于长尾低频区域易暴露缺陷 P(x) < θ → Rare Combination 罕见组合属于联合分布尾部低概率事件

组合测试基础

阿尝翻开“云顶融合菜”的菜单,发现点餐规则是:前菜三选一、主菜三选一、酱汁三选一、甜品三选一。若把四类各点一种,理论上能配出 81 套完整套餐。要是把上百道菜品、十几种做法全因素组合,那数量足以让任何后厨崩溃。这正是测试领域常说的组合爆炸:输入维度一多,全组合数呈指数级膨胀,根本测不完。

在 AI 测试里,这个“菜单”就是输入空间——模型所有可能接收的合法输入组成的集合。每一类选项就是一个组合维度(参数),每个选项叫一个取值(value)。一条测试用例就是给每个维度选一个值组合起来。全组合测试虽然最彻底,但成本爆炸;而软件工程数十年的经验表明,绝大多数缺陷其实由两个参数交互触发。于是诞生了全对组合(pairwise)策略:只需保证任意两个维度的取值组合都被覆盖到,就能用很少的用例抓住大部分问题。

(nk)=n!k! (n−k)!\displaystyle \binom{n}{k} = \frac{n!}{k!\,(n-k)!}

1. 组合数符号:$\binom{n}{k}$ 表示从 $n$ 个元素中取 $k$ 个为一组的所有组合的总数。

(nk)\displaystyle \binom{n}{k}

2. 分子阶乘:$n!$ 是 $n$ 的阶乘,等于 $n \times (n-1) \times \cdots \times 1$,代表全部排列方式的数目。

n!=n×(n−1)×⋯×1n! = n \times (n-1) \times \cdots \times 1

3. 分母校正:$k!\,(n-k)!$ 用来消掉组内排序和组外剩余元素的排序,从而只保留“组合”而非“排列”。

k! (n−k)!k!\,(n-k)!

阿尝的策略很聪明:他不会把 81 套全点一遍,而是挑出十几道“有代表性的搭配”摸清后厨底细。组合测试基础的核心同样是取舍——用结构化的少量用例,换取对整个输入空间的高可信覆盖。

罕见组合识别

阿尝翻看餐厅三个月的点单记录,发现点“烟熏三文鱼+慢烤牛排+黑椒汁+熔岩蛋糕”这类招牌组合的客人占了八成,而“冰淇淋+辣椒油”这样的搭配几乎从没出现过,静静躺在点单分布的长长尾巴里。长尾分布就是这么回事:高频场景集中在头部,海量低概率组合都挤在尾部。某个组合单独出现的概率可能只有百万分之一,但把百万用户放一起,它就一定会发生。

识别罕见组合,不能只盯着“概率低”,还要看“风险大”。一个没人组合可能恰恰是安全边界上的定时炸弹。于是测试工程师引入罕见度评分:先统计各组合在历史数据中的出现频率并归一化,再用业务风险(安全、资损、体验)给组合加权重,最后按综合评分排序,把 Top-K 个组合列为重点测试对象。专家筛选则用于修正数据偏差——历史数据稀疏时,靠领域经验补充那些统计看不见的盲区。

Ri=(1−p^i)×wi\displaystyle R_i = (1 - \hat{p}_i) \times w_i

1. 归一化频率:$\hat{p}_i$ 表示组合 $i$ 在历史输入中的出现频率被压缩到 0 到 1 之间,越接近 1 说明越常见。

p^i∈[0,1]\hat{p}_i \in [0, 1]

2. 罕见度分量:$1 - \hat{p}_i$ 把频率翻转成“罕见程度”,出现频率越低,此项得分越接近 1。

1−p^i1 - \hat{p}_i

3. 风险权重:$w_i$ 是根据安全、资损、体验等维度为组合 $i$ 赋予的风险系数。

wi≥0w_i \geq 0

4. 综合评分:$R_i$ 越高,说明该组合“又罕见又危险”,越应该排进测试序列的前列。

Ri=(1−p^i)×wiR_i = (1 - \hat{p}_i) \times w_i

阿尝有个小本子,专门记录“客人从没点过、但一旦点错就会出大事”的组合。AI 评测同样需要这样一份“刁钻清单”——把所有长尾组合按风险排好队,再逐个攻破。

生成策略方法

光有“刁钻清单”还不够,阿尝得系统地设计点菜序列:先点哪些组合才能最快摸清后厨?最经典的是成对生成(AllPairs):每次挑选一个测试用例,让它覆盖尽可能多的“还没被覆盖的二维组合”,贪心地用最少用例铺满最大覆盖面。这种方法在维度多、取值多的场景下特别高效。

空间特别大时,随机采样能提供廉价的探索——就像阿尝偶尔闭着眼睛在菜单上戳几下,说不定撞上惊喜。进化算法则更进一步:把一组合适的测试用例当作“个体”,以覆盖率为适应度,通过交叉、变异不断迭代,在超大组合空间中自动搜寻能触发缺陷的“深水区”。别忘了约束处理:有些组合在业务上根本不合法(比如“离线状态下要求实时流媒体”),生成时必须过滤掉,否则会把测试资源浪费在无效用例上。

CA(N; t, k, v)\displaystyle \mathrm{CA}(N;\,t,\,k,\,v)

1. 记号含义:$\mathrm{CA}$ 表示覆盖阵列,是组合测试的标准数学模型。

CA\mathrm{CA}

2. 测试用例数:$N$ 代表生成的测试用例总数,是覆盖阵列的“行数”。

N=∣S∣N = |S|

3. 组合强度:$t$ 表示要求任意 $t$ 个维度的取值组合至少出现一次,$t=2$ 就是成对组合。

t=2⇒pairwiset = 2 \Rightarrow \text{pairwise}

4. 维度与取值:$k$ 是输入参数的维度数,$v$ 表示每个维度取值的个数。

k, v∈Z+k,\ v \in \mathbb{Z}^+

这套“点菜兵法”的关键在于:不靠蛮力点满全菜单,而是用成对覆盖打底、随机探索补漏、进化算法攻坚、约束条件护航,最终用一桌不算豪华的菜,把后厨的深浅探个明明白白。

覆盖评估度量

阿尝每品一道菜,就在品鉴台账上画一个勾,慢慢形成一张覆盖图:哪些搭配尝过、哪些还是空白。AI 测试里的覆盖矩阵也是这样一张台账——行是测试用例,列是各个维度组合,单元格标记该组合是否被执行过。有了矩阵,就能算出覆盖率:已覆盖的组合数除以总组合数。

覆盖率不是终点,而是导航仪。矩阵中的空白处往往暗藏玄机:缺口分析专门盯住这些未覆盖区域,判断它们是因为风险太低不值得测、还是因为生成策略漏掉了重要地带。覆盖准则则定义了“覆盖到什么程度算合格”——对安全攸关系统,准则可能是“必须覆盖全部三维组合”;对一般业务,成对覆盖往往就够。准则的选择直接决定测试成本与风险之间的平衡点。

covt=∣Ccovered∣∣Ctotal∣\displaystyle \mathrm{cov}_t = \frac{\left|C_{\text{covered}}\right|}{\left|C_{\text{total}}\right|}

1. 已覆盖集合:$C_{\text{covered}}$ 是当前测试用例真正执行到的 t 元组合的集合。

Ccovered={(v1,…,vt)∣已被覆盖}C_{\text{covered}} = \{(v_1, \dots, v_t) \mid \text{已被覆盖}\}

2. 总量集合:$C_{\text{total}}$ 是所有满足约束条件的 t 元组合的总数。

Ctotal={(v1,…,vt)∣合法组合}C_{\text{total}} = \{(v_1, \dots, v_t) \mid \text{合法组合}\}

3. 集合大小:$\left| \cdot \right|$ 表示集合中元素的个数,也就是“有多少种组合”。

∣C∣=组合数量\left|C\right| = \text{组合数量}

4. 覆盖率:$\mathrm{cov}_t$ 取值在 0 到 1 之间,越接近 1 代表组合覆盖越充分,是评测报告中的核心指标。

阿尝盯着台账上的空白格,心里清楚:这些空白正是下一轮“找茬”的目标。覆盖率图表上的缺口,就是测试团队下一阶段的主攻方向——覆盖评估永远不会结束,直到风险被逐个清空。

评测实施流程

阿尝每周五固定“发榜”:拿出品鉴台账,对照评分标准给每道菜评级,最后写出一份让主厨心服口服的评测报告。一次完整的测试流程通常分五步:定义输入空间与约束、生成组合用例、执行评测、汇总缺陷清单、复盘改进。每一步都有明确的输入与产出,环环相扣。

流程中最容易忽视的是基线设置:同一套组合用例,必须先在一版已知模型上跑一遍,得到基准分数,再在待测模型上跑,两者对比才能判断是“变好”还是“倒退”。缺陷分析则按严重程度给问题分级——致命的崩溃、错误的输出、轻微的体验降级,分别对应不同的修复优先级。最后,一份报告规范要把组合空间、覆盖率、缺陷清单、修复建议全部结构化呈现,让工程师和管理者都能快速抓住重点。

D=NdefectsNtests×1000\displaystyle D = \frac{N_{\text{defects}}}{N_{\text{tests}}} \times 1000

1. 缺陷数量:$N_{\text{defects}}$ 是在本轮组合测试中触发并确认的缺陷总数。

Ndefects=有效缺陷数N_{\text{defects}} = \text{有效缺陷数}

2. 用例数量:$N_{\text{tests}}$ 是执行的组合测试用例总数。

Ntests=用例总数N_{\text{tests}} = \text{用例总数}

3. 标准化放大:$\times 1000$ 把比值放大到“千用例缺陷数”,便于在不同规模的测试间横向比较。

D∝1000D \propto 1000

发榜不是为了“批斗”,而是为了让后厨有方向地改进。评测实施流程的意义正在于此:把一次性的“找茬”变成可重复、可对比、可追溯的质量管理闭环。

鲁棒性提升

主厨看完阿尝的评测报告,没有把“冰淇淋+辣椒油”从菜单上划掉,反而闭关研发了一道限量隐藏甜品——把踩雷组合变成可驾驭的输出。这样应对缺陷的思路,在 AI 测试里叫缺陷修复:把触发缺陷的组合用例直接加入训练集或回归集,让模型亲眼见过“这道怪菜”。数据增强在组合周围做微小的扰动,生成一批相似样本投入训练,相当于把一道怪菜蒸炸煮烤做出多个变体,让模型全面适应。

更进一步,边界加固针对高频出问题的区域增加防护策略——输入校验、兜底输出、拒绝服务——就算模型没学好,也不会把用户带进沟里。修复之后必须做回归验证:重新跑同一张覆盖矩阵,确认旧缺陷消失、新缺陷没冒出来。阿尝的“刁钻清单”在这里变成最宝贵的资产,每一次发榜都在悄悄抬高后厨的水平线。

ΔR=Rafter−RbeforeRbefore×100%\displaystyle \Delta R = \frac{R_{\text{after}} - R_{\text{before}}}{R_{\text{before}}} \times 100\%

1. 修复前鲁棒性:$R_{\text{before}}$ 是在缺陷修复前,模型通过同一套组合测试得到的鲁棒性指标,作为基线。

Rbefore=基线得分R_{\text{before}} = \text{基线得分}

2. 修复后鲁棒性:$R_{\text{after}}$ 是修复后重新评测得到的分数。

Rafter=修复后得分R_{\text{after}} = \text{修复后得分}

3. 相对变化率:$R_{\text{after}} - R_{\text{before}}$ 的差值除以基线 $R_{\text{before}}$,得到相对于基线的提升比例。

Rafter−RbeforeRbefore\frac{R_{\text{after}} - R_{\text{before}}}{R_{\text{before}}}

4. 百分比展示:$\times 100\%$ 把结果转换为更直观的百分数。

菜单越训越厚,后厨的底气也就越来越足。鲁棒性提升的本质,就是把每次“刁钻点菜”暴露出的问题,转化成模型成长的真实养料。

工具与工程

阿尝后来不再单打独斗,他的工作室开发了一套“品鉴流水线”:菜单组合自动生成、暗访自动执行、报告自动输出——老饕的经验被沉淀成可复用的工具。AI 测试领域最著名的工具之一就是 PICT,微软开源的成对组合生成器,输入参数的维度和取值,几秒就能输出一组覆盖全部二维组合的测试用例。

工具要真正发挥作用,必须嵌入工程体系。CI集成把组合测试挂进发布流水线:每次代码提交或模型更新,自动跑一遍罕见组合回归,让缺陷在合入前就暴露。数据管理负责维护历史组合库、缺陷库和覆盖记录,避免重复劳动,把长尾资产越积越厚。效率优化则通过分布式执行、缓存命中、并行采样,把动辄数小时的组合测试压缩到分钟级——毕竟,只有跑得够快,评测才能真正成为日常习惯。

E=cov2Ntests\displaystyle E = \frac{\mathrm{cov}_2}{N_{\text{tests}}}

1. 成对覆盖率:$\mathrm{cov}_2$ 表示成对组合覆盖率,是组合测试最常用的覆盖维度。

cov2∈[0,1]\mathrm{cov}_2 \in [0, 1]

2. 用例数量:$N_{\text{tests}}$ 为实际执行的测试用例总数,是成本侧的核心指标。

Ntests>0N_{\text{tests}} > 0

3. 效率指标:$E$ 代表单位用例换来的覆盖率,$E$ 越高说明测试设计越精炼、工具调度越高效。

E=cov2NtestsE = \frac{\mathrm{cov}_2}{N_{\text{tests}}}

工具化的真正意义,是把“阿尝式找茬”这种个人绝活,变成组织级的常规能力。当组合测试的齿轮嵌进 CI 流水线,每个版本迭代都自动接受罕见组合的考验,“罕见”便再也不是安全漏洞的庇护所。

AI 应用场景

大模型客服的罕见指令组合评测

阶段:评测与安全验证

解决的问题:传统客服模型评测只覆盖高频指令(“查余额”“改地址”),而真实用户常组合出罕见指令(“用文言文把这段话翻译成日语”)。手工构造用例效率低,覆盖面完全靠运气,漏测的罕见组合一旦上线就是舆情事故。

具体案例:某金融公司对客服大模型做上线前评测,用成对组合生成“渠道 × 方言 × 情绪 × 业务类型”测试矩阵,发现“粤语 + 愤怒情绪 + 退费诉求”的组合下,模型会违规承诺“无条件全额退款”。评测团队把该组合加入回归集,推动安全策略修复后才放行上线。

自动驾驶感知模型的长尾场景组合

阶段:模型鲁棒性测试

解决的问题:常规路测覆盖的几乎都是“晴天 + 白天 + 主干道”的高频场景,但自动驾驶真正的事故高发区恰恰在长尾组合——“雨天 + 夜间 + 逆光 + 施工占道”同时出现时,感知系统很容易误判。

具体案例:测试团队用组合生成器构造天气、光照、路况、交通参与者四个维度的覆盖矩阵,在仿真环境中批量跑测,发现“雨夜逆光 + 锥桶”组合下的目标召回率仅 62%。团队随即补充合成数据训练,并将该组合加入 CI 回归集,每次模型更新都自动验证。

推荐系统罕见属性组合的线上监控

阶段:线上安全监控

解决的问题:推荐系统在不同用户属性组合下行为差异巨大,“新用户 + 高活跃 + 冷门类目偏好”这类罕见组合容易触发内容泥石流或信息茧房。传统监控只看整体指标,发现不了维度交叉处的局部失控。

具体案例:某内容平台的算法团队维护了一张覆盖矩阵,定期对“用户活跃度 × 内容类目 × 设备类型 × 时段”组合做回归测试,监控曝光多样性指标。一次回归中发现“深夜 + 平板 + 财经冷门类目”组合下曝光集中在单一作者,触发干预机制后恢复正常,避免了一次潜在的生态恶化。

Python 演示

python59 行
"""rare_combination_test.py - 罕见输入组合测试的成对生成与覆盖评估 用贪心策略从全组合中挑选最少用例覆盖所有成对组合,并输出与全组合的规模对比以及成对覆盖率。"""from itertools import product  def build_pairwise(domains):    """贪心生成成对组合覆盖的测试用例列表"""    keys = list(domains.keys())    all_combos = list(product(*[domains[k] for k in keys]))    selected = []    covered = set()     for combo in all_combos:        pairs = set()        for i in range(len(keys)):            for j in range(i + 1, len(keys)):                pairs.add((i, combo[i], j, combo[j]))        fresh = pairs - covered        if fresh:            selected.append(combo)            covered.update(pairs)    return selected  def pair_coverage(combos, domains):    """计算成对组合覆盖率"""    keys = list(domains.keys())    total = 0    covered = set()    for i in range(len(keys)):        for j in range(i + 1, len(keys)):            total += len(domains[keys[i]]) * len(domains[keys[j]]    for combo in combos:        for i in range(len(keys)):            for j in range(i + 1, len(keys)):                covered.add((i, combo[i], j, combo[j]))    return len(covered) / total  def main():    domains = {        "角色": ["游客", "会员", "管理员"],        "设备": ["手机", "平板", "电脑"],        "网络": ["弱网", "正常", "离线"],        "输入": ["短文本", "长文本", "特殊字符"],    }    combos = build_pairwise(domains)    full = 3 * 3 * 3 * 3    rate = pair_coverage(combos, domains)    print(f"全组合需要: {full} 个用例")    print(f"成对组合生成: {len(combos)} 个用例")    print(f"成对覆盖率: {rate:.2%}")  if __name__ == "__main__":    main()
目的:演示成对组合生成的核心思想——用最少用例覆盖最多二维组合,并量化对比全组合与成对组合的规模差距。
  1. all_combos = list(product(*[domains[k] for k in keys]))用笛卡尔积生成全组合,这是组合爆炸的“完整敌情”。
  2. pairs = set()把一条用例拆解成若干二维子组合,成对覆盖的基本单元。
  3. fresh = pairs - covered计算这条用例能带来多少“新覆盖”,完全重复的用例在这里被淘汰。
  4. selected.append(combo)贪心策略的核心:只有贡献新覆盖的组合才被选入测试集。
  5. covered.update(pairs)选中后立即更新全局已覆盖集合,确保下一步决策基于最新状态。
  6. total += len(domains[keys[i]]) * len(domains[keys[j]])累加所有维度对的取值组合数,得到覆盖率公式的分母。
  7. rate = pair_coverage(combos, domains)用已覆盖组合数除以总组合数,量化本次测试的覆盖面。

常见误区

误区只有穷举所有输入组合,覆盖率达到 100%,才能放心上线。既然要测就测个彻底,少一种组合都算失职。

正解组合爆炸下,全组合测试在维度稍多时就不具备可行性。成对组合等 t-way 策略基于“缺陷主要由少数参数交互触发”的经验规律,用极小成本的用例覆盖绝大多数风险。测试的目标不是穷尽所有输入,而是用可接受的成本把风险压到可控范围。

为何常见:“全部测过”在直觉上等价于“绝对安全”,人们容易忽略测试成本与风险之间的经济学权衡。

误区一个组合出现的概率才百万分之一,投入人力去测它纯属浪费,不如把时间花在高频主流程上。

正解单用户概率低,不代表总体风险低。百万用户规模下,百万分之一概率的事件几乎每天都会发生。更要命的是,罕见组合往往恰好落在模型训练数据的稀疏区,一旦出错可能引发安全、资损等严重事故。

为何常见:人的直觉擅长处理平均值,不擅长处理极端长尾——这正是黑天鹅事件频发的心理根源。

误区随机生成大量输入组合,跑得足够多,自然就能覆盖到长尾区域,没必要搞复杂的组合设计。

正解高维输入空间极为稀疏,均匀随机采样很容易扎堆在高概率区域,罕见组合的命中率极低。成对组合用结构化贪心保证“任意二维组合至少出现一次”,进化算法主动往未覆盖区域搜索,这些都比随机采样高效得多。

为何常见:人们直觉上认为“随机”等同于“均匀”,忽略了高维空间的维度灾难。

误区覆盖矩阵全绿,成对覆盖率到了 100%,模型就没有缺陷了,可以放心大胆上线。

正解成对覆盖只保证二维交互被覆盖,三因素、四因素交互引发的缺陷依然可能藏在矩阵之外。覆盖率是必要非充分条件,它回答的是“我们测了什么”,而不是“模型有没有问题”。真正可靠的做法是:覆盖率达标 + 缺陷清零 + 回归通过三者同时确认。

为何常见:可视化的绿色矩阵给人强烈的“完成感”,容易把过程指标误当成安全结果。

面试题

Q1. 成对组合测试的主要目的是什么?

单选题 · easy

  • A.穷举所有输入组合
  • B.覆盖全部参数对← 正确答案
  • C.只测高频场景
  • D.随机抽样测试

答案:B。成对组合测试的核心思想是保证“任意两个维度的取值组合”至少被覆盖一次,用少量用例抓住绝大多数由参数交互触发的缺陷。穷举是它的反面,只测高频和随机抽样都违背了结构化覆盖的原则。

Q2. 长尾分布的特征是什么?

单选题 · easy

  • A.少数高频主导大多数场景← 正确答案
  • B.所有场景概率完全相同
  • C.低概率事件完全不存在
  • D.概率分布总是均匀形态

答案:A。长尾分布指少数头部场景占据绝大部分概率,大量低概率场景拖在长长的尾部。罕见组合测试恰恰要主动寻找这些尾部组合。其余选项描述的均匀分布与长尾分布正好相反。

Q3. 输入空间在测试中指的是什么?

单选题 · easy

  • A.全部合法输入组合的集合← 正确答案
  • B.模型输出结果的集合
  • C.参数名称组成的列表
  • D.训练数据的总规模大小

答案:A。输入空间是所有合法输入组合构成的全集,组合测试是在这个空间里选取有代表性的用例。输出集合、参数名称列表和训练规模都不是“输入组合”的概念。

Q4. 某模型有 4 个输入维度,每个维度有 3 个取值,则二维组合总数为多少?

单选题 · mid

  • A.54 种组合← 正确答案
  • B.36 种组合
  • C.81 种组合
  • D.16 种组合

答案:A。从 4 个维度中选 2 个维度有 C(4,2)=6 种选法,每对维度的取值组合数为 3×3=9,所以总数为 6×9=54。81 是全组合数 3⁴,36 是每个维度的取值两两相乘之和的误算。

Q5. 下列哪些方法可用于识别罕见输入组合?

多选题 · mid

  • A.长尾分布统计分析← 正确答案
  • B.风险加权综合评分← 正确答案
  • C.全组合穷举无差别
  • D.专家经验人工筛选← 正确答案

答案:ABD。罕见组合识别依赖频率统计(长尾分析)、风险加权排序和专家经验修正数据偏差。全组合穷举不分轻重,把所有组合一视同仁,它只是测试策略而非识别罕见组合的手段。

Q6. 计算组合覆盖率时,分母通常指的是什么?

单选题 · mid

  • A.全部可能的合法组合数← 正确答案
  • B.已执行用例的数量
  • C.本次发现的缺陷总数
  • D.输入参数的维度数量

答案:A。覆盖率 = 已覆盖组合数 / 总合法组合数,分母是全部可能的合法组合。已执行用例数、缺陷数和维度数都不是覆盖率公式中的分母项。

Q7. 以下哪些手段能提升模型的鲁棒性?

多选题 · mid

  • A.缺陷用例加入训练集← 正确答案
  • B.数据增强模拟边界← 正确答案
  • C.保持模型完全不变
  • D.回归验证确认修复← 正确答案

答案:ABD。把触发缺陷的组合加入训练集、用数据增强生成更多边界样本、通过回归验证确认不倒退,都是鲁棒性提升的闭环环节。保持模型不变则无法修复任何已发现的问题。

Q8. 覆盖率 100% 是否代表模型缺陷为零?

单选题 · hard

  • A.覆盖即代表完全安全
  • B.还需层级组合验证← 正确答案
  • C.总保证模型零缺陷
  • D.覆盖率根本无关紧要

答案:B。二级覆盖率只保证二维交互被覆盖,三维及以上的交互缺陷仍然可能藏匿。覆盖率 100% 只能说明测试范围达标,必须结合缺陷清零、回归通过等多重证据才能评估安全性。认为覆盖即安全或覆盖无关紧要都是极端错误。

Q9. 下列哪些策略可以缓解组合爆炸问题?

多选题 · hard

  • A.成对组合贪心生成← 正确答案
  • B.全因子穷举所有组合
  • C.进化算法启发式搜索← 正确答案
  • D.约束条件过滤剪枝← 正确答案

答案:ACD。成对组合用少量用例覆盖二维交互,进化算法主动探索未覆盖区域,约束剪枝剔除非法组合,三者都能大幅压缩测试规模。全因子穷举正是组合爆炸的根源,无法缓解问题。

Q10. 缺陷密度指标的计算公式是什么?

单选题 · extreme

  • A.缺陷数除用例数乘千← 正确答案
  • B.用例数除缺陷数乘千
  • C.缺陷数与用例数相乘
  • D.参数数除以缺陷数量

答案:A。缺陷密度 D = (缺陷数 / 用例数) × 1000,即每千个测试用例中发现的缺陷数,用于跨规模比较测试质量。分子分母颠倒、相乘或换成参数数都会让指标失去“单位用例缺陷率”的含义。