Jmeter入门10 - Java Request

Jmeter入门10 - Java Request

当有些请求逻辑比较复杂的时候,Jmeter 中自带的sample估计就比较难实现了,或者性能就会比较低了,这个时候就可以自己写java代码实现自己的请求。
比如Socket请求,Http请求,RocketMQ请求等,只要java能实现的都可以放到jmeter里面执行。

Table of Contents

Jmeter10 - Java Request

0x00 准备:

0x01 创建Java请求类

0x02 样例代码:

0x03 测试代码

0x04 打包jar

0x05 使用

0x06 Demo项目


0x00 准备:

首先创建自己的java项目,导入Jmeter相关的包,导入请求相关的包,比如http的httpclient。
 

// Jmeter 相关的类
import org.apache.jmeter.config.Arguments;                // 请求参数
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; // 请求基类
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; // 请求上下文,可以理解为Jmeter传过来的内容
import org.apache.jmeter.samplers.SampleResult;        // 请求结果


0x01 创建Java请求类

    1. 请求类继承 AbstractJavaSamplerClient
    2. 为请求创建需要的参数,实现public Arguments getDefaultParameters() 方法
    3. 编写请求初始化方法,只执行一次,实现public void setupTest(JavaSamplerContext context) 方法
    4. 编写请求循环执行方法,执行多次,实现public SampleResult runTest(JavaSamplerContext context) 方法
    5. 编写请求结束方法,实现public void teardownTest(JavaSamplerContext context) 方法

0x02 样例代码:

    一个http请求的demo。

package com.max.javarequest;

import com.max.javarequest.core.HttpClientUtil;
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;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;


/**
 * http request sample
 * @author max.bai
 * @date 2019.02
 */
public class SleepTapHttpRequest extends AbstractJavaSamplerClient
{
	private String reqUrl;
	private String deviceid;
	private String mac;
	private String userid;

	private String payload = "requestdata";
	private HttpClient httpClient;
	private HttpPost httpPost;



	public Arguments getDefaultParameters() 
	{
		// 设置请求需要的参数,将显示在jmeter页面
		Arguments params = new Arguments();
		params.addArgument("reqUrl", "");
		params.addArgument("deviceid", "");
		params.addArgument("mac", "");
		params.addArgument("userid", "");
		return params;
	}
	
	public void setupTest(JavaSamplerContext context) 
	{
		// 初始化请求,获取请求参数
		reqUrl = context.getParameter("reqUrl");
		deviceid = context.getParameter("deviceid");
		mac = context.getParameter("mac");
		userid = context.getParameter("userid");
		
		httpClient = new DefaultHttpClient();
		httpPost = new HttpPost(reqUrl);
		httpPost.setHeader(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded; charset=utf-8");
	}


	// 请求执行体
	public SampleResult runTest(JavaSamplerContext context) 
	{
		// 创建样本     样本内容在添加观察树后会看到里面的内容
		SampleResult results = new SampleResult();
		results.sampleStart();		//开始计时
		try 
		{
			//System.out.println(payload);
			results.setSamplerData(payload);			//设置请求数据
			String res = doPost(ppayload);		// 发送http post请求
			//System.out.println(">"+res+"<");
			results.setResponseData(res, "utf-8");		//设置请求响应内容
			results.setDataType(SampleResult.TEXT);
			if("true".equals(res)){
				results.setSuccessful(true);	//设置请求结果成功
			}else{
				results.setSuccessful(false);   //设置请求结果失败
			}

		}
		catch (Exception e)
		{
			//e.printStackTrace();
			results.setSuccessful(false);
		}
		results.sampleEnd();		//计时结束  请求的响应就是开始和结束决定的
		return results;
	}


	public void teardownTest(JavaSamplerContext context) 
	{
		super.teardownTest(context);
	}

	
	/**
	 * send http post request
	 * @param reqData requests data
	 * @return response data
	 */
	private String doPost(String reqData){
		String reseContent = "";
		try {
			httpPost.setEntity(new StringEntity(reqData == null ? "" : reqData, "utf-8"));
			HttpResponse response = httpClient.execute(httpPost);
			HttpEntity entity = response.getEntity();
			if (null != entity)
			{
				reseContent = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
				EntityUtils.consume(entity);
			}
		}
		catch (Exception e)
		{
			throw new IllegalStateException(e);
		}
		return reseContent;
	}

}


0x03 测试代码

可以在项目里面创建测试代码,执行并测试,成功就可以打包放到Jmeter执行了。

package com.max.javarequest;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;

public class Test 
{
	public static void main(String[] args) 
	{

		// test http
		// 填写参数
		Arguments params = new Arguments();
		params.addArgument("reqUrl", "http://39.105.100.51:9191/ttt/bbbb");
		params.addArgument("deviceid", "1");
		params.addArgument("mac", "1CCCCCC00001");
		params.addArgument("userid", "1");
		
		// 实例化请求,并执行请求
		JavaSamplerContext context = new JavaSamplerContext(params);
		SleepTapHttpRequest sttest = new SleepTapHttpRequest();
		sttest.setupTest(context);
		for(int i=0;i<20;i++){
			sttest.runTest(context);
		}
		sttest.teardownTest(context);

	}
}

0x04 打包jar

工程打包成jar包,放到Jmeter的lib/ext/目录中,相关的比如RocketMQ的Jar也同时放到这里。

D:\tools\apache-jmeter-4.0\lib\ext


0x05 使用

在Jmeter中 add -> sampler -> Java Request
class name 中出现自己写的Java类了,选择后下面会出现类中设置的参数。
填写对应的参数执行,在结果观察树中就可以查看到请求的发送信息,响应信息,还有是否成功。

Jmeter入门10 - Java Request

0x06 Demo项目

项目中包含TCP, Http, RocketMQ请求.

https://download.****.net/download/max229max/10983455