基于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、CSVDataSetBeanInfoExt、CSVDataSetResourcesExt.properties进行自己的diy,搞一个csv data set configext元件,而不是像上面的在原元件上修改。
上一篇: 这种情况怎么解决呢