在使用 jmeter 工具编写性能测试脚本的过程中,我们可以使用 jmeter 的函数助手,里面有已经为我们封装好的函数可以进行调用,但有些时候这些函数并不能满足我们的需求,这时候我们就可以开发自定义函数来满足我们的需求,当然也可以使用 BeanShell 等方式编写脚本来支撑,但不能持久化的应用,所以采用扩展函数的方式更灵活
一次接口压测过程中需要请求参数为 platCode+phone+secretKey 生成 md5 的值,采用自定义函数实现,继承 AbstractFunction 抽象类,定义函数参数个数、描述、处理逻辑..........,废话不多说直接上代码
org.apache.jmeter.functions
开发完成后,需要导出 jar 包,替换目录下 ApacheJMeter_functions.jar 文件
继承抽象类 AbstractFunction
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jmeter.functions;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.threads.JMeterVariables;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class MakePhone extends AbstractFunction{
private Object[] values;
private static final String KEY = "__Make_Phone";/*给自定义函数起个名字,rg:函数助手上的函数名称*/
private static final List<String> desc = new ArrayList<>();/*该ArrayList用来定义自义定函数参数输入描述*/
static {
desc.add("platCode");
desc.add("secretKey");
}
/*定义函数参数最大、最小参数范围变量*/
private static final int MIN_PARAMETER_COUNT = 2;
private static final int MAX_PARAMETER_COUNT = 2;
/*获取传递得交给execute方法执行*/
@Override
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
checkParameterCount(parameters,MIN_PARAMETER_COUNT,MAX_PARAMETER_COUNT);
values = parameters.toArray();
}
/*将定义KEY显示在函数助手*/
@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-start+1)+start);
}
@Override
public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
/* 获取函数参数*/
JMeterVariables vars = getVariables();
String platCode = ((CompoundVariable)values[0]).execute();
String secretKey = ((CompoundVariable)values[1]).execute();
/*处理逻辑*/
String[] telFirst="134,135,136,137,138,139,150,151,152,157,158,159,130,131,132,155,156,133,153".split(",");
int index=getNum(0,telFirst.length-1);
String first=telFirst[index];
String second=String.valueOf(getNum(1,888)+10000).substring(1);
String third=String.valueOf(getNum(1,9100)+10000).substring(1);
String phone = first+second+third;
/*将phone变量回写给jmeter变量,做断言使用*/
vars.put("phone",phone);
// System.out.println(phone);
/*生成加密参数*/
return DigestUtils.md5Hex(DigestUtils.md5Hex(platCode + phone + secretKey ).toUpperCase()).toUpperCase();
}
}