【JMeter】JMeter完成⼀个java请求的压测
先定义⼀下我说的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、查看结果树,进⾏测试;
⼀创建java⼯程并实现JavaSamplerClient的重写
1新建⼀个Maven项⽬:File->new->Other->Maven Project
2  Next->Creat a simple project,使⽤Defaut路径->Next->Enter a group id for the artifact->填⼊Group Id 与package,此处与需要测试的RemoteService保持⼀致
3  在Eclipse下导⼊$\jmeter\lib\ext\下的所有jar包;导⼊额外的5个jar包,在$\jmeter\lib\ 下
4  创建对应的Source Folder:src/main/java 和 src/main/resource
src/main/java  编写代码
src/main/resource 放配置⽂件(也可放在⽬录外,fig,此时打包放⼊jmeter使⽤时,配置⽂件在bin⽬录下,独⽴开来的)
成品图如下
or
5、创建class: JMeterSCFTest  将新建的类extends AbstractJavaSamplerClient 类。
继承"getDefaultParameters","setupTest","runTest"和"teardownTest"四个⽅法
public Arguments getDefaultParameters();设置可⽤参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执⾏⼀次,做⼀些初始化⼯作;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;
public void teardownTest(JavaSamplerContext arg0):测试结束时调⽤;
⼏个⽅法都是什么意思呢:
1)、getDefaultParameters: 获取默认参数以及参数值
@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;
}
2)、setupTest:测试⽅法运⾏之前的⼯作(初始化记录结果;从参数列表中获取对应变)
@Override
public void setupTest(JavaSamplerContext arg0){
results = new SampleResult();
localPath = Parameter( "localPath");
catePath = Parameter( "catePath");
pn = Integer. Parameter("pn"));
platform = Integer. Parameter("platform"));
referer = Parameter( "referer");
userAgent = Parameter( "userAgent");
ip = Parameter( "ip");
}
3)、runTest:运⾏测试⽅法(初始化记录结果,设定开始/结束记录时间,测试调⽤Service的主⽅法,测试成功与否的判断⽅法)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. String());
      }
results.setResponseData( "结果是:"+resultData ,null);
results.setDataType(SampleResult. TEXT);
}
else {
results.setSuccessful( false);//不满⾜判断条件则判为false,会出现在-聚合报告的Error%列
}
return results;
}
4)、tearDownTest:测试结束后的操作(这⾥什么也不做)
5)、其他参数:
/
/定义全局变量
private String resultData ; //写⼊结果树时使⽤
private SampleResult results;
public BrandMingQiTopService scf = Instance().BMQSCF;  //调⽤remoteService的⽅法
//提供给jmeter的对外参数,可修改
String localPath;
String catePath;
int pn ;
int platform ;
String referer;
String userAgent;
String ip;
⼆、打包,导出
1、右键点击项⽬:Export…
2、选择Java -> Runnable JAR file
3、在Launch configuration选择debug –【项⽬名称】
PS1:如果没有该选项可选:则执⾏⼀遍Run As-> Java Application 就有了。
PS2:如果没有main⽅法不能Run那么写⼀个和MySampleTest同级的class 放⼀个main函数进去调⽤⼀下刚刚写的MySampleTest这个类。然后Run As -> Java Application 就好了,
public class debug {
public static void main(String[] args) {
jmtertest test = new jmtertest();
JavaSamplerContext arg0 = new DefaultParameters());
test.setupTest(arg0);
test.runTest(arg0);
System. exit(0);
}
4、export后的jar包放在$/jmeter/lib/ext/下
四、运⾏Jmeter
1、在$\jmeter\bin\下执⾏jmeter.bat
2、右键点击“测试计划”添加⼀个Thread Group(线程组)
3、右键点击线程组,添加⼀个Java Request
4、点击该Java Request,可以看到之前我们新建的类MySampleTest
5、设定参数,双击可修改
6、右键线程组,添加⼀个聚合报告
7、Ctrl+R运⾏测试计划,在聚合报告查看性能。
五可能出现的问题:
问题1:启动jmeter内存溢出:提⽰ An error occurred: PermGen space
Uncaught Exception .lang.OutOfMemoryError: PermGen space. See log file for details.
更改内存设置,linux环境,修改jmeter.sh;windows环境,更改jmeter.bat⽂件,增⼤配置内存:
set HEAP=-Xmx1024m -Xms512m -Xmn256m -Xss128k //如果值太⼤,则jmeter会打不开,同时会有提⽰;值太⼩则有OutOfMemory的错误
set PERM=-XX:PermSize=64m -XX:MaxPermSize=128m -XX:+CMSClassUnloadingEnabled
问题2:添加了聚合报告/查看结果树两个,测试结果特别不稳定。
‘View Result Tree’-查看结果树在debug的时候⾮常的好⽤,但是也很占内存。所以在跑性能测试的时候还是不要⽤的为好。
1 占⽤内存:本来跑30分钟不到就有OutOfMemory的错误,把 ‘View Result Tree’ 这个listener删掉后,就再也没有出现
2 影响聚合报告的结果:写结果树占⽤时间和资源
问题3:执⾏debug程序时报错
检查下jmeter是否为中⽂路径,如果有,统⼀改成英⽂路径
问题4:配置⽂件获取不到或者失败,⽆法初始化
注意:在写初始化⽅法时,注意配置⽂件最好写成绝对路径;写成相对路径时,需要把配置放到jmeter对应的路径下。我⽐较习惯⽤相对路径“Property("user.dir")”,就需要把配置放到/jmeter/bin⾥⾯去。问题5:调试⼀个问题时,我打印了初始化⽇志,发现每次⿏标点击“java请求”,都会初始化4次
初始化4次的解释:4个jmeter重载的函数,runTest setupTest getArgument tearDown,每个都会去初始化⼀次。
每次点击"java请求"都做初始化:是因为我在定义全局变量建⽴tcp连接时没有定义为"public static".
java valueof
修改后解决。
问题6:⾮string型的变量怎么添加到参数⾥?
我定义了⼀个全局变量:int count;
在setupTest⽅法⾥设置“count = Parameter("count");”时提⽰
change type of 'count' to 'string'
解决办法:arg0.可以联想出来getIntParameter和getLongParameter⽤以添加不同的数据类型,count = IntParameter("count"); 即 ok。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。