一、本次实验目的

IDEA新建maven项目,使用java开发自定义jmeter的请求。

本次开发使用的代码,会百度云分享给大家。

二、本次实验环境

Idea

2017.02

Jmeter

5.1.1

三、新建maven项目

pom.xml文件中导入依赖。

 
 <dependencies>

    <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_functions -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_functions</artifactId>
<version>5.1.1</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_core -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>5.1.1</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_java -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>5.1.1</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency> </dependencies>

四、代码编写

4.1、以上一节监控的demo实现的两个接口为例,来编写实现请求的自定义请求

打开jmeter,添加javarequest如下图所示:

默认只有两个class。

4.2、新建class实现JavaSamplerClient接口

 
package com.jmeter.functions;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class CustemRequest implements JavaSamplerClient {
@Override public void setupTest(JavaSamplerContext javaSamplerContext) {
}
@Override public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
return null;
}
@Override public void teardownTest(JavaSamplerContext javaSamplerContext) {
}
@Override public Arguments getDefaultParameters() {
return null;
}
}

我们可以看到,具体会实现4个方法。

4.3、实现具体方法

启动上一节实现的应用。localhost:8086

具体实现代码如下:

 
package com.jmeter.functions;

import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult; import java.net.URISyntaxException;
import java.util.LinkedList;
import java.util.List;
import java.util.Random; public class CustemRequest implements JavaSamplerClient { //定义显示请求地址的变量名
private static final String REQUEST_RUL = "URL"; //定义默认请求的URL地址
private static final String DEFAULT_URL = "http://localhost:8086/user/get"; //用户输入的URL
private String inputUrl; //用来保存http请求的响应结果,并把结果放到jmeter的查看结果树里面
private String ResponseResult; //返回成功的状态码
private static final int SUCCESS_CODE = 200; //以下方法,打印输出的目的就是检验此4个方法的执行顺序,大家执行的时候可以后台结果详细查看
@Override
public void setupTest(JavaSamplerContext javaSamplerContext) {
System.out.println("******setupTest******");
inputUrl = javaSamplerContext.getParameter(REQUEST_RUL,DEFAULT_URL);
System.out.println("用户默认输出的URL地址------>:" + inputUrl); } /**
* 真正执行的方法
* @param javaSamplerContext
* @return
*/
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult sampleResult = new SampleResult(); Object[] param = new Object[]{"id"};
Object[] value = new Object[]{26};
List<NameValuePair> nameValuePairs = getParam(param, value);
/**
* 标记一个事务的开始
*/
sampleResult.sampleStart();
try {
ResponseResult = (String) sentGetRequest(inputUrl, nameValuePairs);
} catch (Exception e) {
e.printStackTrace();
}
sampleResult.setSampleLabel("自定义本地的请求访问");
sampleResult.setSuccessful(true); //告诉查看结果树是否成功
sampleResult.setResponseData(ResponseResult,"utf-8");
sampleResult.setDataType(SampleResult.TEXT);
return sampleResult;
} @Override
public void teardownTest(JavaSamplerContext javaSamplerContext) { } @Override
public Arguments getDefaultParameters() {
//在jmeter显示属性
Arguments arguments = new Arguments();
arguments.addArgument(REQUEST_RUL,DEFAULT_URL);
return arguments;
} //自定义实现get请求 /**
* 发送get请求
* @param url 请求URL地址
* @param nameValuePairs 请求参数
* @return JSON或者字符串
* @throws Exception
*/
public static Object sentGetRequest(String url, List<NameValuePair> nameValuePairs) throws Exception{ CloseableHttpClient client = null;
CloseableHttpResponse response = null; try {
/**
* 新建HttpClient对象
*/ client = HttpClients.createDefault(); /**
* 新建URIBuilder
*/
URIBuilder uriBuilder = new URIBuilder(url); /**
* 设置参数
*/
uriBuilder.addParameters(nameValuePairs);
/**
* 创建HttpGet
*/
HttpGet httpGet = new HttpGet(uriBuilder.build());
/**
* 设置请求头部编码
*/
httpGet.setHeader(new BasicHeader("content-Type","application/x-www-form-urlencoded; charset=utf-8"));
/**
* 请求服务
*/
response = client.execute(httpGet); int statusCode = response.getStatusLine().getStatusCode();
if (SUCCESS_CODE == statusCode){
/**
* 获取返回对象
*/
HttpEntity entity = response.getEntity();
/**
* 通过EntityUtils获取返回内容
*/
String result = EntityUtils.toString(entity,"utf-8"); return result;
}else {
System.out.println("请求失败!!!!!!");
} } catch (URISyntaxException e) {
e.printStackTrace();
}finally {
response.close();
client.close();
} return null;
} private static List<NameValuePair> getParam(Object[] params,Object[] values){
/**
* 参数简单校验合法性
*/
boolean flag = params.length>0 && values.length>0 && params.length == values.length;
if (flag){
List<NameValuePair> nameValuePairs = new LinkedList<>();
for (int i = 0 ; i<params.length; i++){
nameValuePairs.add(new BasicNameValuePair(params[i].toString(),values[i].toString()));
}
return nameValuePairs;
}else {
System.out.println("请求参数为空且参数长度不一致");
}
return null;
} public static void main(String[] args) {
Object[] param = new Object[]{"id"};
Object[] value = new Object[]{26};
final String DEFAULT_URL = "http://localhost:8086/user/get";
List<NameValuePair> nameValuePairs = getParam(param, value); try {
String o = (String) sentGetRequest(DEFAULT_URL, nameValuePairs);
System.out.println(o);
} catch (Exception e) {
e.printStackTrace();
}
}
}

