最近写case,需要当前播放节目的数据作为输入数据,所以每个时刻所用的数据只能是当前时刻附件的数据,尝试用CSV Data Set Config动态加载不同的文件,没有成功,好像CSV Data Set Config里面的 文件名是在case运行之前就加载了,后期没法改(反正我自己没找到方法)。后来发现__CSVRead()函数可以在运行时读取,但是网上有人说csv文件不能太大。从我目前的需求来说,只需要一分钟切换一个文件,这样每一个文件里面的数据也就只需要包含几分钟时间段内的数据,这样文件也不会太大。
具体实现:
1. 在用__CSVRead()函数读取数据之前,先生成要读取的文件名(包括完整路径和扩展名),然后添加一个BeanShell Sampler,在里面用下面的代码每一列数据保存到变量里面,读取代码如下:
line1: vars.put("GlfProgramId",${__CSVRead(${__property(scheduleOnNowFile)},0)});
Line2: vars.put("ServiceId",${__CSVRead(${__property(scheduleOnNowFile)},1)}${__CSVRead(${__property(scheduleOnNowFile)},next)});
其中,Line1的意思是把scheduleOnNowFile这个csv文件的第一列的当前行保存到GlfProgramId这个变量,0是指读取第一列,后面个列依次是1,2,3...。
Line2的意思跟第一行类似,只不过后面紧跟着的${__CSVRead(${__property(scheduleOnNowFile)},next)}是说后面的读取要移到下一行了,其中next就是指的下一行。当读到csv文件最后一行,会自动回到第一行。
PS:1. 用__CSVRead()函数读取文件数据时,好像不能忽略掉第一行(很多时候CSV文件都有header,用CSV Data Set Config可以忽略header这一行).
2. 如果一个threadgroup只读一行,那就只能在最后一次读取的时候加上${__CSVRead(${__property(scheduleOnNowFile)},next)}。
3. __CSVRead()函数读取是按顺序读取的,多线程运行也是按顺序的,第一个线程读第一行,第二个就读第二行,依次读取。
4. __CSVRead()函数读取列是完全按照半角逗号来区分不同的列的,不管每个列有没有双引号引起来,这个跟CSV Data Set Config是不一样的,CSV Data Set Config可以忽略掉双引号里面的逗号。所以如果字段里面有引号,需要在生成csv文件时,把半角逗号替换成全角逗号,等到读取出来要用的时候再替换回半角逗号。