一、背景
使用在Jmeter中,有自己的Java取样器供我们使用,但是,如果需要在我们的Java采样器引用自己的类,那么定制自己的JAVA采样器是一个不错的选择。当然我们同样也可以重写HTTP取样器的方法,这里以自定义java取样器来举例
二、步骤
1. 将需要的包添加进你java项目的build path中
需要添加进build path中的jar包为以下三个
ApacheJMeter_components.jar ApacheJMeter_core.jar ApacheJMeter_java.jar
但是,由于担心存在jar包的依赖问题,所以建议导入所有的Jmeter安装目录\lib以及\lib\ext\下的jar文件,导包步骤如下
2. 编写自定义Java取样器代码
在编写自定义Java取样器代码之前,我自定义了一个Hello类,实现简单的特定字符串打印,代码如下
package com.SelfDefined.Components; public class Hello { public String sayHello(){ return "Hello"; } public String sayHello2Person(String name){ if (name == null || name.equals("")) { name = "nobody"; } return (new StringBuilder()).append("Hello").append(name).toString(); } public int sum(int a, int b) { return a + b; } }
自定义Java取样器代码详解:
自定义java取样器,需要用到Arguments、AbstractJavaSamplerClient、JavaSamplerContext、SampleResult这四个类,也需要重写public Arguments getDefaultParameters(){}、public void setupTest(JavaSamplerContext arg0){}、public SampleResult runTest(JavaSamplerContext arg0){}、public void teardownTest(JavaSamplerContext arg0){}这些方法这些方法的作用如下:
2.1 public Arguments getDefaultParameters(){}
定义需要输入的变量及其默认值
2.2 public void setupTest(JavaSamplerContext arg0){}
定义在指定测试前所需做的工作,可以为空
2.3 public SampleResult runTest(JavaSamplerContext arg0){}
执行测试时需要执行的函数
2.4 public void teardownTest(JavaSamplerContext arg0){}
测试执行完毕后的资源清理工作
2.5 public static void main(String[] args ) {}
主函数:运行时按照主函数定义的逻辑来执行测试用例
自定义Java取样器代码
package com.SelfDefined.Components; import java.security.Policy.Parameters; import org.apache.jmeter.config.Arguments;//这个类是用来定义和访问参数的 import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;//自定义Java取样器需要继承这个类 import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;//Jmeter的上下文 import org.apache.jmeter.samplers.SampleResult;//返回结果 //需要自定义Java取样器时继承AbstractJavaSamplerClient类,如果需要重写HTTP取样器,则继承其他的类 public class MyComponents extends AbstractJavaSamplerClient{ private String a; private String b; private String resultData; //这个方法用来定义java方法的入参 //param.addArgument("num1", "");表示入参参数名为num1,默认值为空 //设置可用参数及默认值 public Arguments getDefaultParameters() { Arguments param = new Arguments(); param.addArgument("num1", ""); param.addArgument("num2", ""); return param; } // 每个线程测试前执行一次,做一些初始化工作 public void setupTest(JavaSamplerContext arg0) { } //开始测试,从arg0参数可以获得参数值 public SampleResult runTest(JavaSamplerContext arg0) { a = arg0.getParameter("num1"); b = arg0.getParameter("num2"); SampleResult sr = new SampleResult(); sr.setSampleLabel("Java请求"); try { sr.sampleStart(); Hello test = new Hello(); resultData = String.valueOf(test.sum(Integer.parseInt(a), Integer.parseInt(b))); if (resultData != null && resultData.length() > 0) { sr.setResponseData("结果是:" + resultData, null); sr.setDataType(SampleResult.TEXT); } sr.setSuccessful(true);//如果参数正确,设置返回结果为真 } catch (Throwable e) { sr.setSuccessful(false);//如果参数错误,设置返回结果为假 e.printStackTrace(); } finally { sr.sampleEnd();//Jmeter结束统计响应时间标记 } return sr; } public void teardownTest(JavaSamplerContext arg0) { } public static void main(String[] args ) { Arguments params = new Arguments(); params.addArgument("num1", "1");//获取变量num1的值,若为空取默认值1,我试了一下没啥用 params.addArgument("num2", "2"); JavaSamplerContext arg0 = new JavaSamplerContext(params);//创建Jmeter上下文 MyComponents test = new MyComponents(); test.setupTest(arg0); test.runTest(arg0); test.teardownTest(arg0); } }
3. 导出jar包
导包会有一个warning,不用管它
4. 重启Jmeter即可在Java取样器中看到我们定制的组件
5. 执行结果