设为首页 收藏本站
查看: 2152|回复: 0

[经验分享] 如何为Apache JMeter开发插件(二)—第一个JMeter插件

[复制链接]

尚未签到

发表于 2017-12-25 12:32:09 | 显示全部楼层 |阅读模式
  文章内容转载于:http://lib.csdn.net/article/softwaretest/25700,并且加上个人一些截图
  本篇将开启为JMeter开发插件之旅,我们选择以Function(函数)组件作为插件开发的入手对象,在前面的章节我们将其划分为非GUI组件,选择它的理由不仅仅是因为Function插件在开发方面是极简的,而且在实际运用JMeter执行测试时,对于Function组件的应用会极大的为你的测试带来便利,有些甚至是必不可少的。

什么是Function组件?
  我们还是有必要对Function组件的功能进行一下简单的回顾:
DSC0000.jpg

  通过打开函数助手,我们可以通过下拉菜单,查看JMeter为我们默认提供的一系列实用的函数功能,使用函数非常简单,比如”__UUID”函数,功能是生成一个uuid,在后面的输入框中只需输入”${__UUID}”便可以引入调用该函数方法所返回的uuid值,所有的组件都可以对函数组件进行引入。
  插件开发方法有两种!
  第一种:直接在jmeter官网下载 jmeter开源包,在源码里面新加函数,然后导出jar!
  第二种:不需要下载源码,直接导入jmeter相应的jar包,即可立即开发!看官方文档,也是推荐使用第二种方法,下面都是以第二种方法为例。

一个用于测试的Sampler插件
  在此处我们首先可以开发一个专门用于测试函数或自定义变量输出的Sampler(原来它才是我们所开发的第一个插件),我们叫它TestSampler,开发方式是分离法,分为逻辑控制部分TestSampler和GUI部分TestSamplerGUI:
  1、首先创建Java工程,File>New>Project,选择未maven工程,next>命名为TestSampler>next
DSC0001.png

DSC0002.png

DSC0003.png

DSC0004.png

  2、先在Java工程中引入主要的JMeter插件开发jar包,如何引入jar包可参考IntelliJ>  对应包可以取jmeter安装目录:apache-jmeter-2.13\lib\ext
DSC0005.jpg

DSC0006.png

  3. TestSampler类代码参考如下:
  

public>

  
public final static String FUNCTION = "function";
  
@Override
  
public SampleResult sample(Entry entry) {
  
// TODO Auto-generated method stub
  
SampleResult res = new SampleResult();
  
res.sampleStart();
  
System.out.println(this.getProperty(FUNCTION));//输出GUI界面所输入的函数方法返回结果
  
res.sampleEnd();
  
res.setSuccessful(true);
  
return res;
  
}
  
}
DSC0007.png

  

  
  我们在之前的章节简单介绍了Sampler的主要实现方法,通过重写sample方法,实现执行一次抽样方法,我们在此处输出”function”属性所对应的值,即输出GUI界面所引入的函数方法返回结果。
  4. TestSamplerGUI类代码参考如下:
  

public>
private JTextField functionTextField = null;  
public TestSamplerGUI(){
  
init();
  
}
  

  
@Override
  
public void configure(TestElement element) {
  

  
super.configure(element);
  
functionTextField.setText(element.getPropertyAsString(TestSampler.FUNCTION));
  
}
  

  
private void init() {
  

  
JPanel mainPanel = new JPanel(new GridBagLayout());
  
functionTextField = new JTextField(20);
  
mainPanel.add(functionTextField);
  
add(mainPanel);
  
}
  

  
@Override
  
public TestElement createTestElement() {//创建所对应的Sampler
  
// TODO Auto-generated method stub
  

  
TestElement sampler = new TestSampler();
  
modifyTestElement(sampler);
  
return sampler;
  
}
  

  
@Override
  
public String getLabelResource() {
  
// TODO Auto-generated method stub
  
return this.getClass().getSimpleName();
  
}
  

  
@Override
  
public void modifyTestElement(TestElement sampler) {
  

  
// TODO Auto-generated method stub
  
super.configureTestElement(sampler);
  
if (sampler instanceof TestSampler) {
  
TestSampler testSmpler = (TestSampler) sampler;
  
testSmpler.setProperty(TestSampler.FUNCTION, functionTextField.getText());      }
  

  
}
  

  
@Override
  
public String getStaticLabel() {//设置显示名称
  
// TODO Auto-generated method stub
  
return "TestSampler";
  
}
  

  
private void initFields(){
  
functionTextField.setText("");
  
}
  

  
@Override
  
