☰
游戏异常测试全攻略:从五维拆解到幂等校验
2026/10/1 2:17:34 网站建设 项目流程

做游戏测试这些年,被问得最多的问题就是异常测试怎么测。面试里几乎必问,新人培训教材里也总有一章在讲它,但真正到了项目里,很多人还是只会对着正常流程走用例,一遇到“用户乱点”或者“网络波动”就不知道从哪里下手。这篇文章我想把在项目里沉淀下来的异常测试思路、常用框架和踩过的坑一次讲清楚,不堆理论名词,只说实际操作中验证过可行的做法。适合准备游戏测试面试、刚入行想系统梳理测试点、或者正在补全项目异常用例覆盖的人参考。

1. 为什么异常测试没有一份标准答案

很多人在面试游戏测试的时候,都会想去背一份“异常测试八股文”,比如弱网、断线、切后台、来电、低电量、覆盖安装这些点,觉得背下来就能应付所有项目。我自己也被问过无数次类似的问题,但说句实话,异常测试恰恰是最不可能用一张固定清单解决问题的领域。

1.1 异常测试到底在测什么

正常功能测试验证的是“系统在给定条件下能不能正确完成任务”,比如输入正确的账号密码能登录、点击购买按钮能扣除货币并发到背包。异常测试验证的则是另一件事:当系统处在不正常的状态、收到不合理的输入、或者操作顺序被打乱时,系统还能不能优雅地处理。

说得直白一点,正常用例检查的是“应该发生的事情有没有发生”,异常用例检查的是“不应该发生的事情发生了之后,系统会不会崩、会不会数据错、会不会给玩家留下利用空间”。举个例子,登录模块的正常用例是账号密码正确能进去,但异常用例会问:密码连续输错5次会不会锁定?验证码过期了再提交会不会提示错误?点完登录立刻切后台再回来,登录请求还有没有效?这些问题在正常流程里根本不存在,但它们对玩家体验的影响往往是致命的。

还有一个容易被忽视的点:异常测试不只是在找崩溃,更多是在找“错误处理逻辑缺失”。一个按钮在极端情况下点了没反应,玩家顶多骂一句;但如果重复点击导致金币翻倍、道具复制、任务进度错乱,那就是直接破坏游戏经济系统的事故级问题。

1.2 两类“不正常”:环境不给力和操作不按常理

做了这么多年,我发现异常来源其实就两类。第一类是环境异常,也就是外界条件不配合,比如网络从WiFi切到4G、弱网丢包、服务器暂不可用、系统内存不足、来电打断、低电量弹窗、设备存储空间满了、日期被用户手动调整。这类异常是“外力强加”的,玩家没有主观恶意,但系统必须扛得住。

第二类是操作异常,也就是玩家行为不按设计文档来。故意连点、快速跨界面切换、在加载动画还没结束时狂按按钮、用输入法输入特殊字符、把角色名字起成超长字符串、反复强杀进程再重启。这类异常背后不一定是恶意,很多普通玩家在没有耐心或者手滑时就会触发。

把这两类分清之后,你再去梳理测试点就有了方向。环境异常可以按外部条件去枚举,操作异常可以按交互路径去发散,两者交叉的地方往往就是问题的高发区。

2. 一套可以直接用的异常测试梳理框架

既然异常组合几乎是无穷无尽的,那就需要一个框架把思路稳定下来,否则每次测试都是想到哪儿测到哪儿。我在项目里沉淀了一套五维拆解法,按这五个维度去逐项过系统,基本上能把遗漏率压到比较低的水平。

2.1 五维拆解法:从系统视角找异常入口

五个维度分别是输入异常、环境异常、状态异常、时序异常和数据异常。

输入异常是我建议最先查的一类,因为成本最低、效果最明显。界面上所有能输入、能选择、能提交的地方,都去挑战输入内容的边界。正常来说,名称输入框限制10个字符,异常测试就要去试11个、试纯空格、试换行符、试全角半角混合、试特殊符号、试emoji、试超长粘贴内容。很多人觉得这些测试“很无聊”,但恰恰是这些无聊的输入,最容易触发服务端校验缺失或者客户端UI错位。数值输入也一样,体力、金币、道具数量这些字段,0、负数、小数点、最大值加1、非数字字符,每一个都值得跑一遍。

环境异常是游戏测试里最有特点的一块。移动端游戏尤其要注意网络切换、飞行模式、后台恢复、来电弹窗、低电量提示、充电状态变化、系统字体大小调整、屏幕方向和分辨率变化。这里面有一条经验是,不要只在测试机默认环境下跑,拿到一款新手机,先看看它的系统版本、分辨率、刘海屏适配、全面屏手势,这些都会成为异常测试的隐藏变量。

