4

Jmeter 中如何使用数组变量

 2 years ago
source link: https://www.lfhacks.com/tech/jmeter-vars-array/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Jmeter 中如何使用数组变量

发表时间 2018-10-15
预计阅读时间 2 分钟
阅读量 66

扫一扫,转发文章

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 脚本语言保存数组。

570.png

Groovy 脚本如下:

JSR223 Sampler 用于初始化对象

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

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

arr << vars.get("SAVED_VAR");
vars.putObject("SAVED_ARRAY", arr);
572.png

这样就可以将 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  //truearr1arr3 //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() 则返回相加得到的新数组。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK