Jmeter二次开发——自定义函数
在之前的博文中,Jmeter二次开发——基于Java请求,已介绍了Jmeter二次开发的基础情况,上次分享的是java请求开发,今天来分享下Jmeter中的函数开发。聊到Jmeter的函数,知道Jmeter使用的博友肯定很熟悉。Jmeter自带一个函数库,有很多的函数,比如:__P,__Random,函数助手给我们提供了很多的方便之处。函数助手使用如下所示:

但有些时候,自带的函数满足不了真实的测试场景,比如:生成随机手机号。常规做法,应该是设定手机号区号的固定值,再通过__Random函数生成8位随机数,从而拼接成一个手机号,这样的做法的确可以满足,但要想手机号的区段也是随机的呢,是不是就不太好处理了。那就用函数二次开发试试。
函数二次开发
创建以functions结尾的包
这个是特别需要注意点,以.functions结尾,正常创建包即可。
类继承AbstractFunction
二次开发时,新建的类,需要继承AbstractFunction,这个也是需要注意的。至于为什么需要继承AbstractFunction,看源码就能明白,源码如下所示:
public abstract class AbstractFunction implements Function {
public AbstractFunction() {
}
public abstract String execute(SampleResult var1, Sampler var2) throws InvalidVariableException;
public String execute() throws InvalidVariableException {
JMeterContext context = JMeterContextService.getContext();
SampleResult previousResult = context.getPreviousResult();
Sampler currentSampler = context.getCurrentSampler();
return this.execute(previousResult, currentSampler);
}
public abstract void setParameters(Collection<CompoundVariable> var1) throws InvalidVariableException;
public abstract String getReferenceKey();
protected JMeterVariables getVariables() {
return JMeterContextService.getContext().getVariables();
}
protected void checkParameterCount(Collection<CompoundVariable> parameters, int min, int max) throws InvalidVariableException {
int num = parameters.size();
if (num > max || num < min) {
throw new InvalidVariableException(this.getReferenceKey() + " called with wrong number of parameters. Actual: " + num + (min == max ? ". Expected: " + min + "." : ". Expected: >= " + min + " and <= " + max));
}
}
protected void checkParameterCount(Collection<CompoundVariable> parameters, int count) throws InvalidVariableException {
int num = parameters.size();
if (num != count) {
throw new InvalidVariableException(this.getReferenceKey() + " called with wrong number of parameters. Actual: " + num + ". Expected: " + count + ".");
}
}
protected void checkMinParameterCount(Collection<CompoundVariable> parameters, int minimum) throws InvalidVariableException {
int num = parameters.size();
if (num < minimum) {
throw new InvalidVariableException(this.getReferenceKey() + " called with wrong number of parameters. Actual: " + num + ". Expected at least: " + minimum + ".");
}
}
protected final void addVariableValue(String value, CompoundVariable[] values, int index) {
if (values.length > index) {
String variableName = values[index].execute().trim();
if (StringUtils.isNotEmpty(variableName)) {
JMeterVariables vars = this.getVariables();
if (vars != null) {
vars.put(variableName, value);
}
}
}
}
}
参数解释
getArgumentDesc()
获取界面所要显示的参数说明
execute()
函数的主体业务
getReferenceKey()
获取函数的名称
setParameters()
设置参数,接收用户传递的参数
checkParameterCount()
检测参数数量是否准确
函数开发
获取函数的名称
名称自定义,如下所示:
private static final String key = "__XXX";
这里需要注意的是:函数开头是以2个下划线开头。
名称定义好了,那如何获取呢?就用我们刚才说的方法获取即可,如下所示:
@Override
public String getReferenceKey() {
return key;
}
获取界面所要显示的参数说明
在Jmeter的函数助手中,对应函数都有对应的参数说明,如下所示:

那如何配置能实现呢?代码如下:
private final static List<String> args = new LinkedList<String>();
static{
args.add("界面参数");
}
如果有多个参数怎么办?多个参数,多个args.add即可
获取参数名称,同样用刚才介绍的方法获取即可,如下所示:
@Override
public List<String> getArgumentDesc() {
return args;
}
获取参数值
@Override
public void setParameters(Collection<CompoundVariable> args0) throws InvalidVariableException {
//检测用户调用函数时,检查参数个数,个数不对则报错
checkParameterCount(args0,3);
Object[] params = args0.toArray();
//转换只为string
telNum = ((CompoundVariable)params[0]).execute();
start = ((CompoundVariable)params[1]).execute();
end = ((CompoundVariable)params[2]).execute();
}
获取参数值中,可以检测函数的入参个数是否准确,不准确则会报错,报错信息如下所示:

