一、本次实验目的

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. JVM的几个介绍

    关于jvm内存的几点 jvm在运行时分为方法区(Method Area) .虚拟机栈(VM Stack).本地方法栈(Native Method Stack).堆 (Heap).程序计数器 (Prog ...

  2. Android多线程(一)

    在Android应用的开发过程中,我们不可避免的要使用多线程,获取服务器数据.下载网络数据.遍历文件目录查找特定文件等等耗时的工作都离不开线程的知识.Android继承了Java的多线程体系,同时又实 ...

  3. Linux C/C++编程手册查阅方法

    Linux Programmer's Manual & User Commands https://www.kernel.org/doc/man-pages/ 搜索框输入epoll调用搜索引擎 ...

  4. 轻量级 Material Design 前端框架 MDUI (纯html,css,与css框架跟react vue不冲突)

    MDUI 是一个轻量级的 Material Design 前端框架,对照着 Material Design 文档进行开发,争取 1:1 实现 Material Design 中的组件. 多主题支持 M ...

  5. windows qt 使用c++ posix接口编写多线程程序(真神奇)good

    一.多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,两种类型的多任务处理:基于进程和基于线程.基于进程的多任务处理是程序的并发执行.基于线程的多任务处理 ...

  6. qt中如何用qDebug输出彩色调试信息

    原文 http://fanzhichao.blog.hexun.com/22330640_d.html 在终端输出彩色信息有点类似于html的语法,即在要输出的文字前加上转义字符. 指令格式如下\03 ...

  7. 全部的Windows消息对应值

    以下是全部的Windows消息,   对于未在MSDN上的消息的WPARAM,   LPARAM参数解释正确的给分 [已知   :0x0313,   0x01e2,   0x01e5,   0x01e ...

  8. 使用C++还是QML(QML容易使用和维护,效果好)

    本质上,Qt 是一个C++类库.在引入 QML 以前,所有的开发都是基于 C++ 的,但到了 Qt 5,QML 和 Qt Quick 成为了 Qt 的核心之一,导致很多初学者在犹豫是否还需要学习 C+ ...

  9. SPOJ130_Rent your airplane and make money_单调队列DP实现

    题意比较简单,状态转移方程也比较容易得出: f[i]=max{ f [ j ] }+p[i],(j的结束时间在i开始时间之前) 若i开始之前没有结束的j,则f[i]=p[i]; 因数据量太大(n< ...

  10. rem.js移动布局实例教程

    最近想买需要开发微站,微信公众号内嵌入的移动web,总结方法可以使用css3直接使用百分比布局,也可以使用bootstrap做响应式布局等多种方法,个人感觉看项目需要,笔者使用rem.js进行移动前端 ...