Jmeter 用 Groovy 读写文件

2018-10-22
标签: JMETER

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 ...
}

## 写入文件 {#writefile}

(未完待续)

如果您对本站内容有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

标签: JMETER

欢迎转载本文,惟请保留 原文出处 ,且不得用于商业用途。
本站 是个人网站,若无特别说明,所刊文章均为原创,并采用 署名协议 CC-BY-NC 授权。