函数的主体业务
介绍到这,就是函数的核心内容了,该函数要实现什么功能,就是在该方法中处理,示例代码如下所示:
@Override
public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
SampleResult sampleResult1 = new SampleResult();
try {
sampleResult1.sampleStart();
int index=getNum(0,telFirst.length-1);
String telNum = telFirst[index];
String two = String.valueOf(getNum(1, 888) + 10000).substring(1);
String three = String.valueOf(getNum(1, 9100) + 10000).substring(1);
tel = telNum + two + three;
logger.info("手机号区段:"+ telNum +" 随机生成的手机号是:" + tel);
if (varName != null) {
JMeterVariables vars = getVariables();
final String varTrim = varName.execute().trim();
if (vars != null && varTrim.length() > 0) {
vars.put(varTrim, telNum);
}
}
sampleResult1.setResponseData("手机号区段:"+ telNum +" 随机生成的手机号是:" + tel,"utf-8");
sampleResult1.setSuccessful(true);
}catch (Exception e){
sampleResult.setSuccessful(false);
e.printStackTrace();
}finally {
sampleResult1.sampleEnd();
}
return tel;
}
代码调试
写到这里,基本完成了,但还是得测试下,功能是否正常,如果先打jar包,丢到Jmeter中,发现有bug的话,来来回回处理,就折腾了,所以还是需要先测试下的。
在test下新建测试类,示例代码如下所示:
import org.junit.Test;
public class Function_Test {
@Test
public void phoneTest() throws Exception {
RandomPhoneJmeterFunctions randomPhone= new RandomPhoneJmeterFunctions();
String phoneString = randomPhone.execute();
System.out.println("随机手机号:" + phoneString);
}
}
测试代码很简单,运行测试类,没有报错并打印出手机号,则说明没有问题。运行后的结果如下所示:

生成jar包
生成jar包就不重复讲了,可以看以前的博文,IDEA的基本操作——导入导出jar包
Jmeter中使用
代码写好后,自然是要在jmeter中验证下功能的,我们将生成的jar包放到jmeter的\lib\ext文件夹下,如果jmeter已启用,则需要重启哦,不然不会生效。
打开jmeter后,使用函数助手,看新开发的函数是否有展示,如下所示:

生成函数变量,操作如下所示:

新建线程组,并添加http请求,验证码生成的手机号是不是随机的,运行后,查看结果树,如下所示:

也可以通过日志查看,开发的时候,加了响应日志,如下所示:

