1425067d6jddip6d4hhn6h.jpg
  文/游戏测试风云录 张敬峰

  犯罪是普遍的,而逻辑则是难得的东西。-福尔摩斯

  我坚定不移的认为一个优秀的测试一定是一个优秀的侦探,测试的过程则是侦破案件过程,拨开层层迷雾,凭借细微的点滴线索寻找着隐藏在代码背后的bug,只有一个!

  本篇笔者将跟各位侦探一起探讨一个案件,并就侦破案件的具体过程来谈一谈测试的执行过程,在文章最后我们一起来谈谈侦探。

  下面的这个案件在侦破的过程中困难重重,各种谜团环环相扣,尽管过去了很久,笔者依旧记忆清晰,让我们一起回到2014年的夏天,一起拨开层层迷雾,重温谜雾背后的。

  笔者当时供职于DHD侦探事务所,那是一个阳光明媚的日子,强烈的阳光穿透过水泥森林拷打着世间万物,麻雀们在叽叽喳喳的飞来飞去,无来由的内心有一丝莫名的伤感,作为侦探的第七感告诉我,有大案子要发生了。果然,来到事务所后,笔者被告知有个重要的案件需要尽快侦破,事务所所长非常重视,限期破案,而且别的侦探都在忙别的案子,只能由笔者来扛了。既然如此,只能硬着头皮接了。

  作为一名老侦探,我并没有立刻开始案件侦破,而是先理清思绪,把侦破做了个简要计划,计划如下:

  详细阅读卷宗(至少3遍)->就卷宗疑点与犯罪嫌疑人沟通确认->推演犯罪过程->解决谜团->揭露

  卷宗如下:为了不必要的误解及方便读者,我省略了卷宗中大部分对读者无意义的描述,只陈述下案件简介,案件描述如下:在游戏中添加竞技场功能,要求用户能够与机器人或者真实用户竞赛,并通过竞赛获得一定积分,积分用来兑换奖励。

  笔者仔细阅读了卷宗,发现有几个疑点如下:

  疑点1,案发现场:密室还是开阔空间(直接展现型功能还是入口跳转型功能)?

  疑点2,犯罪时间:特定时间还是循环时间(一次性永久功能还是带有cd时间的循环开启功能)?

  疑点3,罪犯展现:罪犯的特征描绘(功能涉及的UI,UE,资源等)

  疑点4,犯罪手段:犯罪的各种手段(开启条件,上场设置,胜负表现等)

  疑点5,涉案资产:罪犯非法获益(资源产出,兑换等)

  经过仔细阅读卷宗及与犯罪嫌疑人反复沟通确认,本侦探终于将以上各个疑点清楚,得到基本的犯罪事实如下:

  1,本次犯罪为开阔空间犯罪,入口有多个,分别如下:建筑物入口,UI按钮入口,锦标赛条目入口,各条巨龙建筑入口

  2,犯罪事件为循环时间,竞技场每次循环时间为1天,可通过配置来设定

  3,犯罪展现:用户可以拖动每条龙来选择是否参站,每次参展消耗一张门票,门票每日免费赠送5张,用完后可消耗游戏内宝石购买。

  4,犯罪手段:竞技场每日固定时间开启,用户需具有8级以上龙才能参展,否则提示玩家去升级巨龙。

  5,每次战斗胜利或失败后,玩家的积分将会发生变化,积分可用于兑换道具

  基本犯罪事实理清后,我们一起来继续推演和还原犯罪过程,来看一下犯罪过程中会出现什么样的未知谜团及如何攻破这些谜团。

  谜团1:犯罪的自我陈述与实际情况不符(匹配规则与实际匹配结果不符),那么我们只能去理清犯罪的内在逻辑,看看问题到底出现在什么地方,本侦探把逻辑画成了2张图表,见下图:

142505r4egrwbgo4ejow14.jpg
1425063vn2ni7mjnhhy2zz.jpg
  通过这2张图,本侦探仔细演算了匹配结果,发现犯罪嫌疑人对轮数这个重要参数的理解有误,计算公式错误,重新调整公式后,计算结果正确。

  谜团2:卷宗内数据记录不正确(db中存储的数据有误差),作为侦探,怎么知道犯罪嫌疑人(开发人员)说的是真实的呢?怎样排查供述中的疑点呢?只基于遇独立思维来获得和验证,本侦探又根据卷宗自己推演了犯罪过程,拿我的推演结果来与犯罪嫌疑人的描述来做对比,推演过程如下(脚本):

  积分计算脚本(根据策划文档独立于开发人员的思维来书写)

 

 

  1. #! /usr/bin/env ruby
  2. K = 12 #当前系数,如改变需自行变更
  3. rn = 0
  4. def count_we(elo_fighter,elo_definder)
  5. we = 1.0/(1+10**((elo_definder.to_i - elo_fighter.to_i)/400.0))
  6. return we
  7. end
  8. puts (please input the fighters elo value:)
  9. elo_fighter = gets
  10. puts(please input the 1st definders elo value:)
  11. elo_definder1 = gets
  12. puts(please input the 1st battle result(win 1, failure 0, tie 0.5):)
  13. w1 = gets
  14. w = w1.to_i
  15. we = count_we(elo_fighter,elo_definder1)
  16. rn = elo_fighter.to_i + K*(w - we.to_f)
  17. puts the new elo value of fighter is: ,rn.to_i

142506rq96b9mqp7bchtn5.jpg
  通过与犯罪嫌疑人(策划)核对,符合犯罪嫌疑人的供述(需求设计预期)。

  经过不懈的努力,案件侦破,终于可以睡个安稳觉了。

  通过这次案件的侦破及以前的多起案件侦破过程,本侦探总结了几条侦探,与诸君分享:

  1,永远不要相信犯罪嫌疑人(程序员或策划),保持独立思考

  2,犯罪嫌疑人会经常翻供,做好心理准备,时刻根据翻供(需求变更)调整侦破思路

  3,线索永远是有限的,合理的推理则是无限的(拓展测试广度和深度)

  4,犯罪(bug)需要被确定性的验证

  5,长期犯罪(趋势性bug)经常被忽略

  6,旧有的卷宗(需求,用例,总结)存在不确定性,需要结合实际的变更不断更新维护

  7,存在于特定临界点(边界值)的犯罪危害最大

  逻辑不死,永恒!

  相关阅读游戏测试:如何有效地报告 Bug?

锐亚教育

锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