Jmeter自定义脚本实例(以项目中阿里云上传接口为例子的需求分析以及实现)

今天来介绍一下Jmeter的Java自定义脚本功能和在项目中的实际例子,因为是实际项目,所以有的接口不可避免的屏蔽掉

背景知识:

在实际写之前,我们需要有jmeter自定义脚本的大概步骤,无非就是这几个步骤:
0.在eclpse导入两个jmeter的库,ApacheJMeter_core.jar和ApacheJMeter_java.jar
1.新建一个类,继承AbstractJavaSamplerClient,编写完成后生成jar包
2.把jar包到lib/ext目录下
3.在jmeter中生成一个java请求的取样器,然后选择第一步编写的自定义的java类

好了,步骤就是这么多了,下面我们开始具体实现

第一步:明确业务流程和阅读阿里云官方上传文档

那么这篇的文章实例是用Jmeter实现一个上传的业务接口插件

我们最终的实现效果是下面这幅图

这里写图片描述

需求的来源是项目的接口文档和上传阿里云的java sdk参考文档

那么根据接口文档我们整理出上传的流程:

  • 请求upload key
  • 上传规定的资源到服务器地址
  • 生成上传分享的url链接

那么流程就是上面这些了,看起来是比较简单的,但是往往实际项目中的各种数据处理和需求会使写起来就复杂的多了。

我们项目用的是阿里云服务,所以上传资源用的是标准的官方文档,由于是安卓项目,用的是android端的sdk,但是我们jmeter是基于java的,所以无法复用android端的封装,只能自己封装。

https://help.aliyun.com/document_detail/32013.html?spm=5176.doc32014.6.660.REFePo
在参考了阿里云的文档后,我们可以找到一个通用的写法:

OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

PutObjectRequest request = new PutObjectRequest(bucket, objectKey, file);

ossClient.putObject(request);

ossClient.shutdown();

第二步:开始编写自定义脚本

目前笔者的自定义脚本已经整合成一个java项目一个jar包,方便管理,如下图:
这里写图片描述

这个大的项目除了包含自定义脚本,也有一些自定义函数,主要是用在beanshell脚本中,比如计算目md5、获取时间这些。
图中标红的两个类是实现好的上传接口类,不做多说,真正需要的看的是jmeter自定义脚本规定的实现类:

这里写图片描述
这个类也是jmeter会去自动加载的自定义类

之后开始编写代码:
根据上面分析的接口文档,我们知道了输入是key+uploadPath+localPath这三部分:
这里写图片描述

也就是我们说的输入部分,接下来,我们需要把这几个参数传入自定义脚本,然后用阿里云的上传接口实现上传,开始阅读一下AbstractJavaSamplerClient这个类提供给我们的两个最重要的方法:

@Override
    public Arguments getDefaultParameters() {
        // TODO Auto-generated method stub
        Arguments arguments = new Arguments();
        arguments.addArgument("region", null);
        arguments.addArgument("accessKeyId", null);
        arguments.addArgument("accessKeySecret", null);
        arguments.addArgument("bucket", null);

        arguments.addArgument("objectKey_star_image", null);
        arguments.addArgument("objectKey_video_preview", null);
        arguments.addArgument("objectKey_star_little_star_image", null);
        arguments.addArgument("objectKey_star_origin_image", null);
        arguments.addArgument("objectKey_star_origin_video", null);

        arguments.addArgument("path_star_image", null);
        arguments.addArgument("path_video_preview", null);
        arguments.addArgument("path_star_little_star_image", null);
        arguments.addArgument("path_star_origin_image", null);
        arguments.addArgument("path_star_origin_video", null);
        return arguments;
    }

这是实际实现的传参代码,返回一个Arguments 对象,这个Arguments 对象可以看成是HashMap对象,返回多少个值那么就会在java取样器显示多少个输入值,当然,你也可以为key值绑定一个默认值,我这里全部都是null了,意思是要你自己写。