public void clearGui() {
  
super.clearGui();
  
initFields();
  
}
  

  
}
  

  我们主要的目的是通过modifyTestElement方法将functionTextField输入框中所输入的值赋给TestSampler对象的function属性。
DSC0008.png


  5、通过上面的简单代码完成了测试用的Sampler,把java工程打包为jar包,如何打包可参考IntelliJ>
DSC0009.png

DSC00010.png

  6、把上一个步骤打的包插入JMeter框架,即把TestSampler.jar放到jmeter包路径下,例D:\apache-jmeter-2.13\lib\ext下
DSC00011.png


  7、若jmeter在上一个步骤时打开,重启jmeter,在测试计划下add directory or .jar to>
DSC00012.png

   DSC00013.jpg
  在线程组下添加该Sampler,并输入被测试函数,运行该测试计划,可以看到控制台输出:
DSC00014.png

  OK,和我们的意图一致,输出了__UUID函数运行后所返回的结果。
  有了测试用的Sampler后,就可以开发拥有自己功能的Function插件了。

Function插件开发案例
  1、重新创建工程,工程名为Factorial。现在可以写一个计算阶乘的Function,将其命名为Factorial,主要代码参考如下(打包在如*.jmeter.functions下):
  

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

  
import org.apache.jmeter.engine.util.CompoundVariable;
  
import org.apache.jmeter.functions.AbstractFunction;
  
import org.apache.jmeter.functions.InvalidVariableException;
  
import org.apache.jmeter.samplers.SampleResult;
  
import org.apache.jmeter.samplers.Sampler;
  
import org.apache.jmeter.util.JMeterUtils;
  
import org.apache.jorphan.logging.LoggingManager;
  
import org.apache.log.Logger;
  


  
public>  

  
private static final Logger log = LoggingManager.getLoggerForClass();
  
private static final List<String> desc = new LinkedList<String>();
  
private static final String KEY = "__factorial";
  
private Object[] values = null;
  

  
static {
  
desc.add("factorial_value");
  
}
  
//描述参数
  
@Override
  
public List<String> getArgumentDesc() {
  
// TODO Auto-generated method stub
  
return desc;
  
}
  
//函数执行,返回结果
  
@Override
  
public String execute(SampleResult previousResult, Sampler currentSampler)
  
throws InvalidVariableException {
  
// TODO Auto-generated method stub
  
String numberString = ((CompoundVariable) values[0]).execute().trim();
  
int num;
  
try{
  
num = Integer.valueOf(numberString);
  
} catch (Exception e){
  
return null;
  
}
  

  
return String.valueOf(factorial(num));
  
}
  
//获取函数引用关键字
  
@Override
  
public String getReferenceKey() {
  
// TODO Auto-generated method stub
  
return KEY;
  
}
  
//设置参数
  
@Override
  
public void setParameters(Collection<CompoundVariable> parameters)
  
throws InvalidVariableException {
  
// TODO Auto-generated method stub
  
//可以检查参数数量,主要包括以下两种方法
  
checkMinParameterCount(parameters, 1);
  
checkParameterCount(parameters, 1, 1);
  
values = parameters.toArray();
  
}
  

  
private int factorial(int num){
  
int result = 1;
  
if(num < 0){
  
return -1;
  
}
  
if(num == 0){
  
result = 1;
  
} else {
  
for(int i = num; i > 0; i--){
  
result *= i;
  
}
  
}
  

  
return result;
  
}
  
}
  

  通过继承AbstractFunction抽象类,重写getArgumentDesc方法实现对函数参数的描述,重写setParameters方法来对函数的参数进行检查和设置,重写getReferenceKey方法告诉JMeter该函数在框架中的引用名称,重写execute方法,实现对该函数的执行并返回结果。通过上述代码我们完成了对Factorial函数组件的编写。
DSC00015.jpg

  2、这里写的简洁了,如果觉得复杂,可再参考TestSampler类似步骤(5、6、7),将插件打包插入JMeter框架,可以在函数助手中查看到该函数组件内容如下:
DSC00016.jpg

  框架已经引入了我们所开发的函数组件,我们根据参数设置计算10的阶乘,设置如下:
DSC00017.jpg

  通过TestSampler对其进行测试,测试结果如下:

  控制台输出了10的阶乘返回结果。就此,便通过此章节基本掌握了Function(函数)插件式组件的主要开发过程。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-427822-1-1.html 上篇帖子: .apache.commons.io 源代码学习(二)FilenameUtils类 下篇帖子: svn的安装(整合apache、ldap)包括错误解决post commit FS processing had error
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表