某游戏的bug总结
问题:
1、龙之宫殿捡钻石,客户端发送n个相同的数据包给服务端,则会获得n次钻石的奖励
2、钻石购买起源之泉,客户端显示钻石已经扣除,实际服务端没有扣除
3、实名认证精英服开关打开,正式服的开关也同时开启
问题原因
一、当客户端捡起某个钻石的时候,服务端会标记该钻石已经捡起来;但是服务端判断该钻石是否能够捡起来的时候却没有使用该标记
二、为了用户的体验舒适,钻石购买起源之泉的时候客户端做钻石的扣除服务端也做对应的钻石扣除;虽然扣除失败但是客户端显示扣除成功,从而欺骗了测试人员;
1、服务端的扣除代码:if (type == 1) {cost_item();} else if (type == 1) {cost_gem();} 因为钻石的type是2,从而导致了没有扣除成功
三、精英服跟正式服使用同一个服务器
总结
一、防御性太差,没有考虑多次发相同数据包的情况。在编写代码的时候应该增加debug_test的接口,用来检测对应的数据包接口是否足够健壮。
二、编写代码的时候,难免会有出错的情况;但是编写if的时候,一定要考虑最终的else 的情况;上面的代码如果再增加if (type == 1) {cost_item();} else if (type == 1) {cost_gem();} else {return false;} 那么即使type写错了,也是很容易就会发现,而不是到了外面的环境。
三、沟通不足,文档里面写的不同服务器有可能到了程序员的设计里面已经被放到同一个服务器了,只是命名不相同而已。当在自己没有完全确定某件事情的时候,最好咨询下其他人
汇总:
第一点跟第二点其实都是测试不到位导致的。以前听到过一个词:测试驱动开发。后来被一个测试人员给否了,没有这种词。现在重新想起了这个词,其实这个词是给开发人员用的。在编写好接口之后最好先自己构造相应的测试用例,每次对接口的修改都跑一遍该测试用例,看看修改之后测试用例是否都能通过。
不能有摸棱两可的问题答案。
浙公网安备 33010602011771号