Jmeter 用 Groovy 读写文件

发表时间 ·

Jmeter 自带的控件 Flexible Writer 可以记录许多信息到文件,但是只能记录原始信息,当我们需要后处理和稍复杂的逻辑时,就必须借助 Groovy 脚本 。 本文讨论如何用 Groovy 脚本读写文件。

本文使用的 Jmeter 是 4.0 版本

和 Java I/O 的关系

虽然 Groovy 插件完全兼容 Java,也就是说,你可以在 JSR233 插件中使用 Java 语言读写文件,但是, Groovy 语言提供了许多额外的方法,让你以极少量的代码完成 Java 中的同样的事情。

定位文件路径

启动 Jmeter 的目录,会被当做初始目录(Home directory)。在 Jmeter 里,单独一个文件名,默认是相对 Jmeter 初始目录。所以,如果文件放在初始目录下,是不需要指定路径的。

我们在 初始目录 内预先创建一个文件作为实验对象,文件名为 test.txt , 内容如下:

The quick 
brown fox 
jumps over 
the lazy dog

如果要改变初始目录,需要用 -d 参数:

jmeter -d /some/dir

读取文件

用例设计如下:

Test Plan
  └─ Thread Group
      └─ JSR223 Sampler

将代码填入 JSR223 Sampler,执行便可在命令行里看到结果。

文件对象

内置 File 对象可以用来打开一个文件。

File f = new File(fileName);
逐行读取

eachLine

下面的代码将 test.txt 文件内容全部显示在控制台中:

String fileName = 'test.txt';  // 指定文件名
File f = new File(fileName);   // 实例化 File 对象
f.eachLine{
    line -> OUT.println(line);
}

eachLine 是 Groovy 在 Java 的 File 对象基础上新增的方法,用于方便的遍历文件的每一行,并且在结束遍历时,自动关闭文件(即使发生异常,仍然可以自动关闭),可以非常方便的用于逐行遍历文件内容。eachLine 后面用花括号括起来的参数是一个closure,类似一个匿名函数。

Closure 的第二个参数可忽略,如果带上则表示行号

String fileName = 'test.txt';  // 指定文件名
File f = new File(fileName);   // 实例化 File 对象
f.eachLine{
    line, lineNum -> OUT.println(lineNum +" "+ line);
}
读取到数组

collect

def list = new File('test.txt').collect {it}
OUT.println("$list");

collect 后面的参数仍然是closure,it是默认参数,可以省略,而最后一行的return关键字也可以省略,所以{it}的意思就是将参数直接返回。等效于下面的closure:

{it} 等效于
{item -> return item}

或者使用 as 关键字,下面的语句和上面等效:

def array = new File('test.txt') as String[]
OUT.println("$array");
按字节方式读入文件

byte[]

def file = new File('test.txt');
byte[] contents = file.bytes;
OUT.println("$contents");

可以忘了 FileInputStream 了!(本来就难以记忆)

处理流

如果确实需要处理输入流,可以用下面的写法:

new File('test.txt').withInputStream { stream ->
    // do something ...
}

写入文件

(未完待续)


相关文章   欢迎到 留言板 写下你的看法。
  本页面内容采用 署名协议 CC-BY 授权。欢迎转载,请保留原文链接