4.4、maven到处jar包

    • 放到jmeter G:\apache-jmeter-5.1.1\lib\ext目录
    • 重新打开jmeter

五、总结

至此我们自定义的java的request的请求已经开发完毕。

有两个问题?后面会一一实现。

  1. 在代码中如何实现get请求中的id参数化?
  2. 在代码中如何编写post请求?

Jmeter自定义Java请求开发的更多相关文章

  1. Jmeter自定义Java请求,继承AbstractJavaSamplerClient

    首先,使用Eclipse新建一个项目,然后从Jmeter的lib/ext目录下中拷贝ApacheJMeter_java.jar和ApacheJMeter_core.jar两个文件,然后引入这两个JAR ...

  2. jmeter之java请求

    通常情况下,推荐使用jmeter之java请求编写一beashell调用java代码(上篇)(推荐)编写Java 请求 有以下优势 脚本易维护 易调试 开发脚本周期短 不过网上扩展java请求文章比较 ...

  3. Jmeter执行Java请求

    Jmeter执行Java请求(QQ交流群:577439379) 一.打开Eclipse,创建一个Java工程 二.拷贝jmeter所依赖的jar包 将jmeter中,\lib\ext目录下的Apach ...

  4. jmeter 的java请求代码在main方法里面执行

    1.新建一个java请求执行加法类 public class TestDemo { public int Tdemo(int a,int b){ int sum = 0; sum = a+b; ret ...

  5. Jmeter扩展组件开发(7) - 自定义java请求的开发

    CODE package com.demo;import org.apache.jmeter.config.Arguments;import org.apache.jmeter.protocol.ja ...

  6. jmeter之自定义java请求性能测试

    一.环境准备         1.新建一个java工程         2.导入jar包:ApacheJMeter_core.jar     ApacheJMeter_java.jar         ...

  7. 第二篇--Jmeter测试Java请求

    前提:需要准备eclipse作为开发工具,安装jdk,准备完毕,接下来开工喽! 1.新建Java工程BMIrisJNIJarTest,新建lib目录,将Jmeter安装目录下lib/ext包下的Apa ...

  8. 使用Jmeter测试java请求

    1.性能测试过程中,有时候开发想对JAVA代码进行性能测试,Jmeter是支持对Java请求进行性能测试,但是需要自己开发.打包好要测试的代码,就能在Java请求中对该java方法进行性能测试2.本文 ...

  9. 转:JMeter进行Java 请求测试

    本文转自:http://blog.csdn.net/xiazdong/article/details/7873767 向原作者致敬,看了他的文章才让我顺利解决了JMeter测试中的问题,万分感谢! 目 ...

随机推荐

  1. iOS NSString追加字符串的方法

    第一种: NSArray *array = [NSArray arrayWithObjects:@"Hello",@" ",@"world" ...

  2. HTML5离线缓存攻击测试(二)

    经过昨天的测试,发现使用离线缓存的网站会被攻击.但是,不使用离线缓存的网站就真的不会受到这样的攻击么? 据我理解,按照标准当浏览器请求manifest文件时,若没有请求到,或者文件发生改变,应当不使用 ...

  3. 正则表达式-Csharp

    原文:正则表达式-Csharp 学习笔记:正则表达式 一. 正则表达式 正则表达式(Regex)是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现. 一个正则表达式就是由普通的字符及特殊 ...

  4. PHP 的异步并行 C 扩展 Swoole

    PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...

  5. 2015新款 MacBook 用心的测评与试用. 最轻薄的Mac上市

    2015新款 MacBook 不一样的测评与试用. 最轻薄的Mac上市了. 直击现场 <HTML开发MacOSApp教程>  http://pan.baidu.com/s/1jG1Q58M ...

  6. 为什么不用C++写游戏(聪明的程序员不用C++折磨自己)(这些工作,QT都替开发者解决了,C++没有根类导致太多的问题,也没有字符串类)

    当今世界上绝大多数游戏都是C++写的,为什么要说不呢? 要做什么?写游戏. 写游戏首先要考虑些什么?做什么样的游戏,图形.音效.游戏逻辑如何实现. 用C++要先考虑什么?定义跨平台数据类型抽象,实现常 ...

  7. java基础第十三篇之Collection

    常见的几种数据结构: * 1.堆栈:先进后出 * 2.队列:先进先出 * 3.数组:查找快,增删慢 * 4.链表:查找慢,增删快  import java.util.LinkedList; /* * ...

  8. Markdown教程<2> mermaid图形绘制(1)

    Markdown教程<2> mermaid图形绘制(1) 博客园中的markdown编辑器同时支持mermaid图表引擎与tex公式引擎,可以使用mermaid直接画出流程图,时序图,甘特 ...

  9. happy machine learning(First One)

    从前几天起我就开始了愉快的机器学习,这里记录一下学习笔记,我看的是吴恩达老师的视频,这篇博客将会按吴老师的教学目录来集合各优良文章,以及部分的我的个人总结 1.  监督学习与无监督学习 监督:给定一个 ...

  10. spring 5.x 系列第8篇 —— 整合Redis客户端 Jedis和Redisson (代码配置方式)

    文章目录 一.说明 1.1 Redis 客户端说明 1.2 Redis可视化软件 1.3 项目结构说明 1.3 依赖说明 二.spring 整合 jedis 2.1 新建基本配置文件和其映射类 2.2 ...