状态异常关注的是“游戏当前处于什么状态”。同一个功能,在不同的状态下表现完全不同。比如角色处于无敌状态时收到伤害、背包已满时领取奖励、任务已完成待领取时系统重新登录、副本已经通关后再次进入同一个副本进度。状态异常用例的设计核心是:把系统状态先设置成一个特殊值,再执行一个看起来正常的操作,观察系统有没有在这种状态错配面前自乱阵脚。

时序异常是游戏里最难测但价值最高的一类。涉及两个或两个以上操作同时发生,或者一个操作还没结束另一个操作就抢跑。典型场景是:点击“一键领取”后,在接口返回之前再次点击;战斗加载过程中退出到主界面;匹配成功的瞬间切换网络;动画还在播放时直接点击下一关按钮。这类问题在正常网速下很难暴露,一旦暴露基本都是线上事故。

数据异常则偏向底层。服务端下发了空列表、返回了字段缺失的数据包、数据库里出现了脏数据、存档文件被修改器篡改、客户端版本和服务器版本不匹配。这种用例可能需要造数据或者配合开发才能做,但一旦发现,往往是深水区的大雷。

2.2 怎么用XMind把“正常流程”长成“异常分支树”

很多人在面试时被问到“使用XMind怎么梳理登录模块的测试点”,其实不只是面试技巧,它本身就是一个非常高效的梳理方法。我的习惯是先画正常流程的主干,然后在每一个节点上问一句话:“如果这一步失败了呢?”

以登录模块为例,主流程是打开游戏、服务器选择、账号密码输入、点击登录、角色选择、进入主城。挂异常分支的时候,打开游戏这一节点可以挂出:首次安装启动、热更包下载中断、启动时崩溃、缓存被清理后启动、存储空间不足时启动。账号密码输入这一节点可以挂出:密码错误、密码为空、账号不存在、输入框粘贴超长内容、开启大写锁定、输入法覆盖层遮挡按钮。点击登录这一节点可以挂出:双击登录、登录请求未返回时切后台、切WiFi到4G、断网重连、Token过期、多设备同时登录。

这样画下来,一棵正常流程的主干会迅速长出一棵庞大的异常分支树。画完之后要做的是去重和优先级排序,把所有分支标记上高、中、低三个等级,而不是拿着上百个分支不分轻重地跑一遍。优先级判断依据有三个:这个异常玩家遇到的概率高不高,异常发生后对游戏经济或进度的影响大不大,异常发生后玩家能否自行恢复。三个条件满足越多,优先级越高。

用这种方式梳理,最大的好处是不会漏。因为你的出发点永远是正常流程,异常分支只是正常流程的“影子”,影子再怎么多,也不会脱离主干飞到视野之外。

3. 按游戏生命周期拆出的高价值异常测试点

框架解决的是“从哪些角度想”,具体到执行层面,还需要按游戏的生命周期把所有核心节点过一遍。我把常见的异常测试点按启动、登录、创角、核心玩法、结算、退出六个阶段拆开,下面这份清单可以直接抄到自己的用例库里。

3.1 启动和登录阶段:玩家对游戏的第一印象,也是最容易“劝退”的入口

启动阶段的异常测试重点在安装、热更和崩溃恢复三个方向。首次安装后能否正常进入;安装包损坏时系统会不会给出明确提示而不是闪退;热更过程中断网、杀进程、存储空间不足,恢复后能否从断点继续;热更包版本不匹配时会不会提示重新下载而不是卡死。还有一个被很多人忽略的点:游戏崩溃后重启,客户端能不能自动清理崩溃现场、回到崩溃前的界面,还是每次启动都会再次触发同样的崩溃。

登录阶段的异常测试点比较密集,我通常会按账号和网络两条线走。账号线包括:密码错误时的提示是否友好、连续错误是否触发锁定策略、验证码过期/错误怎么办、Token过期后请求返回什么、已登录设备被其他设备踢下线时的提示、同一个账号在iOS和Android之间切换登录。网络线包括:登录请求发出后立刻断网、弱网环境下超时重连、服务器维护通知后继续登录、切后台超5分钟再回来登录态是否还在。

这里有一个非常典型的线上问题场景:玩家在电梯或地下车库里网络很差,登录请求发出去之后卡了十几秒,玩家反复点击登录按钮,结果网络恢复时一下子发出好几个并发请求,服务端要么创建了多个会话把玩家来回踢下线,要么给同一个账号发了好几次登录奖励。要防住这类问题,测试时一定要专门设计“弱网环境下重复点击”的用例。

