简介
1
概述
2
使用前准备
???
函数开发
1
概述
JMeter 自带函数库中,提供了丰富的函数,并被广泛使用,如__Random、__UUID 等
可以通过菜单工具-> 函数助手对话框进行测试,如下图
但,不同接口测试、性能测试项目或场景中,有着不同的特性,JMeter 自带的函数并不完全满足业务需要。
基于 JMeter 的自定义函数开发,就能满足各类特性业务的需求,在实际的测试中有着非常重要的应用
???
自定义函数
1
核心 API
自定义函数必须继承 AbstractFunction 类,并重写父类的 4 个方法
???
开发步骤
添加自定义函数,继承 AbstractFunction 类,并覆写其 4 个方法
execute 方法:添加插件逻辑
getReferenceKey 方法:返回自定义名称函数,用于在 JMeter 中调用
setParameters 方法:获取传递的参数
getArgumentDesc:返回参数描述
注意,自定义函数必须在*.functions 包下
???
示例一:开发一个简单的运算函数
package com.lemon.demo.jmeter.functions;import org.apache.jmeter.engine.util.CompoundVariable;import org.apache.jmeter.functions.AbstractFunction;import org.apache.jmeter.functions.InvalidVariableException;import org.apache.jmeter.samplers.SampleResult;import org.apache.jmeter.samplers.Sampler;import org.apache.jmeter.util.JMeterUtils;import java.util.Collection;import java.util.LinkedList;import java.util.List;/** * @Project: jmeter-functional * @Site: http://www.lemonban.com * @Forum: http://testingpai.com * @Copyright: ?2022 版权所有 湖南省零檬信息技术有限公司 * @Author: sanbao * @Create: 2022-04-11 17:52 * @Desc:算术运算函数 **/public class Operate extends AbstractFunction { //操作符 private String operate; //操作数1 private Double first; //操作数2 private Double second; /** * 函数执行逻辑,自定义函数的核心逻辑,并返回经过处理后的内容 * @param previousResult * @param currentSampler * @return * @throws InvalidVariableException */ @Override public String execute(SampleResult previousResult, Sampler currentSampler) { Double result = 0d; //算术运算 if ("+".equals(this.operate)) { result = this.first + this.second; }else if ("-".equals(this.operate)) { result = this.first - this.second; }else if ("*".equals(this.operate)) { result = this.first * this.second; }else if ("/".equals(this.operate)) { result = this.first / this.second; } return result.toString(); } /** * 设置函数接收参数值,接收JMeter界面用户传递过来的参数 * @param parameters * @throws InvalidVariableException */ @Override public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException { //检查参数个数 checkParameterCount(parameters,3,3); //获取参数 Object[] params = parameters.toArray(); //获取运算符 CompoundVariable cvOperate = (CompoundVariable) params[0]; this.operate = cvOperate.execute(); //获取操作数1 CompoundVariable cvFirst = (CompoundVariable) params[1]; this.first = Double.parseDouble(cvFirst.execute()); //获取操作数2 CompoundVariable cvSecond = (CompoundVariable) params[2]; this.second = Double.parseDouble(cvSecond.execute()); } /** * 函数名称 * @return */ @Override public String getReferenceKey() { return "__Operate"; } /** * 函数参数描述,JMeter界面显示的参数说明 * @return */ @Override public List<String> getArgumentDesc() { List<String> desc = new LinkedList<String>(); desc.add("运算符"); desc.add("操作数1"); desc.add("操作数2"); return desc; }}
???
示例二:动态生成身份证 码函数
需求:需要一个根据区域动态生成合格的身份证 码的公共函数
函数名:__IDNumber(区域名称),如__IDNumber(长沙市),将返回一个长沙的随机身份证 码
参数:区域
代码:
package com.lemon.demo.jmeter.functions;import com.lemon.demo.util.IdNumberGenerateUtil;import lombok.extern.slf4j.Slf4j;import org.apache.jmeter.engine.util.CompoundVariable;import org.apache.jmeter.functions.AbstractFunction;import org.apache.jmeter.functions.InvalidVariableException;import org.apache.jmeter.samplers.SampleResult;import org.apache.jmeter.samplers.Sampler;import java.util.ArrayList;import java.util.Collection;import java.util.LinkedList;import java.util.List;/** * @Project: jmeter-plugin * @Site: http://www.lemonban.com * @Forum: http://testingpai.com * @Copyright: ?2022 版权所有 湖南省零檬信息技术有限公司 * @Author: sanbao * @Create: 2022-04-06 16:35 * @Desc:身份证 生成函数 **/@Slf4jpublic class IDNumber extends AbstractFunction { //参数 private String area; /** * 函数执行逻辑,自定义函数的核心逻辑,并返回经过处理后的内容 * @param sampleResult * @param sampler * @return * @throws InvalidVariableException */ public String execute(SampleResult sampleResult, Sampler sampler) { //调用身份证生成逻辑 String idNumber = IdNumberGenerateUtil.generate(area); return idNumber; } /** * 设置函数接收参数值,接收JMeter界面用户传递过来的参数 * @param parameters * @throws InvalidVariableException */ public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException { //检查参数个数 checkParameterCount(parameters,0,1); //获取参数 Object[] params = parameters.toArray(); //获取区域 if(params.length>0) { CompoundVariable cvArea = (CompoundVariable) params[0]; this.area = cvArea.execute(); } } /** * 函数名称,JMeter界面函数的名称 * @return */ public String getReferenceKey() { return "__IDNumber"; } /** * 函数参数描述,JMeter界面显示的参数说明 * @return */ public List<String> getArgumentDesc() { List<String> desc = new ArrayList<String>(); desc.add("Area"); return desc; }}
???
JMeter 二次开发方向
软件测试学习资料免费获取,项目实战,电子书,面试真题等
私信“资料”免费获取
软件测试题库:包括了软件测试基础,MySQL数据库,Linux,Java自动化,Python自动化,性能测试,计算机基础,安全测试,接口测试,逻辑思维题,ISTQB,面试现场重现有单选题,多选题,判断题,简答题,提交答案即可获得答案,很快捷方便,随便注册一下就行
题库 站:
http://120.24.97.214:8380/Portal/user-login-page?rc=4
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!