JMeter完成java请求的压力测试详解以及问题总结
原文地址:http://www.cnblogs.com/zhaoxd07/p/4895224.html 作者:KK_Yolanda
这篇文章已经写得比较全面了,所以转载下,自己懒得总结了, 只对部分做了修改。
先定义一下我说的remoteService:即远程调用服务,没有http的url。不对外提供或者对外提供有限的服务。具体视各公司的代码架构所定,比如有些公司为web工程,scf服务,db。scf即为服务通讯框架(Service Communication Framework)该层结构,或者一些单独的lib包,里面集成了某些方法
对于有url的http请求,我们可以用jmeter的http请求进行压测,或者使用Apache-AB等进行测试,这种也可以用JMeter进行压力测试,具体操作如下
核心步骤
1.创建一个Java工程;
2.将JMeter的lib目录下的jar文件添加进此工程的Build Path;
3.创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写;
public Arguments getDefaultParameters();设置可用参数及的默认值; public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作; public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值,执行多次依赖于设置方式; public void teardownTest(JavaSamplerContext arg0):测试结束时调用,只执行一次;
4.Export为Runnable Jar File;
5.将此jar包放入JMETER_HOME\lib\ext目录;
6.以管理员身份打开JMeter;
7.创建线程组、Java Request、查看结果树,进行测试;
![](https://i-blog.csdnimg.cn/blog_migrate/31871d78bfdde77eef6ce3b46f7746aa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fff7b166bd935f7b606248359251624d.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/a8797b8456787c557f579c98b1a6dbd3.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/b9388568e6f932e20f9f2254a8fba12d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bb208992bedb881680edd5de6c8ba0d9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2cf5c9664ff26209d098f031783594ee.png)
public Arguments getDefaultParameters();设置可用参数及的默认值; public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作; public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值,执行多次依赖于设置方式; public void teardownTest(JavaSamplerContext arg0):测试结束时调用,只执行一次;
@Override public Arguments getDefaultParameters(){ Arguments params = new Arguments(); params.addArgument( "localPath", "1"); params.addArgument( "catePath", "9224,13901"); params.addArgument( "pn", "1"); params.addArgument( "platform", "-1"); params.addArgument( "referer", "referer"); params.addArgument( "userAgent", "userAgent"); params.addArgument( "ip", "1.1.1.1");
return params; }
@Override public void setupTest(JavaSamplerContext arg0){ results = new SampleResult(); localPath = arg0.getParameter( "localPath"); catePath = arg0.getParameter( "catePath"); pn = Integer. parseInt(arg0.getParameter("pn")); platform = Integer. parseInt(arg0.getParameter("platform")); referer = arg0.getParameter( "referer"); userAgent = arg0.getParameter( "userAgent"); ip = arg0.getParameter( "ip"); }
public SampleResult runTest(JavaSamplerContext arg0){ results = new SampleResult();//初始化记录结果 results.sampleStart();//计时开始 /*测试方法*/此处写自己的测试方法进行调用 List<MingQiInfo> mingQiInfos = scf.loadMingQiInfo( localPath, catePath, pn, platform, referer, userAgent, ip); results.sampleEnd();//计时结束 //判断测试成功与否的方法:可根据实际进行判断,此处为如果结果非空,则认为改次调用成功 if (mingQiInfos!= null) { results.setSuccessful( true); for(MingQiInfo sssInfo :mingQiInfos){ //将结果写入结果树:在jmeter的监听器-查看结果树时即可查看返回结果 resultData += String. valueOf(sssInfo.toString()); } results.setResponseData( "结果是:"+resultData ,null); results.setDataType(SampleResult. TEXT); } else { results.setSuccessful( false);//不满足判断条件则判为false,会出现在监听器-聚合报告的Error%列 } return results; }
4)、tearDownTest:测试结束后的操作(这里什么也不做)
![](https://i-blog.csdnimg.cn/blog_migrate/d064ebba7f4032dc6481c7c7f090c458.png)
![](https://i-blog.csdnimg.cn/blog_migrate/132f9b4f7999ada03d6938b71bb4c5e3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fd14d90f725c81cdb0c6f4164530019e.png)
更改内存设置,linux环境,修改jmeter.sh;windows环境,更改jmeter.bat文件,增大配置内存: set HEAP=-Xmx1024m -Xms512m -Xmn256m -Xss128k //如果值太大,则jmeter会打不开,同时会有提示;值太小则有OutOfMemory的错误 set PERM=-XX:PermSize=64m -XX:MaxPermSize=128m -XX:+CMSClassUnloadingEnabled
‘View Result Tree’-查看结果树 在debug的时候非常的好用,但是也很占内存。所以在跑性能测试的时候还是不要用的为好。
1 占用内存:本来跑30分钟不到就有OutOfMemory的错误,把 ‘View Result Tree’ 这个listener删掉后,就再也没有出现
2 影响聚合报告的结果:写结果树占用时间和资源
问题3:执行debug程序时报错
检查下jmeter是否为中文路径,如果有,统一改成英文路径
问题4:配置文件获取不到或者失败,无法初始化
注意:在写初始化方法时,注意配置文件最好写成绝对路径;写成相对路径时,需要把配置放到jmeter对应的路径下。我比较习惯用相对路径“System.getProperty("user.dir")”,就需要把配置放到/jmeter/bin里面去。
问题5:调试一个问题时,我打印了初始化日志,发现每次鼠标点击“java请求”,都会初始化4次
初始化4次的解释:4个jmeter重载的函数,runTest setupTest getArgument tearDown,每个都会去初始化一次。 每次点击"java请求"都做初始化:是因为我在定义全局变量建立tcp连接时没有定义为"public static".
修改后解决。
我定义了一个全局变量:int count; 在setupTest方法里设置“count = arg0.getParameter("count");”时提示 change type of 'count' to 'string' 解决办法:arg0.可以联想出来getIntParameter和getLongParameter用以添加不同的数据类型,count = arg0.getIntParameter("count"); 即 ok。
重写getLogger方法,如: public org.apache.log.Logger getLogger() { return super.getLogger(); }
使用:
this.getLogger().info(">>>>>>>>>> runTest() >>>>>>>>>>");这样就可以在jmeter日志里边打印出相关日志信息,见下图:
SampleResult results=new SampleResult(); results.setSampleLabel("Test2222"); results.sampleStart(); results.setSuccessful(true); results.sampleEnd();
如果没有设置results.setSuccessful() 默认执行结果是错误Error,所以这个可以更具逻辑判断来输出结果是正确或错误
SampleResult results=new SampleResult(); results.setSampleLabel("Test2222"); results.sampleStart(); results.setSuccessful(true); results.sampleEnd();
如果没有设置results.setSuccessful() 默认执行结果是错误Error,所以这个可以更具逻辑判断来输出结果是正确或错误,见下图: