• 2
  • 0
分享
  • Jmeter自定义函数二次开发---函数助手
  • cusedz 2022-08-05 11:24:09 字数 3646 阅读 2538 收藏 0

需求:读取本地存放图片的地址,实现随机选取图片转化为base64图片流

问题出现的环境背景:工作中模型接口的传入为图片base64,在使用jmeter进行相关接口测试时需要有该功能函数。

开发步骤:

1、创建java项目,新建的包名称必须时org.apache.jmeter.functions,在该包下创建名为ImageToBase64的class

2、导入jmeter安装目录下的lib\ext下的ApacheJMeter_functions.jar包

3、继承AbstractFunction类,并重写其中的方法

package org.apache.jmeter.functions;

import java.util.Collection;
import java.util.List;

import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;

public class ImageToBase64 extends AbstractFunction{

    @Override
    public List<String> getArgumentDesc() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String execute(SampleResult arg0, Sampler arg1) throws InvalidVariableException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getReferenceKey() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setParameters(Collection<CompoundVariable> arg0) throws InvalidVariableException {
        // TODO Auto-generated method stub
       
    }
   
}

可以看到的是,我们需要重写的方法有四个:

    1、getArgumentDesc():函数参数描述,如果自定义函数有参数,用于返回函数参数说明

    2、execute():函数的主要执行逻辑,返回经过处理后的内容,此次返回的就是图片的base64

    3、getReferenceKey():返回自定义的函数名称。如:"__ImageToBase64"。一般的我们在创建自定义函数名称的时候以双下划线开头

    4、setParameters():设置函数接收参数值,如果自定义函数有参数,用于接收调用时传递过来的参数,注意使用时,字符串参数不要加双引号

4、开发过程

1、首先第一步是确定在Jmeter函数助手中显示的名字以及所需要的参数。

public class ImageToBase64 extends AbstractFunction {
    private static final List<String> dese = new LinkedList<>();
    private static final String KET = "__ImageToBase64";    // 函数界面显示

    static {
        dese.add("文件路径:");   // jmeter界面参数说明
    }
    
    private CompoundVariable File_path;
    public ImageToBase64(){
    }
    private Object[] values;
    
    ///
    ...
    ///
     @Override
    public String getReferenceKey() {
        return KET;
    }

    
    @Override
    public List<String> getArgumentDesc() {
        return dese;
    }

2、添加图片转base64方法

public static String imageToBase64Str(String imgFile) {
        InputStream inputStream = null;
        byte[] data = null;
        try {
            inputStream = new FileInputStream(imgFile);
            data = new byte[inputStream.available()];
            inputStream.read(data);
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 加密
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);
    }

3、重写execute,实现执行逻辑

@Override
    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {

        File_path = (CompoundVariable) values[0];
        String filepath = File_path.execute().trim();
        File dir = new File(filepath);
        String[] fileList = dir.list(); // 获取指定文件夹下文件的名字
        List<String> base64List = new ArrayList<String>();  // 可能存在bug,目前以列表存放图片地址然后随机选取列表,如果图片数量过多可能导致list过长
        for (int i = 0; i < fileList.length; i++) {
            String pic1 = filepath + "\\" + fileList[i];
            base64List.add(pic1);
        }
        int index = (int)(Math.random()*base64List.size());
        String img_path = base64List.get(index);
        System.out.println(img_path);
        String base64Str = imageToBase64Str(img_path);
        return base64Str;
    }

4、设置函数接收参数值,接收JMeter界面用户传递过来的参数

 @Override
    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
        checkParameterCount(parameters,1);   //  检查参数个数。因为本次传入参数就一个(文件地址)
        values = parameters.toArray();   // 获取参数
    }

5、打包成jar后放入jmeter安装目录下的lib\ext下,重启jmete后就能在函数助手中看到了。

