压力测试是一类测试手段的总体称谓。无论是压力测试(stress testing)还是负载测试(load testing)都可以统称为压力测试。但是不同类型的测试,有着各自不同的侧重点,最终这些侧重点会指导我们如何规划测试方案和执行手段。
压力测试(stress testing)的目的主要是在超负载、高并发的情况下,查看服务器程序运行情况和可恢复性。
负载测试(load testing)的目的主要是通过不断增加负载,最终找到一个既可以使服务器程序正常运行,又不会影响服务器硬件性能的平衡点。
数据容量测试的目的主要是查看在长期高并发或长期高负载的状态下,数据存储的事务存储瓶颈和对服务器磁盘存储、CPU使用、内存使用甚至是网络带宽占用的情况。
游戏都要做什么压力测试
我们把游戏可以看做是一个特殊类别的软件。那么针对游戏,我们可以分成这么几部分来看。
第一就是游戏本体,分为服务器程序、数据库和客户端程序三部分。
第二就是平台系统,比如帐号验证系统、付费系统、游戏后台系统、客服系统等等。
第三就是周边服务类内容,比如某些独立于游戏之外的页面运营活动等等。
根据这样的分类,我们可以大致做一下划分:
针对游戏本体,我们需要对服务器程序进行应用层级的压力测试,对数据库的消息、事务处理以及磁盘存储进行压力测试;
针对平台系统,我们需要对系统与游戏之间的接口进行压力测试;
针对周边内容,则要根据各自不同的内容单独设计测试方案。
一、如何设计压力测试方案
第一步,确定待测试系统的架构。不论是基于C/S的游戏本体,还是B/S的页面活动,作为一个测试,首先要深入了解待测试系统的架构组成,熟悉每个进程的功能和特点,理清各个进程之间的逻辑关系。
第二步,在基于对服务器功能和架构足够了解的基础上,对游戏场景进行拆解。比如帐号的登录与校验过程、支付交易过程、主线或支线任务流程、交互系统(好友、公会等)流程等等,因为不同的场景,会涉及到不同的服务器进程,针对每个进程进行单独压力测试,是我们进行压测的最重点工作之一。
第三步,在拆解出不同的玩家使用场景后,针对每个场景,分析出玩家的操作过程是什么?这里可以通过多种手段进行分析。比如画一个时序图,来确定消息处理的步骤;又比如说利用黑盒测试的方法,实际去跑一遍具体功能,来模拟玩家行为;或者是类比市场上同类型游戏的玩家的真实反馈;甚至还可以收集游戏在删档内测阶段的玩家数据或服务器日志来进行分析。总之,我们模拟的行为越接近玩家真实的行为,对于测试的结果则越为准确和有效。
第四步,对于流程有了清晰判断以后,自然也就可以找到压力可能会存在在什么地方了。当然,由于不同的语言特性不同,对CPU、内存的分配使用和回收机制都会有所不同,所以需要每个项目进行单独分析。除了利用自己的经验加以判断外,还需要和开发频繁沟通,确认我们的判断是否准确。另外要特别注意的一点是,所有的单点服务器都是压测的重点,往往是单点服务器在上线运营期间会产生大量性能问题。
第五步,找到了压力重点以后,我们要分析一下这个问题点的压力属于什么类别。一般来说,压力类别有两种:高并发和高负载。高并发的测试需要我们不断提高测试的QPS,最终找到压力阈值,但并不需要长时间测试;而高负载的测试则相反,它需要我们在一个相对稳定的压力情况下,持久的去执行测试用例(一般视功能来定,最长可能需要12小时以上),来查看系统在长时间运行下的服务器性能反馈。
第六步,在完成上述步骤后,就可以制定出有针对性的测试方案,并加以执行了。这里特别需要注意的是有两点:第一是测试环境必须真实,线上使用什么服务器配置,测试环境就要采用什么服务器配置,否则测试是没有任何意义的;第二是严禁闭门造车,一个人设计出来的测试方案也是没有任何意义的,一定要充分和开发、和策划进行沟通,确定你的方案的准确性和可靠性。
简单概述,就是要确定架构、模块拆解、分析流程、找出痛点、划分类别、制定方案。
二、常用的压力测试工具
商业化工具:有很多已经上线的商业化工具可以供我们使用。比如Loadrunner、Jmeter、Burp Suite等,还有像wetest平台提供的云性能测试等等,都可以在大部分非游戏场景顺利完成我们的压力测试工作。
开发提供的压测工具:但是由于游戏程序的特殊性,大部分情况下,游戏本身的程序,通过上面的商业化工具是不能够很好完成测试的。这时候就需要开发同学要单独写出一套压测工具(俗称robot,机器人工具),开玩笑的说,机器人工具更像是一套官方认证的外挂。它可以更为真实的模拟玩家的游戏行为,而且针对性更强,更容易发现服务器的压力问题。
自动化脚本:上面的机器人程序功能确实强大,但是开发成本很高,所以对于一些较为简单的场景,或者是接口测试,我们可以自行编写自动化脚本来替代机器人,这样效率更快。
人:如果上述工具还是无法准确找到问题,或者说对于开发已经解决的压力问题无法稳定复现,那么就有必要考虑通过真人测试的方式来解决了。我们可以借助公司内部的同事或者专门从事这方面工作的一些大型公会的力量,来完成这类型的测试。
三、压力测试报告
任何测试的目的都不是制造问题,而是要定位并解决问题。
所以压力测试报告最重要的内容,就是要根据测试结果,分析出这一次测试的重点问题是什么?为什么会出现这样的bug?下一步应该建议开发同学做出哪些修改?哪些内容在系统设计上存在不合理性?最终向项目组给出结论:测试结果是否满足上线条件。
不过对于游戏来说,由于游戏迭代较快,内容变更几率更大,所以并不一定要开发修复掉所有压测问题,才能算是测试通过。我们还可以通过其他方式来解决问题。比如使用SLB负载均衡的方式解决单点服务器风险,提高服务器配置来应对上线的并发压力。
总的来说,压力测试报告,是要辅助项目组来定位重大问题、标明技术风险、提供解决方案的一部文档。
四、总结
如果说正常的游戏测试,是要验证程序的正确性和稳定性,那么压力测试恰恰相反,它是要找到服务器性能的瓶颈,以尽早把服务器压爆作为一种“乐趣”。
做压力测试,逆向思考极为重要,就是要培养自己冷静、“消极”的去看待自己眼前的待测目标。因为几乎每一位开发同学,都非常自信的认为自己写出来的代码是完美的。不过实际上并不存在完美的程序。任何完美的程序,仅仅是因为我们还没有测出它的问题。