vlambda博客
学习文章列表

理一理性能测试的一二三四

        许多小伙伴都有那么一个想法,接到领导说要做性能测试的任务时候,就说,我拿个工具像jmeter、loadrunner之类的模拟个并发就好啦,这就做了性能测试了,关于这些听起来貌似是对的,性能不就是测试系统扛不扛得住我制造的各种压力场景嘛,但又觉得哪里不对,所以就开始整合一下相关的一二三四。


 一、为何要做性能测试?


关于这方面,很多人都能说出自己心中的一些理由,但或多或少不全,在我认为应该是如下:


二、性能测试分层


一个web系统最粗的结构应该是下面那样的:

理一理性能测试的一二三四

像文章开始讲的,最开始的很多直接接口压力测试,更多的是对后端的性能压力,在性能测试环节中,很多人往往会忽略前端和网络的影响,认为按理我所有的业务几乎都是后端在处理,前端和网络相关的问题我不需要关心。但是现实中,前端是直接面对用户的,最容易引起用户直观感受的恰恰是前端的一些性能。


分享一个案例,之前就有过一次在做长期稳定性运行的测试中,因为前端图片处理不完整导致内存泄露,导致软件越用越卡顿,到最后甚至没办法使用的情况。


网络也是影响性能测试的一大因素,特别是目前很多物联网相关的产品,引入4G网络、多级路由等等情况,需要进一步的考虑不通网络下的运行场景,比如说在做app测试中经常用到的弱网测试。


后端的压测就是我们常常需要做的主要内容了,相比熟练使用各种各样的压测工具,其实我认为更应该关心的是整个系统的布局架构。这就要求我们对被测系统的一个熟悉程度,系统上下行用的什么协议、使用了哪些中间件、在模拟各种场景的时候,哪个节点的压力可能最大,数据库那方面又是怎么样的,等等,这就需要我们要有很宽很宽的知识面,我一直认为,不会去做性能分析的工程师不是一个合格的性能测试工程师。


三、如何开展性能测试

按我自己理解整合如下:


可能不是很完整,有建议的小伙伴们可以在评论里补充。


四、性能测试的一些基本概念


        前两年开始负责了部门的一部分面试工作,其中很多应聘的面试者在被问到一些性能相关的术语的时候就会语塞,比如问内存泄露和内存溢出的区别,死锁是什么之类,就有很多人回答的磕磕绊绊。

        在这也做了部分的解释,权当复习。


内存泄露:

指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。


内存溢出:

是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。


举例1:幼儿园班里有十个杯子给几十个小朋友装牛奶喝,小朋友用完杯子后要放回去清洗后给后面的小朋友用,但有个小朋友不听话,用完杯子后丢垃圾桶去了,这样小朋友轮流喝完牛奶的速度就变慢了(内存泄露),甚至如果刚好一共有十个小朋友都不听话把杯子扔了,那后面的小朋友就喝不到牛奶了,这个“系统“就崩溃掉了(内存溢出)。


死锁:

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。


举例:小明和小刚打架,两人互相掐着对方的脖子,都各自喊着你先放,但都不认输都不肯放,那就死锁了- -!

        房间里面只有一间浴室一个小音箱,小明在洗澡,小刚在用小音箱听歌,小明想一边洗澡一边听歌,小刚不给,小刚也想一边洗澡一边听歌,小明不让进,那就又死锁了- -!


吞吐量:

处理能力又叫吞吐量,指的是单位时间内处理的客户端请求数量。


举例:小明开了家快餐店,这家快餐店在16点-20点这个时间段一共接纳了2000个客户。


绝对并发:

多个用户同时做同一个操作。目的主要是考察系统运行过程中处理“死锁”、“资源争用”的能力。


举例:长城的宽度允许我和我的小伙伴五个人肩并肩一起走过去,但最佳第六人小明表示他也要并肩一起走,于是他被挤下去了- -!


相对并发:

多个用户同时做同一个操作。但这个同时不一定要在同一秒钟,可以理解为同一个时间段内做了同一个操作。

举例:在国庆期间,我和我的5个小伙伴在长城畅通无阻地溜达了一圈。


稳定性测试:

程序持续正确运行的周期长度。(时间范围内的运行稳定)

举例:买了个保温杯,天天使用它的情况下用了十年还没坏。


还有很多相关的概念,就不一一赘述了。


从一开始想整合一下东西不知不觉就码了快2000个字了,码字不容易,且看且珍惜- -