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包

 

 

 

 

 

 

 

 

  1. Jmeter会读取用户传入的数据,把数据初始化到Jmeter中。

  2. 调用Java请求时,jmeter会运行内部的runTest函数,调用封装的JAVA接口,获取到返回数据

  3. 获取到返回数据后,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();

posted @ 2020-09-25 09:50  沫笙*  阅读(214)  评论(0编辑  收藏  举报