• 2
  • 0
分享
  • Jmeter自定义函数二次开发---函数助手
  • cusedz 2022-08-05 11:24:09 字数 3646 阅读 2714 收藏 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()这个方法。加油~

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1)保持简单但不要太简单;使其复杂,但不要太复杂这种说法似乎是一个悖论。但是,我们保证事实并非如此。保持TC的所有步骤原子性和精确性。提及具有正确顺序的步骤,并正确映射到预期结果。测试用例应该是不言自明的,易于理解。这就是我们要让它变得简单的意思。现在,使其变得复杂意味着使其与测试计划和其他TC集成。在需要时,请参阅其他TC,相关工件,GUI等。但是,以平衡的方式做到这一点。不要让测试人员在一堆文档中来回移动以完成单个测试场景。甚至不要让测试人员紧凑地记录这些TC。在编写TC时,请始终记住,您或其他人必须修改和更新这些内容。2)记录测试用例后,作为测试人员查看一次永远不要以为一旦你写了测试场景...
            0 0 2613
            分享
          • 1、背景1.1 项目背景在移动平台服务端接口测试覆盖度为零的情况下,根据服务端接口的特点,以及升级更新的速度较快等,需要开发此框架来实施服务端接口的自动化测试。1.2 接口测试接口测试属于灰盒测试范畴,通常不需要了解接口底层的实现逻辑,但需要测试人员能够使用代码的方式来调用接口。接口测试主要用例测试接口的功能以及接口返回数据的正确性。根据接口测试的复杂度接口测试分为两种。即单一接口测试,以及多接口组合功能测试。由于接口测试是通过代码调用的方式完成,而且接口测试与前端UI属于松耦合(或无耦合)因此通过自动化手段将极大提高测试效率以及回归测试的复用率。本文中提到的接口测试主要是指基于http,ht...
            13 13 3310
            分享
          •   埃隆·马斯克今天发布推文,表示计划就降低 App Store 佣金一事,和苹果首席执行官蒂姆·库克洽谈。  在一篇关于支持创作者的推文中,马斯克希望通过和库克的交流,按照 X(推特)的营收收取 30% 的佣金,而不是按照创作者的报酬收取 30% 的佣金。  马斯克在推文中表示,在前 12 个月向所有内容创建者免费开放之后,后续不向年收入低于 10 万美元(当前约 71.8 万元人民币)的创作者收取任何费用。  而针对年收入超过 10 万美元的创作者,X(推特)计划收取 10% 的佣金。  马斯克希望苹果从 10% 的佣金中再抽取 30% 的 App Store 平台佣金,而不是直接向创作者...
            0 0 796
            分享
          • 一、测试流程1.软件开发流程:需求分析—>概要设计—>详细设计—>编码开发—>测试—>维护2.测试流程为:单元测试/集成测试—>系统测试/自动化测试—>性能测试—>验收测试3.目标:3.1 制定完整且具体的测试路线和流程,为快速、高效和高质量的软件测试提供基础流程框架。3.2 最终目标是实现软件测试规范化、标准化、自动化。4.测试流程说明:5.测试需求分析测试需求是整个测试过程的基础;确定测试对象以及测试工作的范围和作用。用来确定整个测试工作(如安排时间表、测试设计等)并作为测试覆盖的基础。而且被确定的测试需求项必须是可核实的。即,它们必须有一个...
            11 11 1594
            分享
          • 要编写一个较好的测试用例就应该从用户需求入手。比如如何测试一个用户登录界面,那么我们就要考虑这个登录界面是弹出式的还是内嵌网页式的,同时对用户名和密码的长度,密码的强度(必须多少位,特殊字符,数字,大小写等等),另外对用户界面的美观是否有相关要求?所以我们试着编写一下该问题的测试用例:功能测试什么都不输入,直接点击提交按钮,看提示信息;输入正确的用户名和密码,点击提交按钮,看是否能登录成功;输入错误的用户名或者错误的密码,点击提交按钮,看提示信息;登陆成功之后能否正确的跳转到正确的页面;用户名太短或者太长时,应该怎么处理;密码太短或者太长时,应该怎么处理;用户名若含有特殊字符,字母,数字等不同...
            0 0 1826
            分享
      • 51testing软件测试圈微信