想象你是一名足球守门员教练。你手下的守门员在常规射门训练中表现出色,但一到正式比赛就频频丢球——因为对手不会总踢“正常球”,他们会踢出各种刁钻角度、诡异弧线、意外反弹的球。你该怎么办?答案是:搞一台射门训练机,让它不知疲倦地射出各种极端球,直到守门员的弱点暴露无遗。 AI模型模糊测试(Fuzzing)干的就是这件事。它像一台智能“射门训练机”,自动生成大量随机或半随机的输入数据——可能是极端文本、畸形图像、超长序列——一股脑地“射向”AI模型,观察它在这些边界输入下是否崩溃、出错或给出荒谬预测。这不是为了折磨模型,而是为了在模型上线前,提前把它的“防守死角”找出来。 这篇指南会用“守门员训练”这个比喻贯穿始终,带你完整走一遍模糊测试:从变异策略(如何制造刁钻球)、覆盖引导(如何瞄准薄弱区域)、异常检测(如何判定丢球),到评测指标与实施流程。学完你就能理解,如何用这套方法系统地检验AI模型的边界能力。

岗位关联

掌握AI模糊测试技能,是晋升模型质量保障专家的关键一步。它让你从“模型能不能用”升级为“模型在哪些极端情况下会失效”,为AI系统的可靠性保驾护航。

目录
  1. 可视化演示
  2. 基本认知
  3. 变异策略
  4. 覆盖引导
  5. 异常检测
  6. 评测指标
  7. 实施流程
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

模糊测试通过自动生成大量随机或半随机输入来发现AI模型的边界缺陷。本文介绍AI Fuzzing的变异策略、覆盖... 切换模式查看不同维度。

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

AI模糊测试:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

基本认知

回到守门员训练的起点。如果一个教练只让守门员反复接正前方的普通射门,训练再久,比赛时遇到刁钻角球照样丢球。聪明的教练不会这么做——他们会用射门训练机,把各种角度、力量、旋转的球轮流踢过来,观察守门员在哪些情况下失手。模糊测试Fuzzing在AI世界里,就是这台不知疲倦的“射门训练机”。

在AI评测领域,模糊测试是一种自动化的测试方法。它不依赖人工精心设计测试用例,而是通过程序自动生成大量随机或半随机的输入数据,把这些输入喂给目标模型,观察模型行为。这些输入往往位于正常数据的“边缘地带”——超长文本、极端像素值的图像、乱序的序列——正是模型最容易被“攻破”的地方。

模糊测试的工作流程通常包含三个环节:一是准备一批种子输入,就像训练用的第一批普通练习球;二是设计变异策略,对种子进行随机改动,生成海量新输入;三是执行模型并监控行为,记录是否出现崩溃、错误或性能异常。与传统测试相比,Fuzzing的自动化程度高、覆盖面广,能发现人工设计用例时容易忽略的边界缺陷。

就像教练记录“球门九个区域中已练过几个”来评估训练是否全面,覆盖率让我们量化评估对模型输入空间的探索程度。覆盖率低,意味着还有大片“防守盲区”没被触及,模型的边界缺陷可能就藏在那里。

C=NcoveredNtotal\displaystyle C = \frac{N_{\text{covered}}}{N_{\text{total}}}
这个公式定义了我们刚才说的“训练到位程度”——已覆盖的输入空间区域数量占目标总区域数量的比例,用来评估测试到底探索了多少模型“防守区域”。
  1. 分子 \(N_{\text{covered}}\)代表目前已被至少一个测试输入命中的区域数量。就像射门训练中,已被练习球覆盖到的球门网格数量。
    Ncovered\displaystyle N_{\text{covered}}
  2. 分母 \(N_{\text{total}}\)代表目标输入空间被划分出的区域总数。就像球门被网格划分出的总格数。
    Ntotal\displaystyle N_{\text{total}}
  3. 覆盖率 \(C\)两数相除得到0到1之间的数值,表示测试对输入空间的探索完整度,数值越高说明训练覆盖的“防守区域”越全面。
    NcoveredNtotal\displaystyle \frac{N_{\text{covered}}}{N_{\text{total}}}

变异策略

一台射门训练机不能只会踢一种球。它必须能变换球速、旋转和落点——有些球贴地飞行,有些球高速下坠,有些球带着诡异弧线。这些变化,就是模糊测试中的“变异策略”。

