jmeter伪二次开发1
1.导入依赖的jar包,jar包的内容从自身所用的jmeter中获取
1.1查看自身jmeter版本跟原有jar包
1.2选择打开eclipse,创建自己的项目(可以直接file-->new-->java Project创建,也可以file-->new-->Project-->maven Project创建maven项目)
2.把需要的jar包导入到eclipse中
1.1目前是存在三种导入的方法,这里我们只说一种,其余两种可以网上找资料,选择自己创建的项目,点击Properties
1.2在出现的页面上选择java build path
1.3选择第一步需要的包
3.确定自己选择的包是否已经导入,如果未导入成功则重复第一第二步骤
4.创建一个包之后,在包下面创建一个类
5.继承jmeter必须依赖的类AbstractJavaSamplerClient
6.核对是否创建成功
7.编写简单的hello脚本
8.导出jar包
-
Jmeter会读取用户传入的数据,把数据初始化到Jmeter中。
-
调用Java请求时,jmeter会运行内部的runTest函数,调用封装的JAVA接口,获取到返回数据
-
获取到返回数据后,Jmeter可以把返回数据写入到结果树中,这样就能使用查看结果树来观察返回的数据了。
在这个过程中,JMeter内部是使用什么类来进行处理的呢?我们一起来看一下:
-
Arguments:
位于:org.apache.jmeter.config.Arguments
Jmeter初始化时,会把用户的参数数据通过Arguments类来加载到内存当中。
-
JavaSamplerContext:
位于:org.apache.jmeter.protocol.java.sampler.JavaSamplerContext
JavaSamplerContext用于向JavaSamplerClient实现提供上下文信息。比如加载Arguments中的用户数据
-
JavaSamplerClient:
这个接口定义了JavaSampler和外部Java程序之间的交互,这些程序可以由JMeter执行。任何想要作为JMeter测试执行的Java类都必须实现这个接口(直接或间接地通过AbstractJavaSamplerClient)。 JMeter将为测试中的每个用户/线程创建一个JavaSamplerClient实现实例。可以创建额外的实例供JMeter内部使用(例如,了解客户机支持哪些参数)。
当测试启动时,将在每个线程的JavaSamplerClient实例上调用setupTest()来初始化客户机。然后在测试的每次迭代中调用runTest()。最后,将调用teardownTest()来允许客户机进行任何必要的清理。
JavaSamplerClient包括以下4个函数(必须实现这4个函数)
```python void setupTest(JavaSamplerContext var1);
SampleResult runTest(JavaSamplerContext var1);
void teardownTest(JavaSamplerContext var1);
Arguments getDefaultParameters(); ```
void setupTest(JavaSamplerContext var1):
加载类时初始化调用的方法,一般获取参数,建立连接等功能写在这里。
SampleResult runTest(JavaSamplerContext var1)
实现接口调用的逻辑代码主要写在runTest函数下。一般在这里通过SampleResult类定义在Jmeter GUI界面中请求和返回结果数据。
如下图中,View Results Tree中内容,就是通过SampleResult进行定义
void teardownTest(JavaSamplerContext var1)
类运行结束时,运行这个函数下面的语句,主要用来释放资源,关闭连接等请求后的操作。
Arguments getDefaultParameters()
提供测试时支持的参数列表。一般参数的初始化放在这里进行,避免在runTest中执行。可以提高执行效率。
-
SampleResult
主要用于控制展示每次迭代的测试结果。
综上,用户数据初始化时,会初始化到Config中,由config模块的Arguments管理参数,然后我们实现的java请求会通过runTest方法调用封装的API接口,并根据返回数据在JMeter设置要展示的返回结果。
所以我们二次开发jmeter的JAVA接口请求,需要继承JavaSamplerClient接口,并实现其中的4个函数。具体怎么实现,我们接下来详细介绍。
public Arguments getDefaultParameters();设置可用参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值,执行多次依赖于设置方式;
public void teardownTest(JavaSamplerContext arg0):测试结束时调用,只执行一次;
package com.testing.jmeter;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class hashDemo extends AbstractJavaSamplerClient {
private String hashDemo=null;
private String platformId=null;
@Override
public Arguments getDefaultParameters(){
//定义一个属性对象,用来从GUI页面来接收参数
Arguments param=new Arguments();
param.addArgument("hashDemo", "需要hashCode的值");
param.addArgument("platformId", "请输入platformId");
return param;
}
/* public void setupTest(JavaSamplerContext arg0) {
//接收GUI页面传递的值,并赋值给全局变量
username=arg0.getParameter("username");
password=arg0.getParameter("password");
host=arg0.getParameter("host");
port=arg0.getParameter("port");
dbName=arg0.getParameter("dbName");
collectionName=arg0.getParameter("collectionName");
queryString=arg0.getParameter("queryString");
}
public Arguments getDefaultParameters();设置可用参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值,执行多次依赖于设置方式;
public void teardownTest(JavaSamplerContext arg0):测试结束时调用,只执行一次;
*/
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
hashDemo=arg0.getParameter("hashDemo");
platformId=arg0.getParameter("platformId");
SampleResult result=new SampleResult();
try{
result.sampleStart();
String Str = hashDemo;
result.setRequestHeaders(Str);
String Str1=Str.hashCode()+"";
int Str2=Integer.valueOf(Str1);
int Str3=Math.abs(Str2);
int platform=Integer.valueOf(platformId);
//设置响应内容
int add=(Str3+platform)%32;
result.setResponseData("hash:"+add+"test",null);
//设置响应代码为0
result.setResponseCode("0000");
//设置响应类型为text
result.setContentType(SampleResult.TEXT);
//设置响应状态为true
result.setSuccessful(true);
//设置响应信息
result.setResponseMessage("方法执行成功!");
}catch(Exception e){
e.printStackTrace();
result.setSuccessful(false);
}finally{
//表示请求结束计时
result.sampleEnd();
}
return result;
}
}
进行调试
package com.mumu.functions;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import redis.clients.jedis.Jedis;
import org.apache.jmeter.config.Arguments;
public class redisTest extends AbstractJavaSamplerClient {
private String redisIp=null;
private String redisPort=null;
private String redisPwd=null;
private String redisKey=null;
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
redisIp=arg0.getParameter("redisIp");
redisPort=arg0.getParameter("redisPort");
redisPwd=arg0.getParameter("redisPwd");
redisKey=arg0.getParameter("redisKey");
SampleResult result=new SampleResult();
result.sampleStart();
try{
Jedis jedis = new Jedis(redisIp,Integer.valueOf(redisPort));
// 3. 获取数据
jedis.auth(redisPwd);
System.out.println("链接成功");
String value = jedis.get(redisKey);
System.out.println(value);
result.setResponseData(value, SampleResult.TEXT);
result.setSuccessful(true);
// 4.释放资源
jedis.close();
}
catch(Exception e){
e.printStackTrace();
result.setSuccessful(false);
}
finally{
result.sampleEnd();
}
return result;
}
public Arguments getDefaultParameters(){
Arguments param=new Arguments();
param.addArgument("redisIp", "请输入redis的ip");
param.addArgument("redisPort","请输入redis的端口");
param.addArgument("redisPwd","请输入连接redis的密码");
param.addArgument("redisKey","请输入需要返回的redisKey");
return param;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Arguments params = new Arguments();
params.addArgument("redisIp", "123.157.23.35");//设置参数,并赋予默认值1
params.addArgument("redisPort", "6379");//设置参数,并赋予默认值2
params.addArgument("redisPwd", "yinchen11xi@9999");
params.addArgument("redisKey", "d238a236f71b11cqadddbabb480cd");
JavaSamplerContext arg0 = new JavaSamplerContext(params);
redisTest test = new redisTest();
test.setupTest(arg0);
test.runTest(arg0);
test.teardownTest(arg0);
}
}
public Arguments getDefaultParameters(); 可选,定义可用参数及默认值,获取界面的参数;
public void setupTest(JavaSamplerContext arg0); 可选,测试前执行,做一些初始化工作,类似于LR的init和Junit中的setUp();
public SampleResult runTest(JavaSamplerContext arg0); 必选,实现自定义请求,类似于LR的Action;
public void teardownTest(JavaSamplerContext arg0); 可选,测试结束时调用,类似于LR的end和Junit中的tearDown();