Jmeter 中如何使用数组变量

发表时间

Jmeter JSR223 控件中的 vars 变量对象,使用 put 方法只能保存字符串变量,而这时如果希望方便的展开数组或者集合运算,就需要使用更高级的方法。本文讨论这些具体方法。


本文使用的 Jmeter 是 4.0 版本

本文目的

本文的目的是,在循环请求中,将每次请求得到的结果依次放入某数组,并且在全部请求完成后,可以访问该数组,得到所有结果。

保存对象

《Jmeter 的 vars 和 props 用法》 所介绍,可以使用 vars.putObject() 方法保存数组对象,同时用 vars.getObject() 方法获取对象。

可以这么设计 Jmeter 脚本:

Test Plan
  └─ Thread Group
      ├─ JSR223 Sampler
      │
      └─ Loop Controller
           ├─ Http Sampler
           ├─ Regular Expression Extractor
           └─ JSR223 PostProcessor

其中 Regular Expression Extractor 用于从响应中提取特定值,并保存在变量 SAVED_VAR 中,则我们可以使用 JSR223 Sampler 和 JSR233 PostProcessor 中 Groovy 脚本语言保存数组。

脚本编写

Groovy 脚本如下:

JSR223 Sampler 用于初始化对象

vars.putObject("SAVED_ARRAY",[]);

JSR223 PostProcessor 用于向数组的末尾追加元素

arr = vars.getObject("SAVED_ARRAY");
arr << vars.get("SAVED_VAR");
vars.putObject("SAVED_ARRAY", arr);

这样就可以将 SAVED_VAR 变量 push 到 SAVED_ARRAY 中,并保存下来,供后面的程序使用。

与数组相关的语法

Groovy 对数组操作的语法比较简洁,比如:

数组长度

取得数组内元素的个数

elem = arr.size();
读取元素

按照下标取得数组指定位置的元素,下面几种方法等效:

elem = arr[1];
elem = arr.get(1);
elem = arr.getAt(1);

下标支持负数,和 Python 类似:

elem = arr[-1];
写入元素

按照下标写入数组指定位置的元素,修改某个位置的成员,下面几种方法都可以:

arr[1] = elem;
arr.putAt(1, elem);
arr.set(1, elem);    //同时返回被替换的值
追加元素

向数组末尾添加(append)元素,扩充数组的大小。

arr << elem;
数组比较

比较两个数组对应位置元素全部相等

arr1=[1,2,3];
arr2=[1,2,3];
arr3=[3,2,1];

arr1==arr2  //true
arr1==arr3  //false
寻找元素

返回指定元素第一次出现的位置:

arr = [1, 2, 3];
arr.indexof(2);      //1

返回第一次出现的、满足特定条件的元素:

arr = [1, 2, 3];
arr.find{ it>1 };      //2
筛选元素

找出满足条件的所有元素集合:

arr = [1, 2, 3];
arr.findAll{ it>1 };      //[2, 3]
聚合运算

聚合运算,输入一个列表,输出单个数值。

[1, 2, 3].sum();    //6
[1, 2, 3].max();        //3
["1", "2", "3"].sum();    //"123"
["1", "2", "3"].join(".");    //"1.2.3"
集合运算

Python 的集合运算相比 ,Groovy 也有集合运算,和 Python 不同的是,直接在列表对象上进行,而不需要另一种数据类型 set

判断元素的从属关系

1 in [1, 2, 3];    //true
[1, 2, 3].contains(1);  // true

判断集合的包含关系,即子集:

[1, 2, 3].containsAll([1, 3])  //true

取两个集合的交集

[1, 2, 3].intersect([3, 4, 5])  // [3]

取两个集合的合集

[1, 2, 3].plus([3, 4, 5])  // [1, 2, 3, 3, 4, 5]
[1, 2, 3] + [3, 4, 5]   // [1, 2, 3, 3, 4, 5]

取两个集合的差集

def array = [1, 2, 3];
array.removeAll([3, 4, 5])  // array = [1, 2]

注意, removeAll()plus() 的返回方法是不同的: removeAll() 直接在原数组上操作,返回值仅表示操作是否删除了元素,如果原来两个集合无交集,则不会删除元素,这是返回 false; plus() 则返回相加得到的新数组。

本页面内容采用 署名协议 CC-BY 授权。欢迎转载,请保留原文链接


分类

相关文章