基于jmeter3.0版本的csv data set config二次开发(实现从指定行开始读取)

最近在进行性能测试时遇到的需求比较麻烦,进行参数化的csv文件里的每个参数只能使用一次,开发提供了10w行参数,完全足够压测多伦使用。但是jmeter的csv data set config元件每次开始都是从csv文件的第一行开始获取数据,无奈只能修改jmeter的该部分源码,下面是主要步骤供大家参考:

 

1.不用说去官网下载jmeter的源码,当前版本为apache-jmeter-3.0_src.zip。下载后导入eclipse中,具体方法不表自行百度,需要注意的是导入时要将output folder改成build,同时打上勾如下图所示:


第二从eclipse里的run configrution、debug configrution也要将默认目录改成如下图所示:



 好了接下来就可以在eclipse里面任性的打断点调试了。

 

2.要是修改默认的csv data set config实现如下图功能:

 

 我们找到CSVDataSetBeanInfo这个类,在里面先增加linenumber变量:

private static final String FILENAME = "filename";  			 //$NON-NLS-1$
    private static final String LINENO = "linenumber";               //开始行号
private static final String FILE_ENCODING = "fileEncoding";      //$NON-NLS-1$
private static final String VARIABLE_NAMES = "variableNames";

 还有如下修改增加属性:

createPropertyGroup("csv_data",             //$NON-NLS-1$
                new String[] { FILENAME, LINENO,FILE_ENCODING, VARIABLE_NAMES, DELIMITER, QUOTED_DATA, RECYCLE, STOPTHREAD, SHAREMODE });

        PropertyDescriptor p = property(FILENAME);
        p.setValue(NOT_UNDEFINED, Boolean.TRUE);
        p.setValue(DEFAULT, "");        //$NON-NLS-1$
        p.setValue(NOT_EXPRESSION, Boolean.TRUE);
        
        //增加linenumber设置
        p = property(LINENO);
        p.setValue(NOT_UNDEFINED, Boolean.TRUE);
        p.setValue(DEFAULT, "");        //$NON-NLS-1$
        p.setValue(NOT_EXPRESSION, Boolean.TRUE);

        p = property(FILE_ENCODING);
        p.setValue(NOT_UNDEFINED, Boolean.TRUE);
        p.setValue(DEFAULT, "");        //$NON-NLS-1$
        p.setValue(NOT_EXPRESSION, Boolean.TRUE);

 
 再到对应的CSVDataSetResources.properties文件中增加如下属性:

shareMode.shortDescription=Select which threads share the same file pointer
shareMode.all=All threads
shareMode.group=Current thread group
shareMode.thread=Current thread
linenumber=linenumber

 再到CSVDataSet这个类中,添加linenumber对象,并为其提供set、get方法:

private transient String filename;
    
    private transient String linenumber;

private transient String fileEncoding;

 

public String getLinenumber() {
		return linenumber;
	}

public void setLinenumber(String linenumber) {
		this.linenumber = linenumber;
	}

 做完上面的步骤后,我们把目光聚焦到iterationStart这个方法,每执行一次该方法就会从csv中获取一行参数数据,这个地方我对原readLine方法进行了重写增加了linenumber参数,并根据linenumber是否为空(暂不考虑输入的字符不是数字的情况),如果为空就调用原来的readLine方法否则就调用重写了的readLine方法。



 具体的根据linenumber进行定位的readLine方法在FileServer这个类中,我们可以通过eclipse的快捷键快速定位,在重写的readLine方法中比原方法多进行了行数定位操作代码如下:



 修改完这些代码重新运行jemter就可以看到效果了,当然别忘了用ant编译再运行。。

 

3.回顾一下其实还是有一些可以继续改进的地方,比如没有对linenumber是否为数字进行判断、如果设置了Quoted为true那么代码将会失效。

其实最好是将CSVDataSet、CSVDataSetBeanInfo、CSVDataSetResources.properties三个类复制一份弄成CSVDataSetExt、CSVDataSetBeanInfoExtCSVDataSetResourcesExt.properties进行自己的diy,搞一个csv data set configext元件,而不是像上面的在原元件上修改。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值