3.2 核心玩法和结算阶段:数据的尊严不能丢

核心玩法阶段的异常测试点,围绕一个核心原则:断线重连后的状态一致性。玩家打副本打到一半断线了,重连回来血量是不是对的?Boss血量会不会回到原始值?任务进度有没有丢?掉落的道具会不会因为断线重复给或者完全消失?这类问题排查起来往往很耗时间,因为复现需要精确的网络时机,但一旦出现就是最高优先级的致命BUG。

我这里有一个真实的教训。有一次测试版本里,玩家在关卡结算动画播放的瞬间断网,恢复网络后游戏把这一关的奖励发放了两次。原因是结算请求被客户端在超时后自动重发了,服务端又没有做去重。这个BUG在正常网速下两个多月没有被发现,直到某次玩家用了不太稳定的网络环境才爆出来,当时已经产生了一批靠这个BUG刷资源的小号。从那以后,我的核心玩法异常用例里永远会有一条“结算请求发出后断网再重连”的必测项。

结算阶段还要重点检查重复点击和背包满这两种情况。重复点击“领取”按钮,奖励会不会被发放多份;背包已满时领取奖励,奖励会不会消失,还是会自动落到邮件里补发;领取过程中切后台再回来,领奖状态显示是否与实际一致。这些点不单单是功能问题,还是经济系统安全问题的第一道防线。

3.3 退出与持久化阶段:异常测试最容易偷懒的地方

退出阶段的异常测试是很多人偷懒的地方,因为看起来“不点退出不就行了”。但恰恰是这种想法会埋雷。我常用的退出阶段用例至少包括:强杀进程后重启、后台切换超过30分钟后回前台、进程被系统回收后重进、设备重启后进游戏、清理游戏缓存后进游戏。

持久化相关的异常点更需要单独提出来。玩家在游戏里做的许多设置(比如画质、音效、语言、绑定手机号)能不能在异常退出后保存下来;本地存档损坏时有没有兜底机制;版本升级时旧存档能不能正常迁移;降级安装旧版本后读取新版本数据会不会崩。每一条都可以用一句话测试,但每一条背后都可能有复杂的兼容性问题。

阶段高价值异常测试点重点关注原因
启动热更中断、崩溃重启、安装包损坏直接影响玩家能否进入游戏
登录Token过期、多端登录、弱网重复点击最容易引发账号和奖励异常
创角重名、特殊字符名、快速连点校验逻辑不严会被刷号
核心玩法断线重连状态一致性、战斗中断数据不一致影响体验和生态
结算重复领取、背包满、断线结算经济系统安全第一道防线
退出强杀进程、后台过长、缓存清理持久化逻辑异常高发区

4. 异常用例设计的关键动作:边界、时序与前置条件

把测试点梳理出来之后,真正的技术活是设计出高质量、可执行的异常用例。同样是测异常,有的测试员写出来的用例能让开发直接复现,有的测试员写的用例描述模糊到开发看一眼就想打回。差异就藏在用例设计的细节里。

4.1 边界永远是异常的第一现场

我有个习惯,拿到任何需求先找数值边界。凡是有数值、长度、数量的功能,就一定有边界,边界内外一定会表现不一样。角色等级上限是100级,那100级之后继续获得经验会怎样?金币是整数类型,给它传一个超出上限的值会变成负数吗?每日登录奖励天数有30天,第31天登录时是循环还是终止?聊天频道输入200个字符刚好卡在限制上,提交会不会成功,提示语够不够清楚?

边界值设计有一个误区,就是只测“最外侧那一条边”而忽略“内侧第一条”。如果你的输入框最多支持10个字符,那么第10个字符是成功的边界,第11个字符是失败的边界,第9个字符往往被跳过。但实际开发中,很多BUG不是因为超出限制,而是因为刚好卡在临界点上的处理逻辑写得不严谨。所以边界用例一定要把上限值本身、上限值加1、上限值减1都覆盖到,同理还有最小值的三个相邻点。

除了这类常规边界,游戏里还有一类特有的边界,就是跨天、跨月、跨年。很多每日任务和活动只在日期切换时刷新,如果玩家在23点59分50秒进入副本,00点00分10秒打完,这个任务奖励算昨天的还是今天的?VIP到期时间是今天23点59分,玩家在到期前一刻进入的副本会不会在到期后失去资格?这类时间边界异常测试非常容易出产品级事故,值得专门写几个用例去卡时间点。

4.2 时序错乱是最难复现的异常类

