Hotdry.
ai-systems

用行为模型实现《超级马里奥》自主测试:探索游戏 QA 的进化计算方法

基于遗传算法的状态空间探索与行为模型验证相结合,详解 AI 驱动的游戏自主测试工程化参数与监控要点。

当我们谈论软件测试时,通常会想到手工编写的测试用例、边界条件检查、以及回归测试套件。然而,在面对《超级马里奥》这样拥有海量状态空间的复杂游戏时,传统测试方法显得力不从心。想象一下:每一帧可能有数十种输入组合,而游戏时长可能包含数万帧 —— 这意味着状态空间达到了天文数字级别。TestFlows 博客近期发表的一系列文章,展示了如何利用行为模型(Behavior Model)实现《超级马里奥》的自主测试,为游戏质量保障开辟了一条全新路径。

从手工测试到自主探索的范式转移

传统游戏测试依赖测试工程师逐个设计测试场景:进入某个房间、跳过某个坑洞、击败某个敌人。这种方法有几个根本性局限。首先,人工设计测试用例的速度远远赶不上状态空间的增长速度 —— 即便对于单个关卡,可能的输入序列组合也远超人类能穷举的数量。其次,某些边缘状态只有在特定条件下才会触发,比如连续吃掉多个蘑菇后的碰撞检测,这类情况很容易被人工测试遗漏。最后,游戏逻辑的复杂性使得测试覆盖率的衡量变得极为困难。

自主测试的核心思想是让测试系统自己探索游戏的状态空间,而非由人工预先定义测试路径。这种方法借鉴了进化计算的思想:将每一次游戏运行视为一个 “个体”,其 “基因” 是输入序列(按键组合),而 “适应度” 则是游戏推进的距离。通过持续的选择、变异和淘汰,系统能够自动发现高效的通关路径,同时在这个过程中验证游戏行为的正确性。

遗传算法框架下的状态空间探索

整个自主测试系统的核心是一个遗传算法(Genetic Algorithm)框架。这个框架包含几个关键组件:输入生成器、路径管理、适应度评估、以及选择与变异机制。

输入生成采用位翻转(bit-flip)变异策略。游戏手柄的八个按键状态被编码为一个字节,每一帧随机以约百分之十的概率翻转某个按键位。这种设计有其物理合理性:玩家通常会按住某个键一段时间,然后逐渐添加或切换其他按键,而非每一帧都完全随机。实践中发现,混合使用模糊变异(百分之五位翻转概率)与预定义动作模式效果更佳 —— 预定义模式如「向右长距离行走」「高位跳跃加动作」能够模拟人类玩家的自然操作风格,而模糊变异则能发现意想不到的解法。

路径管理维护一个种群集合,其中每条路径记录了输入序列以及对应的游戏状态。由于《超级马里奥》是确定性游戏,相同的输入序列必然产生相同的结果,这使得路径回放成为可能。系统不必每次都从零开始,而是可以从任意中间状态继续探索,大幅提升了效率。

适应度函数采用层级评分机制:level_num × 10^9 + x_pos × 10^3 + (999 - time)。这种设计的精妙之处在于:完成第一关的分数必然大于第一关内任何位置的分数,同理,第一关的分数必然大于第二关之前所有关卡的分数。清晰的优先级避免了不同目标之间的冲突。

选择机制使用指数加权概率分布:最优路径拥有百分之五十的基础概率,其余概率按指数衰减分配给其他路径。这种设计在 “利用”(exploitation)与 “探索”(exploration)之间取得平衡 —— 我们优先使用已发现的优质路径,但仍然给次优路径一定的机会,以防后者在某些分支点上表现出乎意料。

行为模型:正确性的形式化验证

仅有适应度函数是不够的。适应度只能告诉我们 “走得多远”,却无法验证 “走得是否正确”。一个通过了自主探索的路径,可能隐藏着物理异常、碰撞漏洞或其他未被察觉的缺陷。这正是行为模型发挥作用的地方。

行为模型将游戏正确性形式化为三类属性。因果性属性(Causal)规定马里奥只有在输入驱动或引擎推动时才会移动 —— 不可能凭空瞬移。安全性属性(Safety)确保不会出现非法位置、重叠瓦片、越界或破碎的碰撞检测。活性属性(Liveness)则要求当输入施加后,马里奥最终必然产生响应,且保持在可视范围内。

在自主探索的每一帧,系统都会将当前游戏状态与行为模型进行比对。任何违背模型的行为都会被记录为潜在缺陷。这种密集验证(每帧检查)使得测试覆盖度远超传统测试方法 —— 传统测试往往只在关键节点验证,而自主探索在数万帧的每一次都进行正确性检查。

工程化参数与监控要点

将这套方法投入实际使用需要关注若干工程化参数,以下是经过验证的关键阈值与监控建议。

输入生成层面,位翻转概率建议控制在百分之五至百分之十之间。过高会导致输入过于随机、难以形成连贯动作;过低则会使探索陷入局部最优。建议开启预定义动作库与模糊变异的混合模式,预定义动作权重设为十倍,确保既有结构化探索又有突变可能。

路径选择层面,指数衰减因子建议设为二至三。最优路径的基础概率不应低于百分之四十,以保证足够的利用强度;同时保留至少二十个候选路径构成种群,防止早熟收敛。路径清理操作建议每五个周期执行一次,将位置相近的路径压缩为保留最优者。

时间控制层面,默认探索周期为二十秒(对应游戏时间),每周期尝试三次。由于需要从起点回放路径,实际运行时间约为周期数的十五至三十分钟。对于完整关卡探索,建议总时长不低于三十分钟,以保证找到可行路径的概率。

加速参数层面,游戏帧率可提升至三百帧(默认六十帧的五倍),以显著缩短运行时间。配合层级选择参数(--start-level)可以直接从指定关卡开始,避免重复探索前置内容。这些都是测试工程中的标准实践 —— 加速时间、控制初始状态、注入故障 —— 在自主测试中同样适用。

实践效果与局限

在 TestFlows 的参考实现中,这套系统成功完成了《超级马里奥》全部四个关卡的自主探索。系统发现了隐藏的地下管道捷径、掌握了复杂的平台跳跃节奏、并且在第四关发现了一个有趣的碰撞漏洞 —— 马里奥在与火焰棒碰撞后变为隐形状态,从而穿过了所有剩余障碍。这些发现表明,自主探索不仅能找到正确答案,还能揭示意想不到的边界行为。

然而,当前方法仍有局限。首先,适应度函数仅衡量进度,不直接衡量正确性 —— 虽然行为模型可以补充这一缺陷,但两者的结合尚需进一步优化。其次,系统依赖游戏的确定性假设,如果加入随机元素(如敌人移动的随机性),路径回放将不再可靠。最后,探索耗时仍然可观,即便使用三百帧加速,完整四关的探索也需要数小时。

展望

行为模型与自主探索的结合代表了游戏 QA 的一个新方向:不再是被动地编写测试用例等待缺陷出现,而是主动地、大规模地探索状态空间并实时验证正确性。这种思路同样适用于其他具有大量状态空间的软件系统 —— 数据库引擎、操作系统、网络协议栈等。或许在不久的将来,行为模型驱动的自主测试将成为复杂系统质量保障的标准实践。


参考资料

  • TestFlows 博客:《Testing Super Mario Using a Behavior Model Autonomously (Part 1)》
  • TestFlows 博客:《Testing Super Mario Using a Behavior Model (Part 1) & (Part 2)》
  • Antithesis 博客:相关 autonomous testing 方法论
查看归档