变异策略是Fuzzing的核心引擎,它决定如何从种子输入生成新的测试数据。最基础的策略是随机变异(random mutation):随机地在种子数据中插入、删除、翻转或替换若干字节。这种方式不需要任何先验知识,实现简单,适合快速铺设基础覆盖。但纯随机的变异像盲打乱踢,效率有限。

更高级的策略让“射门”变得有章可循。结构感知变异(structure-aware mutation)会先解析输入的结构(比如JSON的语法树),在语法树级别修改节点,生成的新输入天然合法;字典注入(dictionary injection)从预置字典中选取关键词、边界值(如0、-1、"NaN")插入输入,专门瞄准那些容易引发异常的数值边界;组合变异(combinational mutation)则同时应用多种变异操作,生成更复杂的边界输入,模拟真实世界中多种异常因素的叠加效果。

变异策略的多样性,决定了射门训练机“能踢出多少种不同风格的球”。策略越丰富,越容易覆盖模型的不同“防守薄弱区”。

x′=x+ε⋅δ,δ∼U(−1,1)\displaystyle x' = x + \varepsilon \cdot \delta, \quad \delta \sim \mathcal{U}(-1, 1)
这是“随机变异”的数学表示:在原始输入 \(x\) 上叠加一个随机扰动 \(\varepsilon \cdot \delta\),得到新的测试输入 \(x'\)。就像在球的基础上施加一个随机的力度和方向偏移。
  1. 原始输入 \(x\)当前被选中的种子数据。就像射门训练中一个基础球的初始位置和状态。
    x\displaystyle x
  2. 扰动幅度 \(\varepsilon\)控制变异强度的系数,决定了改动是细微调整还是大幅改动。
    ε\displaystyle \varepsilon
  3. 随机方向 \(\delta\)从 \([-1, 1]\) 均匀分布中抽取的随机向量,为变异提供不可预测的方向。
    δ∼U(−1,1)\displaystyle \delta \sim \mathcal{U}(-1, 1)
  4. 变异结果 \(x'\)原始输入叠加扰动后得到的新测试输入,将被送入模型执行。
    x+ε⋅δ\displaystyle x + \varepsilon \cdot \delta

覆盖引导

练了一段时间后,教练发现守门员对左侧射门扑救很好,但右侧总是慢半拍。聪明的教练会把训练资源重点投向右侧。覆盖引导(coverage-guided)正是这个思想在Fuzzing中的应用——用覆盖率反馈来指导后续变异方向。

每一轮测试后,系统都会计算当前覆盖率的最新状态,并筛选出那些“带来新增覆盖率”的输入。它们的价值在于探索了模型之前从未到达过的“防御区域”。这些输入会被加入种子池,并在后续迭代中获得更多变异机会,从而把测试资源持续引向“盲区”。

种子调度(seed scheduling)是覆盖引导的关键环节。系统给每个种子分配一个优先级权重,权重高的种子更有可能被选中进行变异。权重计算通常综合考虑种子的新鲜度、长度和发现新路径的速度。这种动态取舍,避免精力浪费在已经探索充分的旧区域上。

就像教练会根据每个训练动作的“性价比”,优先安排那些能快速暴露薄弱环节的练习,覆盖引导让Fuzzing的每一发“子弹”都打得更有方向感。

wi=ΔCiti\displaystyle w_i = \frac{\Delta C_i}{t_i}
这是“种子调度权重”的计算式:种子的优先级等于它在前一轮测试中带来的覆盖率增量除以执行耗时。单位时间内带来越多新覆盖的种子,就像“越能高效暴露防守弱点”的射门,越应该优先反复使用。
  1. 覆盖率增量 \(\Delta C_i\)第 \(i\) 个种子在一次变异执行后,让覆盖率提升的数值。
    ΔCi\displaystyle \Delta C_i
  2. 执行耗时 \(t_i\)该种子被变异、执行、评估所花费的时间开销。
    ti\displaystyle t_i
  3. 权重 \(w_i\)两者相除,衡量“单位时间内发现新路径的效率”,效率越高的种子调度权重越大。
    ΔCiti\displaystyle \frac{\Delta C_i}{t_i}

异常检测

球进门了,教练得判断:是这球实在太刁钻、换个顶级守门员也扑不到,还是自家守门员基本功不过关、明显失误?模糊测试也一样——产生大量输入后,系统需要判断哪些输入真正触发了模型缺陷。

异常检测的方法多种多样。崩溃检测(crash detection)是最直接的手段:监控模型是否抛出异常、陷入死循环或内存溢出——就像守门员直接摔倒在地。行为差异检测(behavioral difference)对比输入前后模型输出的跳变程度,捕捉不稳定的预测行为。边界误分类(boundary misclassification)关注模型在决策边界附近的错误分类——球恰好擦过门线,判罚就在毫厘之间。

在复杂模型中,置信度分析(confidence analysis)尤为重要。模型对某些噪声输入给出非常高的置信度,但这些输入对人类来说毫无意义——这种“过度自信”往往是模型泛化能力不足的危险信号。可信的模型应该对“看不懂的球”表现出犹豫,而不是自信满满地瞎扑。

通过组合多种异常检测手段,Fuzzing不仅能判“丢了球”,还能分析“这球为什么丢”——为后续修复提供线索。

S(x)=∣f(x)−f^(x)∣\displaystyle S(x) = \left| f(x) - \hat{f}(x) \right|
这是“异常分数”的定义:模型对输入 \(x\) 的预测输出 \(f(x)\) 与参考输出 \(\hat{f}(x)\) 之间的绝对差。差值越大,说明该输入越可能让模型行为失常。
  1. 模型输出 \(f(x)\)模型对输入 \(x\) 给出的原始预测结果,例如分类的概率向量。
    f(x)\displaystyle f(x)
  2. 参考输出 \(\hat{f}(x)\)可选的对照基准,如对输入做轻微扰动后的预测,或集成模型的平均输出。
    f^(x)\displaystyle \hat{f}(x)
  3. 绝对差 \(S(x)\)两者之差的绝对值,作为该输入下的“异常分数”。数值越大,行为越不稳定,越值得人工检查。
    ∣f(x)−f^(x)∣\displaystyle \left| f(x) - \hat{f}(x) \right|

评测指标

训练了一周,教练需要向俱乐部汇报:守门员进步了多少?哪些方面还不行?AI模糊测试同样需要一套量化指标,向团队证明测试的有效性和投入产出比。

常用评测指标包括:覆盖率指标(coverage metric),衡量输入空间的探索率,说明测试做得够不够全面;缺陷发现数(bug count),统计触发模型异常或崩溃的输入数量,直观反映测试“收获”;单位时间效率(throughput),计算每分钟执行的测试用例数,反映测试夹具本身跑得多快;误报率控制(false positive rate),确保不把正常输入误判为缺陷,保证测试结果的公信力。

值得注意的是,缺陷发现数与覆盖率并不总成正比。有时新增的覆盖区域根本不存在缺陷,而某些密集区域会反复触发同一类问题。因此,评测要结合多项指标综合判断——就像教练既看总训练量,也看关键场景的失球数,绝不能单看一项数据下结论。

评测指标就像教练手中的记分牌,把“模糊测试到底做得好不好”变成清晰可读的数据,指导后续的资源投放决策。

E=NbugsTexec\displaystyle E = \frac{N_{\text{bugs}}}{T_{\text{exec}}}
这是“测试效率”的定义:单位时间内发现的缺陷数。它反映了Fuzzing测试的性价比,帮助团队评估是否值得继续投入测试资源。
  1. 缺陷总数 \(N_{\text{bugs}}\)整个测试过程中确认的模型异常输入数量。
    Nbugs\displaystyle N_{\text{bugs}}
  2. 总执行时间 \(T_{\text{exec}}\)从测试开始到结束所花费的总时间。
    Texec\displaystyle T_{\text{exec}}
  3. 测试效率 \(E\)两者相除,得出单位时间缺陷发现率,用于横向比较不同测试方案的效果。
    NbugsTexec\displaystyle \frac{N_{\text{bugs}}}{T_{\text{exec}}}

实施流程

教练的训练计划从不是即兴发挥:先了解守门员的特点与弱项,再准备训练器材,执行训练并记录数据,最后总结复盘。模糊测试的实施同样遵循一套标准流程,环环相扣。

第一步:目标定义——明确模型的关键输入空间和关心的缺陷类型。是关注崩溃率、误分类率还是性能瓶颈?目标不同,测试的设计就完全不同。第二步:种子准备——收集一批覆盖正常分布的种子输入,它们是变异的起点,直接决定了测试空间的初始范围。第三步:迭代执行——运行Fuzzing主循环,持续变异、执行、监控覆盖率,直到达到预设的终止条件。第四步:结果分析——对触发的异常输入进行人工研判,过滤误报,沉淀为测试报告。

一个成熟的Fuzzing流程还会考虑中断条件设计和回归集成。中断条件可以是覆盖率阈值、时间预算或缺陷数下限,避免无限运行浪费算力;回归集成则是把发现的缺陷输入加入回归测试集,防止模型更新后旧缺陷“换个方式”复发。

当训练计划有了清晰的目标、充分的准备、规范的执行和严谨的复盘,教练才对守门员的状态心中有数。Fuzzing的标准化流程,也让AI团队的模型质量保障从“凭感觉”走向“靠数据”。

终止条件: C≥Ctarget 或 t≥tmax\displaystyle \text{终止条件: } C \geq C_{\text{target}} \ \text{或} \ t \geq t_{\text{max}}
这是“Fuzzing循环终止条件”的表述:当覆盖率到达目标值,或累计执行时间超过上限时,测试自动结束。就像教练给训练设置“覆盖所有区域”或“练满两小时”的双重终止标准。
  1. 当前覆盖率 \(C\)测试进行到当前时刻计算出的输入空间覆盖率。
    C\displaystyle C
  2. 目标覆盖率 \(C_{\text{target}}\)团队预设的覆盖率达标线,达到即认为测试已足够充分。
    Ctarget\displaystyle C_{\text{target}}
  3. 时间上限 \(t_{\text{max}}\)允许的最大执行时间,防止测试无限运行消耗资源。
    tmax\displaystyle t_{\text{max}}

AI 应用场景

智能客服系统的边界健壮性测试

阶段:模型发布前测试阶段

解决的问题:AI客服常因用户输入中的乱码、极端符号、超长文本而崩溃或给出荒谬回复。传统人工测试只能覆盖几十条精心设计的用例,漏掉大量随机边界情况。

具体案例:某电商平台AI客服在收到包含大量随机符号的输入时会返回“服务器繁忙”的错误消息。测试团队使用文本Fuzzing自动生成1万条变异文本(插入表情符号、叠加特殊字符、截断超长输入),在上线前发现并修复了三类崩溃问题,客服系统线上错误率从2.1%降到0.3%。

自动驾驶感知模型的极端天气输入发现

阶段:模型迭代评测阶段

解决的问题:自动驾驶视觉模型对雨雾、逆光、传感器噪声等极端输入的处理能力难以用常规数据集覆盖。Fuzzing可以模拟各种天气噪声叠加效果,发现模型的感知盲区。

具体案例:自动驾驶团队使用图像Fuzzing对视觉感知模型施加光照扰动、雨滴噪声、局部遮挡的随机组合,发现模型在“低光+雨滴+逆光”叠加场景下会将静止障碍物误判为背景。该缺陷直接促使团队补充针对性训练数据,避免了一次潜在的交通事故风险。

大语言模型的安全Prompt探测

阶段:模型安全对齐评估阶段

解决的问题:大语言模型可能被精心构造的Prompt绕过安全限制。Fuzzing可以自动生成大量Prompt变体,系统性地探测模型的越狱漏洞和有害输出。

具体案例:安全研究团队以一组“无害提问”为种子,通过字典注入(加入“忽略之前的指令”“扮演角色”等越狱关键词)和结构感知变异,自动生成数千个Prompt,成功发现11种可绕过安全对齐的Prompt模式,推动模型的安全策略升级。

Python 演示

python73 行
"""简单模糊测试器:对文本情感分类器执行基础Fuzzing""" import randomimport string  class TextClassifier:    """模拟一个情感分类器,实际场景可替换为真实模型"""     def __init__(self):        self.positive_words = {"好", "棒", "爱", "喜欢", "赞"}        self.negative_words = {"差", "烂", "讨厌", "恨", "垃圾"}     def predict(self, text):        """返回情感分数:正数为正面,负数为负面,0为无法判断"""        pos = sum(1 for w in self.positive_words if w in text)        neg = sum(1 for w in self.negative_words if w in text)        return pos - neg  class TextFuzzer:    """文本模糊测试器:变异种子语料,寻找模型失效输入"""     def __init__(self, model, seed_corpus):        self.model = model        self.seed_corpus = seed_corpus        self.bugs = []        self.gc_count = 0  # 计数器,与def方法无同名冲突     def mutate(self, text):        """对文本执行一次随机变异"""        if not text:            return text        mutation = random.choice(["insert", "delete", "replace", "swap"])        chars = list(text)        if mutation == "insert":            pos = random.randint(0, len(chars))            chars.insert(pos, random.choice(string.punctuation))        elif mutation == "delete":            pos = random.randint(0, len(chars) - 1)            chars.pop(pos)        elif mutation == "replace":            pos = random.randint(0, len(chars) - 1)            chars[pos] = random.choice(string.punctuation + "测试")        else:            pos = random.randint(0, len(chars) - 2)            chars[pos], chars[pos + 1] = chars[pos + 1], chars[pos]        return "".join(chars)     def run_fuzz(self, iterations=500):        """执行多轮模糊测试,返回触发模型失效的输入列表"""        for _ in range(iterations):            text = random.choice(self.seed_corpus)            mutated = self.mutate(text)            score = self.model.predict(mutated)            if score == 0 and len(mutated) > 2:                self.bugs.append(mutated)                self.gc_count += 1        return self.bugs  def main():    model = TextClassifier()    seeds = ["这部电影真棒", "味道太差了", "服务很好", "价格很贵"]    fuzzer = TextFuzzer(model, seeds)    bugs = fuzzer.run_fuzz(iterations=500)    print(f"共发现 {fuzzer.gc_count} 个模型无法判断的边界输入")    for bug in bugs[:5]:        print(repr(bug))  if __name__ == "__main__":    main()
目的:实现了一个最小可运行的文本模糊测试器,通过随机变异种子文本,找出情感分类器无法判断的边界输入——就像用射门训练机不停变换球路,找出守门员的“反应死角”。
  1. mutation = random.choice(["insert", "delete", "replace", "swap"])每次随机选择一种变异方式,增加输入多样性。
  2. chars.insert(pos, random.choice(string.punctuation))在随机位置插入标点符号,模拟乱码输入。
  3. score == 0 and len(mutated) > 2检测模型返回“无法判断”的边界输入,视为发现潜在缺陷。
  4. self.gc_count用_count后缀命名计数器,避免与类方法同名导致int object is not callable错误。

常见误区

误区“模糊测试不就是生成一堆随机乱码扔给模型吗?模型能正常处理就行,处理不了就说明有bug。”

正解随机噪声只是Fuzzing的起点,现代AI Fuzzing的核心是“结构感知变异+覆盖引导”。不是简单灌噪声,而是根据覆盖率反馈不断调整变异方向,像教练盯着守门员的弱点精准设计射门,而不是闭着眼乱踢。

为何常见:很多入门教程用完全随机的字节翻转举例,加上“模糊”二字的字面误导,让人以为Fuzzing是纯盲目的暴力测试。

误区“覆盖率必须是100%才算测试合格,达不到就是测试没做好。”

正解对AI模型而言,输入空间往往是连续的、近乎无限的——图像像素的组合数量远超宇宙原子数,100%覆盖根本不现实。更合理的做法是设定目标覆盖率(比如80%),结合缺陷发现数和执行效率综合评判测试质量。

为何常见:软件测试人员习惯传统代码覆盖率“达标”的思维,忽略了模型输入空间是连续分布、不可穷举的本质特性。

误区“跑了1000个输入都没崩溃,模型肯定没问题,可以上线了。”

正解AI模型的缺陷更多是“静默错误”——模型给出看似正常的输出,但内容完全错误。比如分类器对纯噪声图片给出99%置信度的“狗”,这种错误比崩溃更危险。因此异常检测必须结合置信度分析、行为差异检测等方法,而不是只看崩溃。

为何常见:传统软件的“崩溃即缺陷”思维惯性,忽视了AI模型输出的概率性和不确定性本质。

误区“Fuzzing发现了50个缺陷,这模型质量太差了;另一个只发现5个,肯定更好。”

正解缺陷发现多可能只是说明测试策略够强、种子覆盖够广——就像更严苛的训练会暴露守门员更多弱点,但不代表他比赛表现差。反过来,缺陷发现少也可能因为变异策略太弱、探索不足,根本没触及薄弱区域。要结合覆盖率、误报率等指标交叉判断。

为何常见:人脑天然倾向于用“问题数量”直接推断“质量好坏”,忽略了测试强度这个关键中间变量。

面试题

Q1. 模糊测试Fuzzing的核心目标是?

单选题 · easy

  • A.提高模型训练速度
  • B.发现模型边界缺陷← 正确答案
  • C.减少模型参数数量
  • D.提升模型精度上限

答案:B。Fuzzing通过自动生成大量边界输入,系统性地暴露模型在极端情况下的缺陷,就像射门训练机找出守门员的防守死角。其他选项分别是训练优化和模型压缩领域的主题,不是Fuzzing的目标。

Q2. 覆盖率C = N_covered / N_total中的分母代表什么?

单选题 · easy

  • A.已发现的缺陷总数
  • B.目标输入空间总区域数← 正确答案
  • C.种子输入的总个数
  • D.模型参数的总数量

答案:B。分母N_total是目标输入空间划分出的区域总数,相当于球门被切分的网格总数。分子是已探索的区域数,两者相除才是覆盖率。选项A是缺陷数,C、D与覆盖率无关。

Q3. 覆盖引导模糊测试的关键机制是什么?

单选题 · mid

  • A.完全不使用种子输入
  • B.根据覆盖率反馈优先变异有效种子← 正确答案
  • C.只检测模型崩溃问题
  • D.依赖人工设计每一条用例

答案:B。覆盖引导的核心是用覆盖率增量指导种子调度,优先变异那些能带来新覆盖的输入——就像教练把训练资源投向薄弱区域。A、C、D都否定了Fuzzing的自动化和覆盖反馈机制。

Q4. 种子调度中,权重公式w_i = ΔC_i / t_i的含义是?

单选题 · mid

  • A.种子长度越大权重越高
  • B.单位时间内新增覆盖率越高的种子权重越大← 正确答案
  • C.覆盖率绝对值越高的种子权重越大
  • D.执行时间越长的种子权重越大

答案:B。权重是“覆盖率增量/执行耗时”,衡量的是“性价比”——单位时间带来的新覆盖越多,越值得优先变异。A、C、D都只考虑了单方面因素,忽略了效率维度。

Q5. 下列哪项不属于模糊测试的异常检测方法?

单选题 · mid

  • A.崩溃检测
  • B.行为差异检测
  • C.字典注入← 正确答案
  • D.置信度分析

答案:C。字典注入属于变异策略(制造射门花样),不是异常检测手段(判断是否丢球)。崩溃检测、行为差异、置信度分析都是判断模型是否异常的方法。

Q6. 模型对纯噪声输入给出99%置信度的“狗”预测,这说明什么?

单选题 · mid

  • A.模型泛化能力极强
  • B.模型存在过度自信现象← 正确答案
  • C.数据集划分很合理
  • D.变异策略完全无效

答案:B。对无意义输入给出高置信度预测,是模型“过度自信”的危险信号——它把看不懂的球也自信地扑了出去。这不是泛化能力强,恰恰是泛化能力弱的体现。

Q7. 结构感知变异与随机变异的主要区别是?

单选题 · hard

  • A.结构感知变异完全不需要种子
  • B.结构感知变异在语法树级别修改输入← 正确答案
  • C.随机变异的速度一定更快
  • D.两者没有本质区别

答案:B。结构感知变异先解析输入的语法结构,在语法树节点上做修改,生成的新输入天然合法;随机变异则在字节层面盲目改动。前者像懂球路的教练设计射门,后者像闭眼乱踢。

Q8. 模糊测试的完整实施流程包含哪些环节?

多选题 · mid

  • A.定义测试目标← 正确答案
  • B.准备种子语料← 正确答案
  • C.迭代执行测试← 正确答案
  • D.直接部署到生产环境

答案:ABC。标准流程是目标定义→种子准备→迭代执行→结果分析。D“直接部署生产”是上线动作,不是测试流程环节。四步环环相扣,缺一不可。

Q9. 评测模糊测试效果时,哪些指标值得综合参考?

多选题 · hard

  • A.覆盖率指标← 正确答案
  • B.缺陷发现数← 正确答案
  • C.单位时间效率← 正确答案
  • D.模型训练轮数

答案:ABC。覆盖率衡量充分性,缺陷数衡量收获,效率衡量性价比,三者应综合评判。D训练轮数是模型训练阶段的超参数,与测试效果无关。

Q10. 关于覆盖率与缺陷发现数的关系,下列说法正确的有?

多选题 · hard

  • A.覆盖率与缺陷数总是成正比
  • B.新增覆盖区域可能完全无缺陷← 正确答案
  • C.密集缺陷区域会反复触发同类问题← 正确答案
  • D.覆盖率是测试充分性的参考而非唯一标准← 正确答案

答案:BCD。A太绝对,覆盖率增长和缺陷发现数并非线性正相关——就像新手一上来练什么都有效果,高手练了新动作也不一定找到新问题。B、C、D都正确描述了二者的复杂关系。