前言
发现问题是质量工程的一部分,如何优化测试效率,就要使用科学的方法让每次测试都可以覆盖比较完整,无目的 和 0 策略的测试只会投入更多的人力和带来疲兵,疲兵效率更差。
在互联网快速迭代的时代,W 模型下可以跑到 2 轮测试也不一定有时间,所以不要浪费这个每一轮时间,这份文章是功能测试的,功能测试真得是测试以外很多人理解的无脑点鼠标吗,希望耐心看完后发现里面想表达的一些意思,也可以理解游戏产业的测试。
希望更多游戏测试也可以来社区分享下功能业务的经验,真的很庞大,而且互通性很强。
好吧,那么接下来,我来点鼠标了。
场景 de 怪物
以 Arpg 为例子,如何测试 1 个场景里的怪物
首先我们会找到 npc.csv 表,其中会有一列是 npc 名称,id,场景 id,这份表是策划配置的。
# 我们先验证是否满足了策划需求,前往跳转到对应的场景比如 002.
怪物有规则按等级和区域分布或者无规则散落在可以有怪物的区域,这份东西可以在策划案内看到/编辑器内
提供二种方式验证:
1.使用 gm 指令或者修改角色移动速度来实现自己跑地图,到对应地图点查看怪物并且焦点他查看怪物详细情报,有策略的测试,可以在这里实现分工和分区域检查
1.1 升级版 验证怪物的警戒区域和根据布怪区域验证区域边界那边是否异常。
验证怪物的警戒区域:选中怪物焦点可以看到多少米,怪物警戒区域是 25 米,就一路把怪物啦出范围内。注意和怪物出现的原点超过 25 米后是否会返回,这里允许客户端有 2 米左右偏差 就是 27 米,毕竟是计算返回需要时间(这里可以查看社区关于 reponse time 的帖子)
验证区域边界是否异常:前往布怪区域点外虚线位置(引擎编辑器内可见)是否有怪物会布到点以外或者踩住点。
怪物属性异常 1
上面添加怪物,发现这个 npc,但是它和其他不一样,没有头像(1 个 C 类问题),如何提交这个问题呢,大家可以下日常工作
提交一个问题,Tittle 不要和内容一致,更精简的列出问题关键字为佳,要短而明了。这里乱入了 1 个提交 bug 的介绍。
模板:[场景名称]+[场景坐标位置 x,y]+[怪物名称]+[xx 表编号]+[问题类型] +[分析判断原因]
如果缺少坐标位置,对应开发者还是要去查是哪里问题。我最喜欢的模板化讲诉,公司里也是这样培训的。
问题内容:
凌霄城场景,坐标 679,108 npc:雪地兔 npc 表 idxxxx 鼠标选中后,发现 npc 缺少头像 icon
当然这样提交得只能获得 B+,测试合格。
验证需要添加进入 [分析判断原因] 这个不是必加的,但做为 1 个有情怀和负责的测试,有时间最好可以帮助检查下,这样也可以锻炼你对游戏文件路径和格式的熟悉程序,这里定位每个问题不会比互联网定位任何控件属性简单。
分别可能有 1)美术资源没有 2)程序没有加进去,3)加进去后 bug 导致消失。(其实原因主体有 5 种,看客是否可以找到其他的。)
附件包含在该场景内的截图位置,实际提交时图要大点,格式是 jpg
怪物属性验证问题 2
上面这样是否就完美了,不是!这个 npc 缺少 icon,那么他是否还缺少其他东西呢?
一个 npc 包含 抽取部分举例(还有警戒范围这些跟游戏设计业务挂钩的)
①Icon ②模型比例 ③脚底光环 ④战斗之前碰撞 ⑤战斗之后碰撞 ⑥战斗移动动作 ⑦攻击动作 ⑧攻击音效 ⑨受击音效等 <这里可以写在功能测试用例中>
触发和这个 npc 的战斗后,发现新的问题:⑥⑦⑧缺省
这里需要提交新的 bug,提交方式当然不能直接写⑥⑦⑧,但是同一类可以合并在一条提交(比如⑥⑦),也可以根据对口负责人来分配是提交几条。
当发现比如⑧是通用的,可能会是某一类 npc 在某些场景都没有配置 OR 音效没有提交,这里就需要细化检查。
问题模板如下:
[npc 名称]+{检查项 1…}+ 发现问题缺省 +[分析判断原因]
检查项 也可以说成是特性,需要维护的。
补充:警戒范围问题,(除了上面选中后焦点上的 xx 米以外)可以在引擎里的其他视图看二者距离的拉线,中间有障碍物是否会计算直线距离,基本警戒范围 xx 米是不会有错的,程序自己计算的。你不想开引擎,自己要计算也可以,对应英雄每秒正常走路多少米移动速度,知道这个就可以比对出来。如果指向怪物可以看到距离更好,精确算距离只能开引擎
1 个怪物这样测试就对了么,顺带验证下你的技能和击杀怪物的奖励吧。
Ps:测试怪物要和技能测试分开的,这种用法集合只是文档讲课或者是某次迭代回归中 case 上描述的
Case:场景 xx,用 xx 门派随意 1~2 个技能对 xx 怪物进行攻击
Check:怪物人物受击,双方音效,怪物奖励 exp 和掉落包
我们这里就简化点,围绕怪物
使用了龙爪手 距离 20 米,cd5 秒(使用 1 次后 5 秒后可用)
距离不足会龙爪技能文字是红色(通用颜色代表条件不满足)
距离满足龙爪技能文字是白色。(这里内力不足是蓝色,不过这次不是测试技能),我们瞄准怪物来试下技能。
Case:先鼠标选择,走进 20 米白色,走近一步 19 米 check 技能文字白色 ok
Case:19 米走回 20 米 check 技能文字白色 ok
Case:20 米走远一步 21 米 check 技能文字红色 ok
Case:走回 20 米后,点击技能,走远 1 米 check:技能可以命中
为啥可以命中呢,在 20 米点击时,arpg 为了保证同步问题,往往只要客户端认为技能为合法,不用等服务器返回,就可以把本次技能的动作给播出去,中和不中,暴击不暴击是另外计算的。
状态机
说到这里,要提下一个名词叫有限状态机,会贯彻游戏及其他软件开发中的东西,不光是测试和程序的东西。
定义如下:
从 1 个状态转换成另外 1 个状态的规则,状态机并且也是通用的组件意味着可以被重复使用,比如上面的技能距离不满足->技能距离满足,当然还有很多遮挡条件也会不满足(不可判断为直线距离)。
好吧他另外 1 个名词叫机制,当你完善了一套死了一波兵,原地可以在刷出一波兵,那么这个机制就可以复用在其他地方,开始拼接轮子吧。
先需要几个状态:
判断距离直线 满足白色 不满足红色 其他条件其他颜色(这里略过)
判断距离 需要是对象位置减去玩家的位置,这里也需要定义 1 个 class,这个是处理决策 action 函数,If eles 红色和白色定义在这里。
那么所有的状态我们需要 1 个接口去实现,程序运作原理是,当该状态被设置成了当前状态时,调用 1 个函数,一开始会定义 1 个初始函数,还需要 1 个检查函数 update()
SetState(newState) ->每次变更 -> update() 每帧检查,当满足了,就调用action()
白话整理:技能文字白色为合法 状态 A 红色 通过距离条件 状态 A 会变成技能文字红色不合法 状态 B 白色
客户端发出攻击指令是由状态 A 红色来决定的。
异常处理
这一切后,还需要 1 个处理异常的,所有行为都需要满足其中 1 个状态。如果都不包含,这个错误就会被抛出。
为什么需要抛出?
举个热门美剧《西部世界》,其中第一集治安官在路上和旅行者进行对话,苍蝇出现的脸上,随后治安官出现癫痫症问题。原因:人工 AI 是希望可以驱赶苍蝇,但决策治安官的人工智能是不会伤害任何生物(主要保护旅客),于是出现了逻辑冲突,因为有了异常处理,当然在电影里治安官机器人会不会冒烟就不知道(毕竟编剧不一定会程序),所以抛出了 1 个行为癫痫症。
可以看出有限状态机强大和广泛,并且所有的关系都是各种状态机来设定的,假设你目前还是 1 个 ue4 开发者更会这么觉得。
End,感谢看完。