先定义一下我说的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 放配置文件(也可放在目录外,scf.config,此时打包放入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 = 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");
}
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. valueOf(sssInfo.toString());
      }
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 = TcpProvider.getInstance().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 JavaSamplerContext(test.getDefaultParameters());
          test.setupTest(arg0);
          test.runTest(arg0);
          test.teardownTest(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 java.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对应的路径下。我比较习惯用相对路径“System.getProperty("user.dir")”,就需要把配置放到/jmeter/bin里面去。

问题5:调试一个问题时,我打印了初始化日志,发现每次鼠标点击“java请求”,都会初始化4次

初始化4次的解释:4个jmeter重载的函数,runTest setupTest getArgument tearDown,每个都会去初始化一次。
每次点击"java请求"都做初始化:是因为我在定义全局变量建立tcp连接时没有定义为"public static".
修改后解决。
问题6:非string型的变量怎么添加到参数里?
我定义了一个全局变量:int count;
在setupTest方法里设置“count = arg0.getParameter("count");”时提示
change type of 'count' to 'string'
解决办法:arg0.可以联想出来getIntParameter和getLongParameter用以添加不同的数据类型,count = arg0.getIntParameter("count"); 即 ok。

【JMeter】JMeter完成一个java请求的压测的更多相关文章

  1. 【转】JMeter完成一个java请求的压测

    JMeter完成java请求的压力测试详解以及问题总结 原文地址:http://www.cnblogs.com/zhaoxd07/p/4895224.html    作者:KK_Yolanda 这篇文 ...

  2. Jmeter性能测试实践之java请求

     前言 Apache Jmeter是开源.易用的性能测试工具,之前工作中用过几次对http请求进行性能测试,对jmeter的基本操作有一些了解.最近接到开发的对java请求进行性能测试的需求,所以需要 ...

  3. JMeter 中实现发送Java请求

    JMeter 中实现发送Java请求 1.  步骤1 新建JAVA项目 File -> New -> Java Project 如上图,填写Project Name,然后Next,打开以J ...

  4. jmeter关联、下载文件、简单压测

    关联 一.什么是关联 关联是请求与请求之间存在数据依赖关系,需要从上一个请求获取下一个请求需要回传回去的数据. 简单地说就是在测试过程中有些数据的值会经常发生变化,要获取并使用这些数据,把这个动态的信 ...

  5. 【Jmeter测试】使用Java请求进行Dubbo接口的测试

    如何构建一个Dubbo接口测试的通用框架(https://github.com/nitibu/jmeter-dubbo-test)​从上面的流程我们可以看出,测试类大致的一个结构: 使用json文件来 ...

  6. jmeter 开发自己的java请求 二次开发

    package test; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient. ...

  7. Jmeter(一)非GUI模式压测(NON-GUI模式)结果解析TPS

    非GUI模式压测(NON-GUI模式)结果解析TPS 准备工作 从脚本已录制成功之后开始进行压测 安装Jmeter拓展插件 查看 Transactions per Second https://jme ...

  8. Docker+JMeter+InfluxDB+Grafana从容器内部发起压测

    1.自由定制JMeter镜像: Dockerfile文件: FROM java:8# 基础镜像 MAINTAINER yangjianliang <526861348@qq.com># 作 ...

  9. Jmeter非GUI界面对阿里云服务器压测

    一.Jmeter非GUI界面 参数讲解 讲解:非GUI界面,压测参数讲解             -h 帮助            -n 非GUI模式            -t 指定要运行的 JMe ...

随机推荐

  1. bnuoj 4187 GCC (数论)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=4187 [题意]:如题 [题解]:取n,m的最小值进行遍历就可以了: 注意 0 1 这组测试数据 [c ...

  2. [转载]mongoDB学习笔记——存取图片(C#)

    作为一个NoSql数据库的代表,存取多媒体数据,应该是强项吧?那么,图片在mongoDB里是如何存取的呢?(其实,关系型数据库存取图片也一点问题没有,所以我看NoSql的强项不在于是否存储多媒体,而在 ...

  3. 论MOBA类游戏五号位的重要性

    观众朋友们,也许你对题目很好奇,才打开这篇文章.为什么技术圈中会出现游戏类的软文?如果时间充足,可以继续往下看. MOBA 类游戏的兴起,逐渐吞噬游戏市场,以病毒式的扩张方式肆意改变着游戏玩家内心对游 ...

  4. 我的vim配置

    之前都在虚拟机下面捣鼓Linux,有种隔靴搔痒的感觉.为了更快地熟悉Linux系统,重新安装了Ubuntu,首先就是配置vim. 下面是我的vim配置,为了方便,我在代码后添加注释说明. 1.配置C/ ...

  5. Java 另一道构造器与构造器重载的题目

    题目: 请写出以下程序的输出结果 public class ConstructorTest2 { public static void main(String[] args) { new B(&quo ...

  6. android 64位的so文件 报错

     问题解决了,原因是因为豌豆荚搞了个64位的so文件,然后其他用到so的就必须也要有64位的,把他们的64位的so文件删除了,就OK了...

  7. 启动C:\Windows\System32\logiLDA.DLL时出现问题,找不到指定模块

    环境:windows8.1专业版 问题:启动C:\Windows\System32\logiLDA.DLL时出现问题,找不到指定模块 每次开机都会弹出上图所示的信息. 经过查找是罗技鼠标驱动的问题:而 ...

  8. How to remove spaces of a string with regular expression

    left 's/^\s*//g' right 's/\s*$//g' all 's/\s+//g'

  9. 关于web会话中的session过期时间的设置

    关于web会话中的session过期时间的设置 1.操作系统: 步骤:开始——〉管理工具——〉Internet信息服务(IIS)管理器——〉网站——〉默认网站——〉右键“属性”——〉主目录——〉配置— ...

  10. 【HDOJ】4089 Activation

    1. 题目描述长度为n的等待队列,tomato处于第m个,有如下四种可能:(1)激活失败,概率为$p_1$,队列中的顺序不变:(2)连接失败,概率为$p_2$,队头玩家重新排在队尾:(3)激活成功,概 ...