时序异常用例和普通用例最大的区别在于,它不关心操作是否合法,只关心操作发生的先后顺序是否被打乱。设计这类用例的核心思路是“打断”和“抢跑”。打断就是在任意操作进行到一半时,插入一个外部事件,比如切后台、接电话、断网、锁屏。抢跑就是在一个请求还没有返回时,发起第二个、第三个请求,比如快速连点、跨界面切换、同时点击两个按钮。

在真实项目里,我经常发现两种现象。一种现象是,客户端为了保证流畅度,会在界面加载期间屏蔽按钮点击,但这种屏蔽只在主流程里有效,某些弹窗、浮动提示出现的那一瞬间,按钮反而变得可点了。另一种现象是,客户端请求层设计了超时重试机制,但重试没有做幂等处理,一个扣款请求在超时后重复执行了两次,玩家没收到道具但钱被扣了两次。

时序异常用例在落地时有一个难点,就是复现不稳定。解决方式是记录完整的复现步骤加预期结果,并且尽量用游戏自带的开发者模式或者网络模拟工具把时序固定下来,而不是靠手动碰运气。比如用弱网工具把延迟固定到2000毫秒,这样每次点击之后都有足够的时间窗去执行第二次操作,复现成功率会大幅提升。

4.3 前置条件注入法:把源头数据搞坏

还有一种异常用例设计方法是从数据源头下手,先制造一个不正常的初始状态,再执行一个看似正常的操作。这个方法在普通功能测试里很少被用到,但却是发现深水区BUG的最有效手段。

举个具体例子,玩家的背包里凭空塞入一个不存在的道具ID,打开背包会不会崩溃?“每日任务”的完成次数被修改器改成负数,去领奖励会发生什么?本地存档中的关卡进度被改成999,进入游戏时会不会因为找不到对应关卡而卡死?这些用例不需要玩家手动操作就能触发,但一旦真实环境出现类似数据异常,处理的难度会非常高。

执行前置条件注入,通常需要配合存档修改、数据库直接操作、代理工具改包、或者服务端测试环境造数据,需要和开发团队有一定的协作基础。我的建议是优先测高价值数据,比如货币数值、道具ID、任务进度、角色等级、副本剩余次数、存档文件版本号。这些字段只要有一处没做兜底校验,就很容易成为刷资源或者破坏游戏平衡的入口。

5. 一次邮件附件重复发放的完整排查链路

讲了这么多方法,回到一个完整的实战案例上,看看异常BUG从发现到定位再到回归验证的链路长什么样。这个案例发生在一个偏养成类的游戏项目里,问题一句话就能概括:弱网环境下,玩家领取邮件附件时金币被发多了。但就是这样一个简单的问题,背后牵出一整类接口安全问题。

5.1 现场重现:弱网、卡顿、两次确认

最初是运营反馈有玩家在客服工单里说“金币越领越多”,当时第一反应是邮件文案显示错误,数据本身没问题。但很快工单数量增多,这才转给测试团队排查。我拿到手上的复现描述非常笼统:“邮箱里点一键领取,网络不好的时候,金币会变多。”这个描述基本没法直接定位,所以我先用弱网工具把测试机的网络设为固定丢包加1000毫秒延迟,然后按照玩家的描述逐步操作。

操作到第三步时问题就出现了。玩家在弱网环境下点击一键领取,客户端一直转圈,随后提示“网络异常”。诡异的是,提示出现后按钮并没有置灰,仍然可以继续点击。我故意多点了两次,然后恢复网络,结果邮件消失了,但邮件里的金币被发放了三次,总额确实翻了好几倍。到这里,现场算是稳定复现了。

复现过程让我确认了两件事:第一,客户端在网络请求未返回时没有锁住按钮,存在重复提交的可能;第二,服务端对这封邮件的领取状态没有做有效的幂等控制,同一个请求ID被处理了多次。有了这两个方向,接下来的排查就有明确的目标了。

5.2 根因定位:服务端丢失了幂等性

为了坐实这个判断,我抓取了客户端发出的请求。弱网环境下,一键领取的接口请求发出了多次,前一次请求超时后,客户端立刻重发了一次,加上玩家手动点击又发了两三次,同一个邮件ID在几秒内被请求了四五次。而在服务端日志里,每一封邮件的附件都对应着一条发放记录,也就是说同一封邮件被当成了多封全新的邮件处理。

