jmeter接口java二次开发五步走
第一步:了解jmeter处理java请求的流程
Jmeter处理请求的流程:
-
Jmeter会读取用户传入的数据,把数据初始化到Jmeter中。
-
调用Java请求时,jmeter会运行内部的runTest函数,调用封装的JAVA接口,获取到返回数据
-
获取到返回数据后,Jmeter可以把返回数据写入到结果树中,这样就能使用查看结果树来观察返回的数据了。
-
在这个过程中,JMeter内部是使用什么类来进行处理的呢?我们一起来看一下:
-
Arguments:
位于:org.apache.jmeter.config.Arguments
Jmeter初始化时,会把用户的参数数据通过Arguments类来加载到内存当中。
-
JavaSamplerContext:
位于:org.apache.jmeter.protocol.java.sampler.JavaSamplerContext
JavaSamplerContext用于向JavaSamplerClient实现提供上下文信息。比如加载Arguments中的用户数据
-
JavaSamplerClient:
这个接口定义了JavaSampler和外部Java程序之间的交互,这些程序可以由JMeter执行。任何想要作为JMeter测试执行的Java类都必须实现这个接口(直接或间接地通过AbstractJavaSamplerClient)。 JMeter将为测试中的每个用户/线程创建一个JavaSamplerClient实现实例。可以创建额外的实例供JMeter内部使用(例如,了解客户机支持哪些参数)。当测试启动时,将在每个线程的JavaSamplerClient实例上调用setupTest()来初始化客户机。然后在测试的每次迭代中调用runTest()。最后,将调用teardownTest()来允许客户机进行任何必要的清理。
-
JavaSamplerClient包括以下4个函数(必须实现这4个函数)
void setupTest(JavaSamplerContext var1);
SampleResult runTest(JavaSamplerContext var1);
void teardownTest(JavaSamplerContext var1);
Arguments getDefaultParameters();
void setupTest(JavaSamplerContext var1):
加载类时初始化调用的方法,一般获取参数,建立连接等功能写在这里。
SampleResult SrunTest(JavaSamplerContext var1)
实现接口调用的逻辑代码主要写在runTest函数下。一般在这里通过SampleResult类定义在Jmeter GUI界面 中请求和返回结果数据。
void teardownTest(JavaSamplerContext var1)
类运行结束时,运行这个函数下面的语句,主要用来释放资源,关闭连接等请求后的操作。
Arguments getDefaultParameters()
提供测试时支持的参数列表。一般参数的初始化放在这里进行,避免在runTest中执行。可以提高执行效率。
SampleResult
主要用于控制展示每次迭代的测试结果。
综上,用户数据初始化时,会初始化到Config中,由config模块的Arguments管理参数,然后我们实现的java请求会通过runTest方法调用封装的API接口,并根据返回数据在JMeter设置要展示的返回结果。所以我们二次开发jmeter的JAVA接口请求,需要继承JavaSamplerClient接口,并实现其中的4个函数。
第二步:通过实现jmeter中的接口JavaSamplerClient编写自定义JAVA接口
新建一个Maven项目
新建 如上图的几个类
package api;
import utils.HTTPRequestUtils;
import com.alibaba.fastjson.JSONObject;
//测试类测试post请求是否成功
public class IHRMLogin {
public JSONObject headers = new JSONObject();
public JSONObject login_data = new JSONObject();
public String url;
public IHRMLogin() {
url = "http://182.92.81.159/api/sys/login";
}
public String loginIHRM(String mobile, String password) {
login_data.put("mobile", mobile);
login_data.put("password", password);
headers.put("Content-Type", "application/json");
return HTTPRequestUtils.postDemo(this.url, login_data, headers);
}
public static void main(String[] args) {
IHRMLogin ihrmLogin = new IHRMLogin();
String response = ihrmLogin.loginIHRM("13800000002", "123456");
System.out.println(response);
}
}
package utils;
import com.alibaba.fastjson.JSONObject;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
//工具类,post-get方法
public class HTTPRequestUtils {
public static String getDemo(String url) {
HttpURLConnection connection = null;
InputStream inputStream = null;
BufferedReader br = null;
// 返回结果字符串
String result = null;
try {
// 创建远程url连接对象
URL url_obj = new URL(url);
// 通过远程url连接对象打开一个连接,强转成httpURLConnection类
connection = (HttpURLConnection) url_obj.openConnection();
// 设置连接方式:get
connection.setRequestMethod("GET");
// 连接服务器的超时时间:10000毫秒
connection.setConnectTimeout(10000);
// 读取返回的数据时间:30000毫秒
connection.setReadTimeout(30000);
// 发送请求
connection.connect();
// 通过connection连接,获取输入流
if (connection.getResponseCode() == 200) {
inputStream = connection.getInputStream();
// 封装输入流is,并指定字符集
br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
// 存放数据
StringBuffer stringBuffer = new StringBuffer();
String temp;
temp = null;
while (null != (temp = br.readLine())) {
stringBuffer.append(temp);
stringBuffer.append("rn");
}
result = stringBuffer.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 关闭连接
if (null != connection) {
connection.disconnect();
}
}
return result;
}
public static String postDemo(String url, JSONObject param, JSONObject headers) {
HttpURLConnection connection = null;
InputStream inputStream = null;
OutputStream outputStream = null;
BufferedReader br = null;
String result = null;
try {
URL url_obj = new URL(url);
// 通过远程url连接对象打开连接
connection = (HttpURLConnection) url_obj.openConnection();
// 连接请求方式
connection.setRequestMethod("POST");
// 设置连接主机服务器超时时间:10000毫秒
connection.setConnectTimeout(10000);
// 设置读取主机服务器返回数据超时时间:30000毫秒
connection.setReadTimeout(30000);
// 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
connection.setDoOutput(true);
// 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
connection.setDoInput(true);
// 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
if (null != headers.get("Content-Type")) {
connection.setRequestProperty("Content-Type", (String) headers.get("Content-Type"));
} else {
connection.setRequestProperty("Content-Type", "application/json");
}
// 通过连接对象获取一个输出流
outputStream = connection.getOutputStream();
// 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
outputStream.write(param.toJSONString().getBytes());
// 通过连接对象获取一个输入流,向远程读取
if (connection.getResponseCode() == 200) {
inputStream = connection.getInputStream();
// 对输入流对象进行包装:charset根据工作项目组的要求来设置
br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuffer stringBuffer = new StringBuffer();
String temp;
temp = null;
// 循环遍历一行一行读取数据
while ((temp = br.readLine()) != null) {
stringBuffer.append(temp);
stringBuffer.append("rn");
}
result = stringBuffer.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 断开与远程地址url的连接 // 关闭连接
if (null != connection) {
connection.disconnect();
}
}
return result;
}
public static void main(String[] args) {
String url = "http://182.92.81.159/api/sys/login";
JSONObject loginParams = new JSONObject();
loginParams.put("mobile", "13800000002");
loginParams.put("password", "123456");
JSONObject headers = new JSONObject();
headers.put("Content-Type", "application/json");
String result = HTTPRequestUtils.postDemo(url, loginParams, headers);
System.out.println(result);
}
}
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 api.IHRMLogin;
//实现JavaSamplerClient
public class TestIHRMLogin implements JavaSamplerClient {
private String mobile;
private String password;
@Override
public void setupTest(JavaSamplerContext javaSamplerContext) {
// 从JavaSamplerConext中读取用户传入的参数:mobile和password
this.mobile = javaSamplerContext.getParameter("mobile");
this.password = javaSamplerContext.getParameter("password");
}
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult result = new SampleResult();
IHRMLogin loginApi = new IHRMLogin();
// 获取当前线程编号
String threadName = Thread.currentThread().getName();
System.out.println(threadName);
// 设置返回结果标签的名称
result.setSampleLabel("ihrm-" + threadName);
// 在Jmeter的GUI中展示请求数据
result.setSamplerData("请求的mobile为:" + this.mobile + "n请求的密码为:"+ this.password);
// 开始事务,开始计算时间
result.sampleStart();
try {
// 调用登陆接口,并获取返回数据
String response = loginApi.loginIHRM(this.mobile, this.password);
// 把返回结果设置到SampleResult中
result.setResponseData(response, null);
// 设置返回结果的为Text类型
result.setDataType(SampleResult.TEXT);
result.setSuccessful(true);
// 输出结果到控制台
System.out.println(response);
} catch (Throwable e) {
// 如果出现异常,则判断调用失败
result.setSuccessful(false);
e.printStackTrace();
} finally {
// 结束事务,计算请求时间
result.sampleEnd();
}
return result;
}
@Override
public void teardownTest(JavaSamplerContext javaSamplerContext) {
}
@Override
public Arguments getDefaultParameters() {
// 定义Jmeter GUI中java请求的参数:目前在代码中添加了两个参数分别是mobile和password
Arguments arguments = new Arguments();
arguments.addArgument("mobile", "");
arguments.addArgument("password", "");
return arguments;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>JmeterDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
</project>
开发JavaSamplerClient 时需要进入两个jar包ApacheJmeter_code和ApacheJmeter_java,可以通过引入jar包的方式或者是添加libs的方式。
TestIHRMLogin 说明
编写代码,步骤有4步:
- 实现的JavaSamplerClient中的4个接口。
- 实现Arguments函数
- 实现setupTest
- 实现runTest,runTest是逻辑调用部分,实现调用登陆接口,获取返回数据,设置返回结果等功能
第三步:打包
maven
手动
第四步:将jar包放在jmeter 的第三方库目录
第五步:运行jmeter,添加java请求,进行测试
总结:
- 使用IDE工具IDE开发了jmeter的java请求。
- 通过jmeter对暴露的api接口JavaSamplerClient来实现编写能内嵌到jmeter的java请求。
- 封装了IHRM项目中的登陆接口
- 封装了HTTP协议中的GET请求和Post请求
- 使用IDEA构建jar包
- 使用maven的pom文件添加依赖包Json
- 使用IDEA添加了外部依赖包ApacheJmeter_code.jar和ApacheJmeter_java.jar
参考 官方KPI:https://jmeter.apache.org/api/index.html
原文地址:https://www.cnblogs.com/jojo0212/p/14312928.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。