先将性能测试分几个类吧:
1、性能指标测试--主要是根据需求对产品的并发、吞吐、系统状态等等进行验证是否达到了需求。
2、压力负载测试--主要是验证产品在接近满负荷或者超负荷下面(主要是指系统资源),系统的功能是否还正常。
3、稳定性测试--系统在一定压力下长时间运行后是否功能依然正常。
性能指标测试:
性能指标主要是依赖于需求,即在什么场景下面支持多大的并发或者多大的吞吐,并且相关系统资源占用多少,性能指标的确认相对比较简单,并且确认下来后测试方法也是确定的。
但是,性能指标一个问题是需求的定义可能出现考虑不充分的情况。比如:可能某一种场景下面没有考虑到,而后面测试的过程中发现这种场景有问题,但是需求却没有定义,这样就不好去确认问题了,而且测试容易被开发忽悠。
为了解决这个问题,我们可以根据产品的特点列一个性能指标的checklist出来,然后每次用checklist去检视,这样就能够避免遗漏。当然,后面过程中发现了没有考虑到的地方则完善下checklist就可以了。这样通过不断的完善来保证我们的性能指标定义的是充分的。类似的checklist如下:
场景 | 并发数 | 吞吐量 | 内存占用 | Cpu占用 |
场景1 | Xxx | Xxx | Xxx | Xxx |
| | | | |
性能压力测试:
整个性能测试过程大概是这样:
1、根据产品的特点以及对业务的熟悉程度,来编写性能压力测试用例(可能部分不会有性能压力测试用例)。
2、评审性能用例,并且根据性能用例确认测试方法和工具。
3、执行性能用例,发现问题,并且提交bug。
4、完成性能质量的分析。
那么,性能测试的目标是什么呢?答案肯定是经过性能测试后产品没有性能问题了。
这样,这里有两个问题:
1、什么样的问题算性能问题(即功能问题和性能问题的区别)。
2、如何去保证性能的质量(即能够发现所有的性能问题)。
一般来说:笔者认为当系统处于一定负荷的时候出现的问题算是性能问题。比如:拿qq来说,可能1个qq用户登录的时候服务器没有问题,但是1万个qq同时登录并且发数据的时候服务器可能就会有问题(因为占用的资源有很大区别),其他如果是可以通过测试功能就能够发现的逻辑问题不属于性能问题。
那么,如何去保证性能的质量呢?这里参考保证功能的质量一个方法,即通过覆盖性能业务逻辑的方法来保证性能质量。具体如下:
1、将业务逻辑很详细的画出来。
2、根据业务逻辑提取出性能点,提取性能点的一个原则是确定单个连接和多个连接是否会对该逻辑有影响,只要有的都应该提取出来,比如资源的申请和释放、多线程的工作方式等。
3、根据性能点完成性能用例的编写,一定要确保这些性能测试方法能够达到测试目的。
4、分析是否可以将一些测试方法或者检查点通过脚本或自动化的方式来实现,来节省测试时间。
5、学习对应的测试工具,对工具的熟悉能够很有效的提高自己的测试效率。
6、跟功能测试一样,测试过程中一定要多进行分析,最好是能够对每个性能bug都进行分析,然后看下是否还有可能没有考虑到的地方,进行补充测试和完善用例(并分析当时为什么没有考虑到),来形成经验文档。
7、加强对被测系统的学习,因为性能压力测试本身是一个整体,只有对被测系统了解的足够的深入才能够分析的更加准确,比如:很多服务器都是基于linux系统的,那么对linux系统的深入学习就比较有必要了。
稳定性测试:
稳定性测试就相对比较简单了,主要是按照典型客户实际使用的场景搭建好对应的环境,并且模拟客户实际可能的流量和并发等等,来一直不间断的跑,并且过程中不断的关注功能是否正常。保证在客户那里实际使用的时候没有问题。
个人在性能测试方面的经历:
前面已经提到过毕业后开始去学习性能测试,然后在新的项目里面学习整个业务逻辑的知识,并且在性能测试过程中进行分析,并提高自己的性能测试能力。下面详细介绍下自己在性能方面的过程。
因为自己测试的产品是网络产品(基于linux系统的二次开发),其实这是一个比较难的东西,因为涉及到整个linux系统。再加上当时的用例质量以及性能的测试工具比较单一,整个性能测试过程就是一个撞bug的过程。
后来学习了整个业务系统后就开始去尝试分析可能存在问题的逻辑,然后专门针对那块逻辑去加大压力测试,算是稍微有点重点了;然后就是不断的深入学习整个linux系统的网络底层相关的知识,比如:netfilter的框架(钩子都挂在上面),tcp/ip协议栈的一些通信机制等等,来进一步提高对于整个系统的理解能力,当然,这块对于性能测试的帮助确实是很大的。起码,跟开发沟通的时候不会被开发的一些专业术语给懵住,还能够跟开发一起来讨论整个过程以及可能存在问题的原因分析等等。
再后来,就是随着对于整个系统的架构熟悉,比如:知道哪些模块跟nf_conntrack有关联,以及可能的关联点是什么等等来进。行专项的测试,这样的测试更加有针对性,并且发现问题后自己也能够进一步分析可能存在的问题是什么等等,对于性能的质量把握就也更加的靠谱,当然,还无法完全做到100%,至少是走在这条路上了。
个人测试性能的经验,供参考:
1、要做好性能测试一定要对被测对象以及被测对象依赖的系统非常熟悉,否则很难去深入到里面去。
2、磨刀不误砍柴工,合适的性能测试工具对于更加有效的发现性能问题是很有帮助的,也能够大量的节省性能测试时间。
3、让大部分的工作都自动化,来节省自己的手动执行和检查时间。