基于Jmeter的Java请求的二次开发
基于Jmeter的 Java请求二次开发,需要继承AbstractJavaSamplerClient抽象类。该类的以下方法需要重写。
public Arguments getDefaultParameters(); 设置可用参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;类似于LoadRunner的Action,需要设置result.sampleStart()一个事务开始,result.sampleEnd()一个事务结束
public void teardownTest(JavaSamplerContext arg0):测试结束时调用;类似于LoadRunner的end和Junit中的tearDown()
执行的先后顺序为:
getDefaultParameters() --> setupTest(JavaSamplerContext context) --> runTest(JavaSamplerContext context) --> teardownTest(JavaSamplerContext context)
以下介绍Java请求二次开发详细过程:
1、使用IDEA创建JAVA工程
2、将JMeter的lib目录下的jar文件,全部导入。详情请参考:使用IDEA 的Java工程如何添加jar包、打jar包
3、新增类并继承AbstractJavaSamplerClient,重写方法
1)新增工具类ConvertUtils,用于字符串转换为日期的方法str2Date
package com.jmeter.help;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;
public class ConvertUtils {
public static final String DATE_FORMAT_DAY = "yyyy-MM-dd";
public static final String DATE_FORMAT_DAY_2 = "yyyy/MM/dd";
public static final String TIME_FORMAT_SEC = "HH:mm:ss";
public static final String DATE_FORMAT_SEC = "yyyy-MM-dd HH:mm:ss";
public static final String DATE_FORMAT_MSEC = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String DATE_FORMAT_MSEC_T = "yyyy-MM-dd'T'HH:mm:ss.SSS";
public static final String DATE_FORMAT_MSEC_T_Z = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
public static final String DATE_FORMAT_DAY_SIMPLE = "y/M/d";
/**
* 匹配yyyy-MM-dd
*/
private static final String DATE_REG = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$";
/**
* 匹配yyyy/MM/dd
*/
private static final String DATE_REG_2 = "^[1-9]\\d{3}/(0[1-9]|1[0-2])/(0[1-9]|[1-2][0-9]|3[0-1])$";
/**
* 匹配y/M/d
*/
private static final String DATE_REG_SIMPLE_2 = "^[1-9]\\d{3}/([1-9]|1[0-2])/([1-9]|[1-2][0-9]|3[0-1])$";
/**
* 匹配HH:mm:ss
*/
private static final String TIME_SEC_REG = "^(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d$";
/**
* 匹配yyyy-MM-dd HH:mm:ss
*/
private static final String DATE_TIME_REG = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\\s" +
"(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d$";
/**
* 匹配yyyy-MM-dd HH:mm:ss.SSS
*/
private static final String DATE_TIME_MSEC_REG = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\\s" +
"(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\.\\d{3}$";
/**
* 匹配yyyy-MM-dd'T'HH:mm:ss.SSS
*/
private static final String DATE_TIME_MSEC_T_REG = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T" +
"(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\.\\d{3}$";
/**
* 匹配yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
*/
private static final String DATE_TIME_MSEC_T_Z_REG = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T" +
"(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\.\\d{3}Z$";
/**
* <p>字符串时间转为{@link Date}类型,
* <p>支持匹配类型列表:</p>
* <p>yyyy-MM-dd</p>
* <p>yyyy/MM/dd</p>
* <p>HH:mm:ss</p>
* <p>yyyy-MM-dd HH:mm:ss</p>
* <p>yyyy-MM-dd'T'HH:mm:ss.SSS</p>
* <p>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</p>
* <p>
*
* @param strDate 时间字符串
* @return Date {@link Date}时间
* @throws ParseException 异常
*/
public Date str2Date(String strDate) throws ParseException {
strDate = strDate.trim();
SimpleDateFormat sdf = null;
if (isMatched(strDate, DATE_REG)) {
sdf = new SimpleDateFormat(DATE_FORMAT_DAY);
}
if (isMatched(strDate, DATE_REG_2)) {
sdf = new SimpleDateFormat(DATE_FORMAT_DAY_2);
}
if (isMatched(strDate, DATE_REG_SIMPLE_2)) {
sdf = new SimpleDateFormat(DATE_FORMAT_DAY_SIMPLE);
}
if (isMatched(strDate, TIME_SEC_REG)) {
sdf = new SimpleDateFormat(TIME_FORMAT_SEC);
}
if (isMatched(strDate, DATE_TIME_REG)) {
sdf = new SimpleDateFormat(DATE_FORMAT_SEC);
}
if (isMatched(strDate, DATE_TIME_MSEC_REG)) {
sdf = new SimpleDateFormat(DATE_FORMAT_MSEC);
}
if (isMatched(strDate, DATE_TIME_MSEC_T_REG)) {
sdf = new SimpleDateFormat(DATE_FORMAT_MSEC_T);
}
if (isMatched(strDate, DATE_TIME_MSEC_T_Z_REG)) {
sdf = new SimpleDateFormat(DATE_FORMAT_MSEC_T_Z);
}
if (null != sdf) {
return sdf.parse(strDate);
}else{
return null;
}
}
/**
* <p>判断内容是否匹配</p>
* @param pattern 匹配目标内容
* @param reg 正则表达式
* @return 返回boolean
*/
public static boolean isMatched(String pattern, String reg) {
Pattern compile = Pattern.compile(reg);
return compile.matcher(pattern).matches();
}
// public static void main(String[] args) throws ParseException {
// String str2="2018/6/29";
// String str3="2018-06-29 14:12:28";
//
// System.out.println(str2Date(str2));//Fri Jun 29 00:00:00 CST 2018
// System.out.println(str2Date(str3));//Fri Jun 29 14:12:28 CST 2018
//
// }
}
2)新增ConvertStr2DateTest测试类,继承AbstractJavaSamplerClient,并重写主要方法
package com.jmeter.help;
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.Date;
public class ConvertStr2DateTest extends AbstractJavaSamplerClient{
private String date;
private Date resultDate;
public Arguments getDefaultParameters(){
Arguments arguments = new Arguments();
arguments.addArgument("dateStr","");
return arguments;
}
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
try {
date = javaSamplerContext.getParameter("dateStr");
SampleResult result = new SampleResult();
result.setSampleLabel("java request");
try {
result.sampleStart();
ConvertUtils convertUtils = new ConvertUtils();
resultDate = convertUtils.str2Date(date);
if (resultDate != null && resultDate.getTime() > 0) {
result.setResponseData("字符串:"+date+"转化成日期的结果是:" + resultDate, null);
result.setDataType(SampleResult.TEXT);
}
result.setSuccessful(true);
}catch (Throwable e){
result.setSuccessful(false);
e.printStackTrace();
}finally {
result.sampleEnd();
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
4、将当前工程打成jar包,详情请参考文章:使用IDEA 的Java工程如何添加jar包、打jar包
5、将已打好的jar包添加到Jmeter的lib/ext下
![](https://img.haomeiwen.com/i1955673/0d26d4210205fa7d.png)
6、打开Jmeter,新增线程组,并添加Java请求,察看结果树
![](https://img.haomeiwen.com/i1955673/1132daa7fdea4ff0.png)
7、执行测试计划,查看结果
![](https://img.haomeiwen.com/i1955673/00d5bd9e0982d5a6.png)