到此,就说明功能没问题了。函数开发按上述步骤就可以完成,遇到不满足测试场景的时候,就可以自己diy一个了。
最后附上完整代码,如下所示:
private static Logger logger = LogManager.getLogger(RandomPhoneJmeterFunctions.class.getName());
private String tel;
//定义函数名称
private static final String KEY = "__RandomPhone";
//定义函数界面显示的参数名称
private static final List<String> desc = new LinkedList<String>();
static{
desc.add("界面参数");
}
private static final String[] telFirst = "134,135,136,137,138,139,150,151,152,157,158,159,130,131,132,155,156,133,153 ".split(",");
private CompoundVariable varName;
//业务主逻辑
@Override
public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
SampleResult sampleResult1 = new SampleResult();
try {
sampleResult1.sampleStart();
int index=getNum(0,telFirst.length-1);
String telNum = telFirst[index];
String two = String.valueOf(getNum(1, 888) + 10000).substring(1);
String three = String.valueOf(getNum(1, 9100) + 10000).substring(1);
tel = telNum + two + three;
logger.info("手机号区段:"+ telNum +" 随机生成的手机号是:" + tel);
if (varName != null) {
JMeterVariables vars = getVariables();
final String varTrim = varName.execute().trim();
if (vars != null && varTrim.length() > 0) {
vars.put(varTrim, telNum);
}
}
sampleResult1.setResponseData("手机号区段:"+ telNum +" 随机生成的手机号是:" + tel,"utf-8");
sampleResult1.setSuccessful(true);
}catch (Exception e){
sampleResult.setSuccessful(false);
e.printStackTrace();
}finally {
sampleResult1.sampleEnd();
}
return tel;
}
//获取参数值
@Override
public void setParameters(Collection<CompoundVariable> args0) throws InvalidVariableException {
//检测用户调用函数时,检测参数个数
checkParameterCount(args0,1);
Object[] params = args0.toArray();
if (params.length > 0) {
varName = (CompoundVariable) params[0];
} else {
varName = null;
}
}
//获取函数的名称
@Override
public String getReferenceKey() {
return KEY;
}
//获取界面所要显示的参数说明
@Override
public List<String> getArgumentDesc() {
return desc;
}
private static int getNum(int start,int end)
{
return (int)(Math.random()*(end-1));
}
Jmeter二次开发——自定义函数的更多相关文章
- JMeter二次开发(2)-编写 JSON Assertion 插件
本篇文章主要介绍如何对JMeter进行二次开发,添加自己所需的功能.这里以Json验证为例进行说明.在web接口测试过程中,JSON的应用已经非常普遍,但原声的JMeter并没有提供Json及Json ...
- JMeter二次开发(1)-eclipse环境配置及源码编译
1.下载src并解压 http://jmeter.apache.org/download_jmeter.cgi 2.获取所需jar包,编译 ant download_jars ant instal ...
- Jmeter二次开发
Jmater函数扩展的步骤1. 导入Jmeter源码,或使用maven项目,引入依赖的jar包 2. 继承AbstractFunction,实现自定义Function 3. 继承JMeterTestC ...
- 性能测试基础---jmeter二次开发
·Jmeter的二次开发,常见的有以下几种类型: ·扩展.修改Jmeter已有的组件(源代码) ·扩展.修改Jmeter已有的函数. ·完全自主开发一个新的组件(依赖于Jmeter提供的框架). ·扩 ...
- Jmeter二次开发——基于Java请求
简述 这近几年,越来越多非http的协议需要进行性能测试,包括不仅限于各类rpc.mq.缓存等.对于这些协议,市面上可能没有现成的工具可以直接使用,这个时候,我们可以自己动手,通过编写相应的JavaS ...
- jmeter 二次开发
基于jmeter的java请求的二次开发 常用的方法: ①.addArgument("name", "value") 定义参数 ②.sampleStart ...
- NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突【转载】
文章出自https://blog.csdn.net/qq_41843732/article/details/91422764 在UG二次开发中,若使用MFC库,一旦加上#include<Afx. ...
- Jmeter二次开发实现自定义functions函数(九)
在Jmeter->选项->函数助手对话框中我们可以看到Jmeter内置的一些常用函数,但考虑到测试过程中的实际情况,我们经常需要在脚本引用或者实现自定义的函数.那么如何在"函数助 ...
- jmeter 二次开发---实现自定义函数插件
1.前提: 有时候,Jmeter自带的函数,可能不能满足于业务的需求,这时候,我们可以自己写一个函数插件: 2.创建maven工程 一直next,输入GroupID,ArtifactId->fi ...
随机推荐
- springmvc中ModelAttribute注解应用在参数中
可以用@ModelAttribute来注解方法参数或方法.带@ModelAttribute创建的参数对象会被添加到Model对象中.注解在参数上时,可以从Form表单或URL参数中获取参数并绑定到mo ...
- 仵航说 前后端分离,文件上传下载(springBoot+vue+elementUI)仵老大
1.介绍 本文主要是介绍前后端分离的上传下载,后端使用的是SpringBoot,持久层用的是mybatis-plus,前端用的Vue,UI用的elementUI,测试了一下,文本,图片,excel ...
- 【剑指offer】01 二维数组中的查找
题目地址:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照 ...
- HTC Vive使用WebVR的方法以及启用后头显无画面的解决方法
1.下载支持WebVR的浏览器. 笔者使用的是HTC Vive,故下载了Firefox的Nightly版本[下载地址]. 2.Nightly 开启WebVR的步骤[引用自Mozilla VR] 1.从 ...
- IIS添加应用程序和虚拟目录
右键添加应用程序 别名就是虚拟路径 比如本来路径是http://localhost:44336/main.html 别名为 qwer 那么就可以访问http://localhost:4433 ...
- “体检医生”黑科技|让AI开发更精准,ModelArts更新模型诊断功能
摘要:华为云AI开发平台ModelArts黑科技加持AI研发,让模型开发更高效.更简单,降低AI在行业的落地门槛.全面的可视化评估以及智能诊断功能,使得开发者可以直观了解模型各方面性能,从而进行针对性 ...
- 我的 2020:出书、办签售会、发展 VS Code 中文社区、成为开源先锋、全网 10 万粉丝、10 场演讲、内推 21 人、955.WLB 发扬光大
感觉写 2019 年终总结还是在不久之前.转眼间,2020 已经接近尾声了.是时候来写写 2020 年的年终总结了. 出书 今年最高兴的事情之一,就是出了全球首本 VS Code 中文书 -- < ...
- Mac付费软件免费获取
很简单,充分利用微信公众号和某宝即可 1.微信公众号里面会分享"XX软件下载"或破解教程只要打开微信搜索就可以搜到. 顺便推荐几个公众号"GameRoom".& ...
- jsonp详解及跨域请求
什么是JSONP? JSON是一种轻量级的数据传输格式语言,被广泛应用于当前Web应用中.JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数 ...
- 循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志
在一个系统的权限管理模块中,一般都需要跟踪一些具体的日志,ABP框架的系统的日志管理,包括登录日志.接口访问日志.实体变化历史日志,本篇随笔介绍ABP框架中这些日志的管理和界面处理. 1.系统登录日志 ...