然后有了输入参数,我们需要读出来,这时候重要方法的第二个方法runTest就是负责读入填入的参数,并且对数据处理以及结果返回。

@Override
    public SampleResult runTest(JavaSamplerContext arg0) {
        sampleResult = new SampleResult();
        sampleResult.sampleStart();
        String region = arg0.getParameter("region");
        String accessKeyId = arg0.getParameter("accessKeyId");
        String accessKeySecret = arg0.getParameter("accessKeySecret");
        String bucket = arg0.getParameter("bucket");
        ... ...
        sampleResult.sampleEnd();
        sampleResult.setResponseData(
        path_star_image + path_video_preview + path_star_little_star_image + path_star_origin_image, null);
        // sampleResult.setResponseData(region+accessKeyId+accessKeySecret+bucket,null);
        sampleResult.setSuccessful(true);
        return sampleResult;
    }

上面的代码要注意的是几个东西,JavaSamplerContext是取样器的上下文对象,你可以通过这个对象拿到你返回Argument的自定义值,拿到之后该干嘛干嘛。
SampleResult是结果对象,你可以通过setSuccessful方法把这次测试设置为成功还是失败,也可以通过SampleResult设置code和ResponseData,作为返回码和返回值。
上面我还写了sampleResult.sampleStart();和sampleResult.sampleEnd();,代表时间统计,也就是jmeter报告里面的取样器耗时了。

最后面贴上代码:

package CustomScript;

import java.io.File;

import org.apache.commons.logging.Log;
import org.apache.jmeter.config.Argument;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

import uploader.UploadUtils;

public class UploadFiles extends AbstractJavaSamplerClient {

    SampleResult sampleResult;

    @Override
    public SampleResult runTest(JavaSamplerContext arg0) {
        // TODO Auto-generated method stub
        sampleResult = new SampleResult();
        sampleResult.sampleStart();
        String region = arg0.getParameter("region");
        String accessKeyId = arg0.getParameter("accessKeyId");
        String accessKeySecret = arg0.getParameter("accessKeySecret");
        String bucket = arg0.getParameter("bucket");

        String objectKey_star_image = arg0.getParameter("objectKey_star_image");
        String objectKey_video_preview = arg0.getParameter("objectKey_video_preview");
        String objectKey_star_little_star_image = arg0.getParameter("objectKey_star_little_star_image");
        String objectKey_star_origin_image = arg0.getParameter("objectKey_star_origin_image");
        String objectKey_star_origin_video = arg0.getParameter("objectKey_star_origin_video");

        String path_star_image = arg0.getParameter("path_star_image").toLowerCase().endsWith("jpg") ? arg0.getParameter("path_star_image")
                : null;
        String path_video_preview = arg0.getParameter("path_video_preview").toLowerCase().endsWith("jpg")
                ? arg0.getParameter("path_video_preview") : null;
        String path_star_little_star_image = arg0.getParameter("path_star_little_star_image").toLowerCase().endsWith("jpg")
                ? arg0.getParameter("path_star_little_star_image") : null;
        String path_star_origin_image = arg0.getParameter("path_star_origin_image").toLowerCase().endsWith("jpg")
                ? arg0.getParameter("path_star_origin_image") : null;
        String path_star_origin_video = arg0.getParameter("path_star_origin_video").toLowerCase().endsWith("mp4")
                ? arg0.getParameter("path_star_origin_video") : null;

        // 上传文件
        if (path_star_image != null) {
            UploadUtils.beginUpload(region, accessKeyId, accessKeySecret, bucket, objectKey_star_image,
                    new File(path_star_image));
        }

        if (path_video_preview != null) {
            UploadUtils.beginUpload(region, accessKeyId, accessKeySecret, bucket, objectKey_video_preview,
                    new File(path_video_preview));
        }

        if (path_star_little_star_image != null) {
            UploadUtils.beginUpload(region, accessKeyId, accessKeySecret, bucket, objectKey_star_little_star_image,
                    new File(path_star_little_star_image));
        }

        if (path_star_origin_image != null) {
            UploadUtils.beginUpload(region, accessKeyId, accessKeySecret, bucket, objectKey_star_origin_image,
                    new File(path_star_origin_image));
        }

        if (path_star_origin_video != null) {
            System.out.println(">>>"+objectKey_star_origin_video+"<<<"+path_star_origin_video);
            UploadUtils.beginUpload(region, accessKeyId, accessKeySecret, bucket, objectKey_star_origin_video,
                    new File(path_star_origin_video));
        }
        sampleResult.sampleEnd();
        sampleResult.setResponseData(
                path_star_image + path_video_preview + path_star_little_star_image + path_star_origin_image, null);
        // sampleResult.setResponseData(region+accessKeyId+accessKeySecret+bucket,null);
        sampleResult.setSuccessful(true);
        return sampleResult;
    }