6、基本思路就是这样,主要就是重写execute()这个方法。加油~

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 做完测试后,都会编写一份测试报告,测试报告中最主要的就是呈现出测试结果,哪些用例通过了,哪些用例没有通过。像postman这么强大的功能也可以自动生成报告,供我们测试同学进行查看,显得更加有B格~~~newmanNewman是一款基于nodejs开发的可以运行postman脚本的工具,使用Newman,可以直接从命令运行和测试postman集合。1、安装nodejs:选择自己系统相对应的版本内容进行下载,然后傻瓜式安装查看是否安装成功,打开cmd输入node -v2、安装newman:注意:newman必须要跟nodejs处于一个文件当中,才可以安装成功,否则会报错的npm inst...
            14 14 3861
            分享
          • 在做性能测试过程中有一件很重要的事情需要去完成,那就是分析性能指标数据,可以这样说做性能测试的整个过程都跟指标数据息息相关,下面来说一下常见的一些性能指标数据:吞吐量并发数思考时间响应时间点击数资源利用率网络吞吐量错误率系统稳定性吞吐量(Throughput):指的是单位时间内处理的客户端请求数量,直接体现软件系统的性能承载能力。通常情况下,吞吐量用“请求数/秒”或者“页面数/秒”来衡量。从业务角度来看,吞吐量也可以用“业务数/小时”、“业务数/天”、“访问人数/天”、“页面访问量/天”来衡量。从网络角度来看,还可以用“字节数/小时”、“字节数/天”等来衡量网络的流量。并发(Concurren...
            0 0 776
            分享
          •   01测试基础的重要性  假如你是一位测试新人,测试基础知识对你来讲是十分重要。我这里所指的基础知识,不简单地仅仅讲什么是软件测试、软件测试的目的,而是测试用例的设计能力。  软件测试用例的测试方法有哪些?  答:等价类、边界值、因果图等等。  需要结合实际的业务场景,来讲说较常用到的测试用例设计的方法。  答:不少回复都是以登录来做说明的。  换句话说平常工作中,较常用到的用例设计也就那样几种,假如大家能把理论好好应用到实际工作中,那么涨薪换句话说也很容易。  那么,大家怎样才能设计好的测试用例呢?  需要结合实际的业务场景设计用例十分重要,用例中并非涉及当今的功能,还需要把上下游关联的业...
            0 0 1141
            分享
          • 一、软件测试是什么测试人员验证软件的功能是否满足用户的需求验证功能是否能够正常运行补充:用户包括使用软件的人、出资的甲方(购买软件的人)、流量用户二、软件测试和软件开发的区别定义区别软件开发:用程序开发的方式把用户的需求实现成一个软件(网页,app,小程序等)软件测试:测试人员进行测试,查看该程序是否满足需求,是否运行正常难易程度软件开发:要求技能集中,专业度高软件测试:技能广泛,专业度相较于开发来说低三、软件测试和软件开发中的调试有什么区别目的不同软件调试:程序员验证软件是否实现了他自己想要让软件实现的功能软件测试:测试人员验证软件是否实现了用户的需求角色不同软件调试:开发人员软件测试:测试...
            8 8 968
            分享
          • 天猫、京东今年双11的预售时间,不约而同定在了10月24日晚8点。尽管抖音电商略显低调,没有举行特别的启动会,但暗流涌动,抖音双11好物节预售抢先于10月24日0点正式开始,且各方阵仗一点都不含糊。10月26日,《每日经济新闻》记者独家获悉相关预售数据,截至10月26日,抖音双11好物节预售累计付定金用户数为去年双11全周期的2.6倍;累计动销商品数为去年双11全周期4.7倍;累计动销商家数为去年双11全周期3.8倍。与此同时,消费电子家居生活定金订单总金额超去年双11全周期总金额;手机、大家电对比21年双11全周期预售额翻倍增长,爆发超100个百万单品。据了解,今年双11前,与天猫、京东一样...
            0 0 698
            分享
      • 51testing软件测试圈微信