基于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变量:

Java代码  收藏代码
  1. private static final String FILENAME = "filename";               //$NON-NLS-1$  
  2.     <span style="color: #ff0000;">private static final String LINENO = "linenumber";</span>               //开始行号  
  3. private static final String FILE_ENCODING = "fileEncoding";      //$NON-NLS-1$  
  4. private static final String VARIABLE_NAMES = "variableNames";  

 还有如下修改增加属性:

Java代码  收藏代码
  1. createPropertyGroup("csv_data",             //$NON-NLS-1$  
  2.                 new String[] { FILENAME, <span style="color: #ff0000;">LINENO</span>,FILE_ENCODING, VARIABLE_NAMES, DELIMITER, QUOTED_DATA, RECYCLE, STOPTHREAD, SHAREMODE });  
  3.   
  4.         PropertyDescriptor p = property(FILENAME);  
  5.         p.setValue(NOT_UNDEFINED, Boolean.TRUE);  
  6.         p.setValue(DEFAULT, "");        //$NON-NLS-1$  
  7.         p.setValue(NOT_EXPRESSION, Boolean.TRUE);  
  8.           
  9.         <span style="color: #ff0000;">//增加linenumber设置  
  10.         p = property(LINENO);  
  11.         p.setValue(NOT_UNDEFINED, Boolean.TRUE);  
  12.         p.setValue(DEFAULT, "");        //$NON-NLS-1$  
  13.         p.setValue(NOT_EXPRESSION, Boolean.TRUE);</span>  
  14.   
  15.         p = property(FILE_ENCODING);  
  16.         p.setValue(NOT_UNDEFINED, Boolean.TRUE);  
  17.         p.setValue(DEFAULT, "");        //$NON-NLS-1$  
  18.         p.setValue(NOT_EXPRESSION, Boolean.TRUE);  

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

Java代码  收藏代码
  1. shareMode.shortDescription=Select which threads share the same file pointer  
  2. shareMode.all=All threads  
  3. shareMode.group=Current thread group  
  4. shareMode.thread=Current thread  
  5. <span style="color: #ff0000;">linenumber=linenumber</span>  

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

Java代码  收藏代码
  1. private transient String filename;  
  2.       
  3.     <span style="color: #ff0000;">private transient String linenumber;</span>  
  4.   
  5. private transient String fileEncoding;  

 

Java代码  收藏代码
  1. public String getLinenumber() {  
  2.         return linenumber;  
  3.     }  
  4.   
  5. public void setLinenumber(String linenumber) {  
  6.         this.linenumber = linenumber;  
  7.     }  

 做完上面的步骤后,我们把目光聚焦到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元件,而不是像上面的在原元件上修改。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页