今天来介绍一下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参考文档
那么根据接口文档我们整理出上传的流程:
那么流程就是上面这些了,看起来是比较简单的,但是往往实际项目中的各种数据处理和需求会使写起来就复杂的多了。
我们项目用的是阿里云服务,所以上传资源用的是标准的官方文档,由于是安卓项目,用的是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自定义脚本规定的实现类:
之后开始编写代码:
根据上面分析的接口文档,我们知道了输入是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里面是找不到的。
—-唉,今天总算是有空把一直仍在草稿箱的文章发了 !==