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.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\]; arr1arr2 //true arr1arr3 //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() 则返回相加得到的新数组。