先看一个穿墙案例

假设测试Agent在“灰烬回廊”里巡逻,某一帧,角色坐标从东侧走廊跳到了西侧房间,中间隔着一堵实心墙。按最直观的规则,这是穿墙BUG。但如果规则库里有一条“玩家技能‘影步’可在冷却完毕后向前瞬移最多八米,不检测阻挡”,这就是正常行为。判断一个结果是否为BUG,依赖的不是画面,而是“预期是什么”。这个用来回答“预期是什么”的依据,就是测试Oracle(测试判定依据)。

这正是爱游戏测试AI需要单独设计Oracle的原因。没有Oracle的测试Agent只能发现一类问题,就是崩溃和卡死这些不需要解释的问题。测试Agent能主动制造大量奇怪状态,但如果不知道哪些状态不对,探索得越多,噪声越多。

Oracle的分层:越靠上越确定

层级 判定依据 典型例子 误报风险 需要的输入
通用信号程序本身出错崩溃、无响应、断言失败、日志出现错误级别 很低 进程与日志监控
代码断言 开发写在代码里的检查耐久不得为负、数组下标不越界 开发提前埋点
不变量 任何时刻都应成立的关系背包总重不超过上限、同一任务不能同时“已完成”和“进行中” 低到中 与设计一起提炼
规则库 设计文档与配置表 “影步”最大距离、掉落表、任务前置条件 结构化的规则数据
差分 与旧版本或参考实现对比 同一存档同一操作,上一版本结果是A,这一版是B中,改动本身也会造成差异 基线版本与对比工具
LLM判定 模型读规则与证据后给出判断 “对话文本说任务已完成,但任务面板显示未完成” 较高 规则、状态摘要、截图

这张表的关键是把“确定程度”与“覆盖范围”摆在一起看:上面几层几乎不会出错,但只能发现有限的一类问题;下面几层能覆盖“逻辑上不对”的广阔区域,代价是需要更多验证。一个稳妥的测试体系,会让上层给出高置信度的确认,让下层提供线索,并把线索交给人。

规则从哪里来

Oracle再聪明,也只能基于规则。规则的来源大致有三类。

  • 设计文档:最全面,但通常是自然语言,含糊、过时,需要整理成结构化条目。
  • 配置表:技能参数、物品属性、掉落表、任务前置,它们是游戏真正在使用的数据,也最适合直接转成可执行的检查。
  • 代码断言和已知缺陷:开发在代码里埋下的检查,以及历史BUG沉淀出的回归条目。

规则库要带版本。上个补丁里“影步”的距离是八米,这个补丁改成六米,Oracle用错了版本,就会把正常行为报成BUG,或者把真正的BUG当成正常。这一点和我们在长程测试里强调的“记录构建号与环境”是同一个道理,可以参考长时间运行后才暴露的BUG中对轨迹字段的讨论。

用穿墙案例走一遍判定流程

  1. 通用信号:进程正常,没有崩溃,无日志错误。此层无结论。
  2. 不变量:“角色坐标每帧位移不得超过最大速度乘以帧间隔,除非本帧有位移类技能事件。”本帧位移远超限制,而事件日志里存在“影步”释放记录,这条不变量被技能事件豁免,通过。
  3. 规则库:影步最大距离八米,实际位移约七米,在范围内;冷却时间已满足,通过。
  4. 再查一个细节:规则库里写明“影步不能穿越标记为‘不可穿越’的墙”,而这堵墙恰好带此标记。此时判定为疑似BUG,附上坐标、事件日志和墙体属性。
  5. 人工复核:开发查看后确认,是这堵墙的标记漏配,而非技能逻辑错误。修复的是数据,不是代码。

这个流程里,没有哪一步靠“看起来不对劲”,每一步都基于一条可以被指出来的规则。最后一步也说明,Oracle给出的结论只能是“疑似”,根因判断仍在人。

LLM Oracle:能帮什么,风险在哪

有些不一致很难写成规则,比如NPC的对话文本与任务面板不一致、道具描述与实际效果不一致。这时可以让大语言模型读取规则条目、状态摘要和相关文本,给出“是否矛盾”的判断。爱游戏对这个层级的态度是:可以用,但只做线索,不做终审。

  • 误报:模型可能把设计意图当成BUG,例如把“NPC故意撒谎”当成文本错误。
  • 漏报:模型可能忽略微小的数值偏差,也可能因为上下文太长而漏读关键规则。
  • 需要证据:每条判断都应附带具体的规则条目、状态字段和文本片段,让人能快速核对,不能只给一句“这里有问题”。
  • 需要可复现:同样的输入多次判断,结果不应经常摇摆。

差分Oracle的一个常见误区

与旧版本对比听上去很省事:同一个存档、同一串操作,旧版本结果是A,新版本变成了B,就报警。但补丁本来就是要改东西的。把“有差异”直接当成“有BUG”,会在每次平衡调整之后产生大量误报。更合理的做法,是让差分结果先与本次补丁的变更清单核对:清单里写明改动了影步距离,那么距离相关的差异被视为预期;清单里没有提到的差异才值得重点看。爱游戏AI在设计差分层时,倾向于把变更清单也当成一种规则输入。

人工复核流程

比较合适的流程是:Oracle把疑似问题分成“高确定”和“待确认”两档,高确定的直接进入缺陷列表,待确认的按影响程度排序交给人。人的判断再回流成规则:如果复核后发现是设计如此,就把这个例外写进规则库,避免下一次再报;如果确认是BUG,则把它写成新的不变量,让以后的版本自动检查。这样,Oracle会随着项目积累而变准,而不是一次性配置完事。爱游戏的测试思路里,机器负责大范围地提出“哪里可能不对”,规则负责回答“凭什么说不对”,人负责最后一句“到底改不改”,三者缺一不可。对于手感、节奏、乐趣这类没有规则可依的问题,Oracle无能为力,仍然要交给真人试玩来判断。