JAVA性能测试初体验

上一篇 / 下一篇  2012-12-13 13:04:41 / 个人分类:自动化测试—性能测试

                    JAVA性能测试初体验

     序言:自动化测试的时候,一直没想过要去做性能,等到现在做性能的时候,才明白这本身就是一个必须都要经历的过程,就像编程一样,编写小型软件的时候,我们不用过多关注架构和性能,但是等成长到一定时候,就会需要关注软件的可复用性(这是由开发成本决定,这点可以在软件架构上去改善,常说的自动化框架也是为了增强脚本的可复用性和可维护性)、性能瓶颈(这是由系统资源成本决定,空间和时间的调配)、可测试行(这能大大提高测试人员的测试效率,很多时候我们要求开发提供一种测试的接口来方便测试人员进行测试)、可部署性(利用makeant或者maven,能够大大提高软件发布效率,这也是持续集成中的一种手段)等因此,测试中的发展其实可以有很多的,不仅关注测试手段,还要关注如何在更多的途径上提高测试效率。下面是对本次性能测试项目至今的一些简单总结,欢迎指正。

一、性能测试项目的背景

性能测试缘起于产品存在大量背景数据时,程序响应时间过慢,而且在特定的情况下有可能会造成一些数据上报丢失,所以需要定位。

产品为C/S架构,采用的协议是snmp协议,运行在jvm

二、性能测试的策略

1、 测试目的的确定

1) 系统监控,包括cpu、内存、线程使用情况,在大数据情况下,发现问题,帮助修正代码结构,系统结构,提高系统的运行效率。

2) 确定软件运行资源需求指标。

2、 性能测试指标确定

1) 确定指标来源,主要包括:产品规格、行业标准、客户需求与故障场景等

2) 确定测试特性,例如:系统容量、及时性、稳定性、抗压性、资源利用性等,这些特性可以根据行业性能测试特性以及产品的相关特性来决定。

3) 确定具体指标,包括数目和单位。

3、 性能测试技术储备

其实性能测试可以算得上是自动化测试的一种大数据测试

1) 测试场景准备:准备测试场景,可以理解为对背景数据的构造,其实可以将这种构造理解为另类的接口测试,例如:我们的软件服务器是应用SNMP协议进行通信,设备端有一个agent,专门用来与软件服务器端通信,那么可以虚拟出这么一个agent,保存相应的设备信息,虚拟过程可以通过对在网的实际设备进行录制,然后生成。

    互联网中,客户端与服务器的交涉是基于http接口协议,其一般的性能测试都是发送大量的http请求,其实这种过程有一个问题就是无法模拟真实的背景数据,因为报文过于单一,而印象很深的是新浪一位朋友开发的tcpcopy工具,在传输层,将线上数据复制到测试场景下,从而成功模拟了真实场景环境,这是一种很好的测试方法。

(还有一种准备工作就是对测试服务器的选型,包括操作系统类型、CPU内核数目、内存数目等)

2) 测试数据准备:这其实就是接口数据,在互联网中,这方面的模拟比较简单,用很多工具,例如LRjmetersoaupi等都可以成功构造模拟http报文,从而查看服务器的响应。因为我们采用的是snmp协议,所以业内没有这样的snmp接口工具,所以就自己基于snmp协议包开发了其snmp报文模拟工具。

3) 性能测试监控:性能测试过程中,对软件系统服务器的监控是关键,例如:web测试中,往往会对web服务器和数据库服务器、操作系统的指标性能进行监控,因为我们的软件是运行在jvm上,所以直接采用jconsole或者jprofiler监控服务器的内存使用、cpu使用、各个线程使用情况,还有对数据库和操作系统的监控等。

4、 性能测试方法

1) 基于指标,进行测试数据构造测试,查看系统是否工作正常以及监测是否没有问题。

2) 基于指标,在基于测试数据测试的同时,由测试人员参与进行操作,测试在特定环境下的系统工作情况。

3) 客户场景模拟测试。

4) 随机测试,利用算法进行大量随机数据构造。

三、性能测试调优

1、 性能测试是一个不断探索和不断完善的一个测试过程。

调优步骤:衡量系统现状、设定调优目标、寻找性能瓶颈、性能调优、衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈)、性能调优结束

2、 衡量现状,系统性能主要存在问题

1) 内存泄露

2) 内存占用过大,响应速率慢

3) 线程数不断增加,出现死锁或空闲线程

4) 某些类实例化数目过多,占用多余的内存空间

3、  内存泄露

       1)检验方式:内存泄露需要进行时长测试,既将监控界面及系统界面全部打开,进行长时间运行(如12小时),观察系统类的增长情况。

       2)问题定位:若出现JVMHeap持续增长或者Memory views经过时长测试,出现较大规模的红色部分(增长部分),且无法GC