    @Override
    public Arguments getDefaultParameters() {
        // TODO Auto-generated method stub
        Arguments arguments = new Arguments();
        arguments.addArgument("region", null);
        arguments.addArgument("accessKeyId", null);
        arguments.addArgument("accessKeySecret", null);
        arguments.addArgument("bucket", null);

        arguments.addArgument("objectKey_star_image", null);
        arguments.addArgument("objectKey_video_preview", null);
        arguments.addArgument("objectKey_star_little_star_image", null);
        arguments.addArgument("objectKey_star_origin_image", null);
        arguments.addArgument("objectKey_star_origin_video", null);

        arguments.addArgument("path_star_image", null);
        arguments.addArgument("path_video_preview", null);
        arguments.addArgument("path_star_little_star_image", null);
        arguments.addArgument("path_star_origin_image", null);
        arguments.addArgument("path_star_origin_video", null);
        return arguments;
    }

    @Override
    public void setupTest(JavaSamplerContext context) {
        // TODO Auto-generated method stub
        super.setupTest(context);
    }

    @Override
    public void teardownTest(JavaSamplerContext context) {
        // TODO Auto-generated method stub
        super.teardownTest(context);
    }

    public static void main(String[] args) {

    }

}

最后,实际运行的时候,别忘记把阿里云的依赖库导入到/lib/ext当中去,因为你导出的自定义jar包所依赖的第三方库,在jmeter里面是找不到的。
—-唉,今天总算是有空把一直仍在草稿箱的文章发了 !==

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解如何使用Jmeter自定义Java请求,并继承AbstractJavaSamplerClient类。下面是一个简单的示例: 1. 创建一个Java类并继承AbstractJavaSamplerClient类,例如: ``` public class MyJavaSampler extends AbstractJavaSamplerClient { // 实现必要的方法 } ``` 2. 实现runTest方法,这个方法会被Jmeter调用执行,例如: ``` public void runTest(JavaSamplerContext context) { // 获取参数 String arg1 = context.getParameter("arg1"); String arg2 = context.getParameter("arg2"); // 执行业务逻辑 // ... // 设置响应结果 SampleResult result = new SampleResult(); result.setSuccessful(true); result.setResponseCodeOK(); result.setResponseMessage("Success"); result.setResponseData("Response Data".getBytes()); // 设置响应时间 result.sampleEnd(); // 返回响应结果 return result; } ``` 3. 实现getDefaultParameters方法,这个方法会返回默认的参数列表,例如: ``` public Arguments getDefaultParameters() { Arguments args = new Arguments(); args.addArgument("arg1", "default value"); args.addArgument("arg2", "default value"); return args; } ``` 4. 将编译好的Java类打包成jar文件,放到Jmeter的lib/ext目录下。 5. 在Jmeter添加测试计划,并添加一个Java请求,选择刚才打包好的jar文件和类名。 6. 配置Java请求的参数,例如: ``` arg1=value1 arg2=value2 ``` 7. 运行测试计划,查看响应结果。 以上就是使用Jmeter自定义Java请求的简单示例,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值