关于性能测试(也许你应该看看)

首先,什么是性能测试?这里先举两个场景:
1
、1000W个微信用户同时去发朋友圈
2、1000W个淘宝用户同时去在淘宝上面买商品

        当然,上面两个例子极有可能都发生过。并且虽然我们都参与了上面的测试,但是因为我们是客户端,实际上并不太清楚对服务器产生了多大的压力或者服务器发生了什么事情。

         ok,到上面我们大概知道了功能测试和性能测试的区别。功能测试的目的是我们保证单个用户请求的时候没有问题;而性能测试的目的是保证很多用户(系统支持的)同时请求时没有问题。而我们的性能测试就是通过分析真实情况下多个用户同时出现的请求的时候可能出现的问题而进行的针对性测试(该定义纯属个人YY,如有雷同,不甚荣幸)。
 

   看起来貌似很简单的样子,那我们接下来尝试回答下面几个问题:
1
、当有1000W个微信用户同时发朋友圈的时候,服务器的压力都在哪里?每个地方的压力都有多大?瓶颈到底在哪里?
2、真实的用户场景是怎样的?怎样确保我们实验室的性能测试结果能够去满足真实的用户场景?
3、如果后面用户数从1000W到2000W的时候,我们的压力点会有哪些变化?
4、压力分析出来后,我们如何去覆盖到这些压力点,比如:如何去构造1000W个用户数去请求数据?
5、我们在性能测试过程中是否能够根据不断的调优(比如:调整用户行为),来得到我们服务器的一个最优的结果?
......

看到这些问题,相信应该不会有同学觉得很简单了,我们后面再一起去分享回答上面的问题需要学习哪些知识。

首先,我们将性能测试分为性能指标测试和性能压力测试。
         性能指标测试是指通过模拟真实的并发用户操作,来判断产品是否能够满足用户的需求;比如:微信需要同时支持4亿个用户的接入为一个真实的用户需求,但是我们内部不可能真实的去接入4亿个用户,只能够通过模拟4亿个真实用户去接入,如果我们通过模拟的方式达到该目标了,就说明满足了这个需求。


        性能压力测试是指在一定的负载情况(资源占用、接入用户量等)下面,验证产品的功能是否还能够正常运行以及系统本身是否正常。比如:当cpu和内存占用高达80%以上后,系统crash了。

其他朋友可能会说还有:稳定性测试、负载测试等等其他性能测试,这里就不再这里讨论了,因为测试方法都类似,并且目的也差不多,我们重点分享下如何进行性能指标测试和性能压力测试。



一、性能指标测试:
       
首先,需要知道性能指标的对应的需求是否合理以及足够明确。石头哥一直强调,在做一件事情前,一定要搞清楚做这件事情的意义是什么,特别是对于工作。比如:需求上面写我们要支持1万个用户同时在线支付。那么我们会有如下几个疑问:
1、1万个用户是怎么来的,通过什么样的模型推断出来的,是否合理?
2、支付的方式是否确定,不同的支付方式是否有影响?
3、支付的过程(一般应该都不是非原子操作)是否要全部保持一致?
4、是否要求全部都选择支付成功,还是需要一定数量的用户选择支付失败?
...

        当我们真正的理解了需求后,我们就能够更好的站在用户的角度上面去思考我们的性能指标测试过程了,也能够让我们的用户指标测试过程更加符合真实的用户使用场景。

         完成需求的分析后,我们就可以开始针对需求来设计对应的性能指标用例了,同时需要对具体的需求进行分析是否有测试方法能够覆盖到(建议能够先去理解下整个业务逻辑)。比如:我们要通过怎样的方式去模拟1000W的用户的并发接入?这个时候可能需要我们去自己开发测试工具,或者需要开发给我们提供对应的接口来着。

       研究和确定测试方法后,我们就开始按照具体的测试方法来进行覆盖测试了。当然,测试的过程一般都不是一帆风顺的。这就同时需要我们具备一定的分析能力了(前面的业务学习和理解是基础),比如:当我们发现并发用户数跑到10W后就一直上不去了。我们是否能够自己排查可能的原因呢?工具本身问题、网络问题、接口问题、系统负载问题等等。排查和定位问题的能力应该是一个性能测试工程师具备的基础能力之一,而这个也是很难去掌握的。

       按照我们既定的测试计划,完成性能指标测试后,就需要对整个性能测试过程和结果进行分析和整理了,这样能够让我们提交一份高质量的性能测试报告。另外,可能这份性能指标表我们要测试很多遍,这个时候就可以去分析下是否可以通过自动化的方式去测试了,毕竟你自己应该不会太想将同一份工作做两遍吧?

二、性能压力测试
性能压力测试跟功能测试一样,主要还是一个通过发现bug来评估质量的过程。那么这里有两个问题:
1、什么样的问题算性能问题(即功能问题和性能问题的区别)
2、如何去保证性能的质量(即能够发现所有的性能问题)

        一般来说:笔者认为当系统处于一定负荷的时候出现的问题算是性能问题。比如:拿qq来说,可能1个qq用户登录的时候服务器没有问题,但是1万个qq同时登录并且发数据的时候服务器可能就会有问题(因为占用的资源有很大区别),其他如果是可以通过测试功能就能够发现的逻辑问题不属于性能问题.

那么,如何去保证性能的质量呢?这里参考保证功能的质量一个方法,即通过覆盖性能业务逻辑的方法来保证性能质量。具体如下:
1、将业务逻辑很详细的画出来
2、根据业务逻辑提取出性能点,提取性能点的一个原则是确定单个连接和多个连接是否会对该逻辑有影响,只要有的都应该提取出来,比如资源的申请和释放、多线程的工作方式等
3、根据性能点完成性能用例的编写,一定要确保这些性能测试方法能够达到测试目的
4、分析是否可以将一些测试方法或者检查点通过脚本或自动化的方式来实现,来节省测试时间
5、学习对应的测试工具,对工具的熟悉能够很有效的提高自己的测试效率
6、跟功能测试一样,测试过程中一定要多进行分析,最好是能够对每个性能bug都进行分析,然后看下是否还有可能没有考虑到的地方,进行补充测试和完善用例(并分析当时为什么没有考虑到),来形成经验文档。
7、加强对被测系统的学习,因为性能压力测试本身是一个整体,只有对被测系统了解的足够的深入才能够分析的更加准确,比如:很多服务器都是基于linux系统的,那么对linux系统的深入学习就比较有必要了
8、尝试排查和定位问题,再次强调一遍,石头哥真心觉得排查和定位问题的能力是性能测试工程师一个很重要的能力,因为对于一个性能测试工程师来说,是应该要知道整个性能的瓶颈在哪里,并且知道怎样去覆盖到的,而不是简单的会用会用loadrunner就可以了。

猜你喜欢

转载自blog.csdn.net/zimingzim/article/details/80063213