4、 系统内存占用大

1) 检验方式:进行某些特定的操作,系统进行大量内存占用或者数据读写操作。

2) 问题定位:若系统内存数突发性的增长,且之后不回落,说明某些模块在持续性的占用系统资源。或者出现JVMHeap有增长,虽不是持续增长,但一直无法回落。

5、  线程数目过多或死锁

1) 检验方式:进行某些特定的操作,可以使系统产生大量线程操作。

2) 问题定位:若系统线程数突发性的增长或持续增长,且之后不回落,说明某些模块在持续性的占用线程。或者观察是否有许多线程来自同一个模块、长期处于waitingblock状态

6、 性能调优原则

调优过程中,充分而不过分使用硬件资源、不要一遇到问题就去改善资源环境,然后,合理调整JVM,需要重点掌握一些JVM的参数,并且要善于分析系统架构和JVM的底层工作机制。

总结:性能测试是一个很漫长的过程,不管是做JVM性能测试、WEB架构方面的性能测试,其实道理是相通的,个人觉得,要做好性能测试,不仅要对测试理解,更要对软件架构和底层的服务器工作机制特别理解,不然,往往,你只能去简单做一些所谓的性能测试操作,但是却无法针对很多场景提供有效的测试策略和调优建议。好的性能测试工程师应该是能够快速搭建场景定位问题、提供指标,并且能够对软件系统架构提出有效建议。共勉之

——散步的SUN

更多测试技能在线学习,更多测试文章,请访问http://www.zhibokeji.com/


TAG:

dyc1012的个人空间 引用 删除 dyc1012   /   2013-09-23 13:39:38
1. Top down: System level(CPU, Memory, Disk, Network) --> Application level(Heap, Method, 3rd jar, thread model, lock contention, class loader......)

2. , Closed loop: Test-->find issue-->investigate issue-->fix(developer do it) and verify(whether regression)

3. Do regression performance test interval (per milestone or release or per month):
The benchmark/workload should be:
1> Measurable
2> Reproduccible
3>Static(named steady state)
3>Representative (test case and data require to simulate representative scenario)
4>Stable (both system and test cases to some level of maturity)

4. Do baseline test is very very import (you'll do regression and investigate degradation based the baseline version)

You must do analysis/investigate/research( to code level), then you can regard yourself as performance engineer, or else you just a performance tester~~
小伍児的专版~ 引用 删除 大龙哥哥   /   2013-09-16 11:20:18
5
lidh0423的个人空间 引用 删除 lidh0423   /   2013-09-16 00:37:27
5
yangLambkin的个人空间 引用 删除 yangLambkin   /   2013-09-10 17:34:15
5
fionaquan的个人空间 引用 删除 fionaquan   /   2013-09-09 17:05:20
5
散步的SUN的个人空间 引用 删除 散步的SUN   /   2012-12-29 15:41:22
1、性能测试确实要早做,这本身就是一个积累的过程,不过我们往往都是出了性能问题,才开始想到要做性能测试...这是一个通病吧
2、性能测试前期容易犯的错确实类似于故意找茬型的,以为把软件弄死了就成功了,好的性能测试确实是一个评测系统,能够正确把握软件系统的性能瓶颈并加以引导
哈,青山兄现在在性能测试方面很有心得啊~
原帖由wolaizhinidexin于2012-12-13 16:13:04发表
java的没有研究过,不过.net下大部分都是程序和数据库写得有问题。。

等测试来改善性能已经太晚了,性.
liuyang0618的个人空间 引用 删除 liuyang0618   /   2012-12-26 16:45:16
学习中。。。
xin_晴的个人空间 引用 删除 xin_晴   /   2012-12-14 10:14:04
您好,我是51Testing软件测试网的编辑,您的本篇博文被推荐至51Testing软件测试网首页发表:http://www.51testing.com/html/02/n-830802.html
感谢您关注并支持51Testing博客,期待您更多的优秀原创博文。
文青山 引用 删除 wolaizhinidexin   /   2012-12-13 16:13:04
java的没有研究过,不过.net下大部分都是程序和数据库写得有问题。。

等测试来改善性能已经太晚了,性能测试工程师要加入到架构设计、数据库设计上面。

“大量背景数据”的模拟要根据调查,分阶段走,起用未来6个月的阶段,未来1年的阶段,未来3年的阶段,未来5年的阶段,一般到这里就可以停了。软件的生命是有周期的,所以不要一来就很大。这点好多测试人员都没有注意,一来就很大的数据,故意找荐。正确地、确到好处的评估系统的压力,我才觉得是性能测试工程师真正应该做的事。
 

评分:0

我来说两句

Open Toolbar