真正的问题出在服务端领取接口缺少幂等校验。所谓幂等,可以理解成“同一操作重复执行多少次,结果都和只执行一次一样”。最好的类比是超市收银台扫码支付,如果网络卡顿导致重复扫码,系统必须保证只扣一次款,而不是每扫一次就扣一遍钱。游戏里的邮件领奖、每日签到奖励、首次充值发放,本质上都应该是幂等操作,同一个请求无论到达多少次,只生效一次。

当时客户端重试机制的目的很简单,就是提升弱网环境下的成功率,避免玩家明明拿到了奖励却因为网络波动看不到。出发点没问题,但重试时没有携带统一的幂等键,服务端也完全不知道这个请求是重复的,于是把每一次请求都当作第一次来处理。两端各自的设计都是合理的,拼在一起却形成了一个肉眼看不到的漏洞。

5.3 回归验证与同类风险排查

修复方案分两端落地。服务端为所有涉及发放奖励的接口增加幂等校验,客户端每次点击生成唯一请求ID,服务端处理过的请求ID直接在入口处丢弃,不再执行任何发放逻辑。客户端同时把“一键领取”按钮在请求未返回期间置灰,从界面层面降低误触概率。

修复完成后的回归测试,不只是重跑一遍弱网复现步骤,还做了三类补充验证。第一类是接口重放测试,把抓下来的请求数据包原样重发多次,确认返回结果一致且奖励只到账一次。第二类是并发测试,用脚本同时向服务端发起同一封邮件的多个领取请求,确认并发场景下也不会重复发放。第三类是弱网回归,把丢包率、延迟时间分别组合测试,确认客户端提示和按钮状态都符合预期。

第三类验证跑完后,我还顺势把项目里所有类似的带发放接口拉出来排查了一遍,包括签到、七日登录、新手引导奖励、充值返还、活动完成奖励。它让我确定了一件事:服务端幂等校验绝不能只针对单个接口做,凡是涉及发放的接口都应该在一开始就统一纳入设计规范,而不是等线上出了问题再补。

6. 比清单更重要的:异常测试的内功心法

清单和框架能帮你解决“现在测什么”,但如果只停留在照单全收的层面,很难真正提高测试质量。我做了这些年游戏测试,最后想说说比执行方法更重要的三点思考方式。

6.1 把“玩家会怎么做”放在“设计想让他怎么做”前面

很多测试员习惯完全按照需求文档和产品设计去推导异常场景,这种思路有一个盲区:真实玩家根本不看设计文档。他们会在角色创建界面反复横跳,会在加载动画里狂点屏幕,会在充值页面连续访问后犹豫退出,会在网速不好的时候暴躁地重复点击同一个按钮。

我在设计异常用例之前,会先把自己当成一个没有耐心的玩家,把游戏最核心的几条路径以“最容易犯错”的方式走一遍。比如新手引导能不能跳过、跳过过程中断网会发生什么、结束战斗后连点结算按钮会不会出问题。这种“恶意玩家”视角最初的产出可能只有两三条,但每一条背后对应的都是真实世界里成千上万个手滑玩家。

6.2 异常测试的“容错三问”

我把每一次异常测试的验收标准总结成三个问题,也是我在评审用例时必问的底线。第一问:系统会不会崩?崩溃是最低级的失败,但在某些异常场景里,不崩溃反而成了最高要求。第二问:数据会不会错?如果系统没崩溃但玩家资产、进度、排名这些数据出现了不一致,问题比崩溃更严重,因为崩溃还能重启,数据错了几乎无法无痕修复。第三问:玩家能不能自救?系统就算遇到了处理不了的情况,也必须给玩家一条明确的出路,比如错误提示、返回按钮、重试入口、补偿邮件,而绝不能让玩家卡在一个死界面上只能强杀进程。

三个问题只要有一个回答是否定的,这个异常用例就没有通过。哪怕开发说这个场景概率极低、出现成本高、普通玩家根本测不到,我依然会坚持,因为概率再低,只要发生了,就是玩家的第一体验,也是客服系统的第一个压力测试。

6.3 异常测试的投入产出比比想象中高

最后聊一点项目投入上的体会。在大多数测试计划里,异常测试的时间占比往往只有两成左右,但上线后线上反馈的重大问题里,异常路径的贡献率远超五成。正常路径上的功能问题,多半在开发自测或测试首轮就被滤掉了,能顺利活到线上的,基本都藏在网络、时序、数据、状态组合出来的阴暗角落里。

所以我现在更愿意在最开始做测试计划和用例评估时,就把异常场景的覆盖目标定得更高一些,而不是让它在排期不足时被第一个砍掉。给异常测试留出时间,不是给测试团队找工作量,而是在给未来的运营期降低事故概率。这个道理,越早想明白,后面省的事越多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询