在使用日常工作中时候有时候会遇到Jmeter功能无法满足我们的需求,这个时候就可以开发自定义的扩展组件来实现我们的需求。
Jmeter扩展组件有两种实现方式:
-
继承AbstractJavaSamplerClient抽象类
-
实现JavaSamplerClient接口
实现JavaSamplerClient接口需要实现setupTest、getDefaultParameters、runTest、teardownTest四个方法,而继承AbstractJavaSamplerClient只需要实现runTest即可。从AbstractJavaSamplerClient源码中可以看到他本身已经帮我们实现了其他三个方法,如下:
AbstractJavaSamplerClient实现其他三个方法
下面将演示如何实现一个简单的get请求。
1.新建一个maven工程(后面要使用maven进行打包),在pom文件中添加三个依赖,如下:
<dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>5.0</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>5.0</version>
</dependency>
<!--HttpClient依赖-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
</dependencies>
前两个是Jmeter的依赖包,版本号要和Jmeter版本一致。第三个是HttpClient包,这里使用它完成Http请求。
2.创建一个MyHttpGet类,实现JavaSamplerClient 类,如下。
public class MyHttpGet implements JavaSamplerClient {
public void setupTest(JavaSamplerContext javaSamplerContext) {
}
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
return null;
}
public void teardownTest(JavaSamplerContext javaSamplerContext) {
}
public Arguments getDefaultParameters() {
return null;
}
}
定义两个String类型参数URLNAME和DEFAULTURL用来保存Jmeter中显示的参数名称和默认参数值。
private static final String URLNAME = "URL"; //定义一个参数名称
private static final String DEFAULTURL = "http://www.baidu.com"; //定义一个默认参数
在getDefaultParameters方法中将参数名和参数值显示到Jmeter中
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument(URLNAME,DEFAULTURL); //将参数名称和默认参数添加到Jmeter参数中
return arguments;
}
在setupTest方法中获取Jmeter界面输入的参数
private String inputUrl; //定义一个inputUrl用来接收输入的url
public void setupTest(JavaSamplerContext javaSamplerContext) {
inputUrl = javaSamplerContext.getParameter(URLNAME,DEFAULTURL);
System.out.println("inputURL is:"+inputUrl); //将输入的url打印出来
}
在runTest方法中写测试逻辑
private String resultData; //定义一个字符串,用来存放响应结果
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult result = new SampleResult(); //创建要返回的结果对象
result.setSamplerData("测试地址:"+inputUrl); //设置请求体中显示的内容
HttpGet get = new HttpGet(inputUrl); //创建一个get请求
CloseableHttpClient httpClient = HttpClients.createDefault(); //创建一个httpClient对象
result.sampleStart();//标记事务开始,用来统计执行时间等信息
//发起请求,返回一个HttpResponse对象
try {
HttpResponse response = httpClient.execute(get);
//获取请求结果响应码
int statusCode = response.getStatusLine().getStatusCode();
result.setResponseCode(String.valueOf(statusCode)); //设置响应状态码
//获取响应码判断请求是否成功
if (statusCode == 200){
result.setSuccessful(true); //如果响应码是200,责判断请求成功
}
resultData = EntityUtils.toString(response.getEntity(),"UTF-8");//将响应结果保存到
} catch (IOException e) {
resultData = String.valueOf(e); //如果请求异常,将异常结果返回
e.printStackTrace(); //详细的异常会打印在启动窗口中
}
result.sampleEnd(); //标记事务结束
result.setResponseData(resultData,"UTF-8"); //将请求结果放进result中
result.setDataType(SampleResult.TEXT); //设置响应结果类型
result.setSampleLabel("自定义get请求"); //改变查看结果树中显示的名称
return result;
}
完成之后使用mvn clean package命令将项目打成jar包,打包完成后项目下会多出一个target目录,如图
然后将该目录下的jar包放到Jmeter的/lib/ext/目录下。
重新启动Jmeter,添加线程组->Java请求就可以看到我们自己写的java请求了。
再添加一个查看结果树,执行之后,如图:
图中标注了显示了SampleResult类的几个方法的作用(点击可查看大图)
我们再修改一下URL地址,请求一下http://www.qq.com,如下:
响应结果
那么,再来看一下请求失败的情况,修改请求地址为http://www.qweqweqweq.com如下:
响应结果,提示未知主机异常,因为根本就没有这个网址。
详细的错误信息可以在控制台查看
阿里云超低折扣活动再度来袭: