jmeter中一个变量获取后对应多个值,然后在后面调用这个变量,同时遍历所有值的方法(for each的用法) 另附几种复杂控制器

例如,我有个变量member_id包含7个值,还有cc_file有5个值

我们有这样一个场景,7个学生访问这5个文件,且全部访问

1、提取7个学生id

访问http

提取id

其中match number为-1,是指提取所有的值,保存为变量member_id

2、获取5个file的id

 

提取所有id并保存成cc_file

 

然后用两个嵌套循环即可

首先使用for each循环控制器时,要弄清楚这几个选项的意思

输入变量前缀,就是调用的变量名——调用后jmeter 会填充后缀,例子中就是member_ids_1为什么是下划线后面跟着1,因为勾选了下面的框。。

 Input Variable Prefix:输入变量前缀,本例中为:member_ids
Output variable name:输出变量名称,提供给其它控件引用 
Start index for loop(exclusive):循环开始的索引(默认从0开始,如果填写是2,实际是从2+1个开始执行) 
End index for loop(inclusive):循环结束的索引(默认从0开始,如果填写是2,实际是从2+1个开始执行) 
Add”_”before number:输入变量名称中是否使用"_"进行间隔。 

 

 

 

 

 

 

我把翻译当原创,实在是使用心得,贴出交流,与君共勉。

 


 

1、ForEach Controller(遍历循环控制器)

 


 

 

 

Name:遍历循环控制器,名称,随意;

 

Comments:注释;

 

Input variable prefix:入参前缀;

 

Start index for loop(exclusive):循环变量起点,为0(第一个元素在起始索引+1),所以是从1开始取值,如果,正则表达式没有提取到任何参数匹配,则不会运行任何样本sampler;

 

End index for loop(inclusive):循环变量终点,如果variable_matchNr=10,写10,取到第10个,写11,没有11,则不取,写9则只取到编号为9的那个参数,取值大于输出参数时,不会影响执行下一步操作;

 

Out variable name:输出变量名称,可以直接引用${variable name}

 

Add"_"before number?:变量前缀是否添加_作为分隔符;

 

举例(查询天气预报):场景使用,查询出某一个城市,有多个城市代码,然后查询出每个地区的天气情况,这时就需要遍历每一个城市代码;

 


 

 

 

正则表达式提取所有的citycode,

 

Template:模板,$1$ 对应一个(.+?)表达式,Match No.(0 for Random):匹配规则,-1所有,0随机,1第一个;

 


 

 

 

可以通过debug调试结果得知总数citycode_matchNr=20,

 


 

 

 

入参输入citycode_ 自带下划_分隔符,就不需要勾选Add“_”.。?,

 

开始数是从(0+1)开始,到20结束,那么取值citycode_1-20输出给Recitycode;

 


 

 

 

${Recitycode}就会得到20条citycode数据进行遍历:

 

 

 


 

2、If Controller 如果控制器

 


 

 

 

Name:如果控制器,命名随意;、

 

Comments:注释

 

Condition(default Javascript):判断条件,默认javascript脚本,

 

Interpret Condition as Variable Expression?:

 

勾选,使用javascript脚本、函数表达式来设置条件,如${_javascript(8==8)},返回为true则执行;

 

不勾,使用变量表达式来设置条件,如"${variable}"=="xxx"、${variable}==数字,返回true则执行;

 

Evaluate for all children?:判断条件是否针对所有的子节点,默认不勾选。只在if入口判断一次;

 

3、Loop Controller 循环控制器

 


 

 

 

Name:循环控制器名称,随意;

 

Comments:

 

Loop Count:循环次数,输入多少次就做少次

 

Forever:勾选,则永远循环,

 

 

 

再解释一遍这个配置元件与循环控制器搭配使用:

 

Name:元件名称,随意,保持默认就好

 

Comments:

 

Configure the CSV data source:配置元件数据源

 

FileName:名称,绝对路径;如C:\program file\index.csv,相对路径,文件放在脚本同一路径

 

File encoding:文件编码,如果参数文件有中文保存又不是utf-8,此处填gbk,如果参数文件保存为utf-8编码,默认为空或utf-8

 

Variable names (comma-delimited):参数文件有多少列,就给多少变量名称一一对应即可

 

Ignore first line(only used if variable names is not empty):默认false,选择true,不读文件第一行;

 

Delimiter(use '\t' for tab):分隔符,默认英文逗号,

 

Allow quotel data?:是否允许引用数据,未解其意,如果参数是引用参数“3,2,2”,就取引号的值;

 

Recycle on EOF?:到了文件尾是否循环,True—继续从文件第一行开始读取,False—不再循环,当False读完即止,stop thrad on EOF?为false,如果线程数大于参数行数4>3,则取到第3行,线程停止,不会执行下一个请求;

 

Stop thread on EOF?:到了文件尾是否停止线程,True—停止线程,False—不停止,注:当Recycle on EOF设置为True时,此项设置无效。

 

Sharing mode:共享模式,All threads –所有线程,Current thread group—当前线程组,Current thread—当前线程。这个地方和[url=]LoadRunner[/url]中的迭代取之相反,经试验得出来的结果是:

 

Ø All threads:[url=]测试[/url]计划中所有线程,假如说有线程1到线程n (n>1),线程1取了一次值后,线程2取值时,取到的是csv文件中的下一行,即与线程1取的不是同一行。

 

Ø Current thread group:当前线程组,假设有线程组A、线程组B,A组内有线程A1到线程An,线程组B内有线程B1到线程Bn。取之情况是:线程A1取到了第1行,线程A2取第2行,现在B1取第1行,线程B2取第2行。

 

Ø Current thread:当前线程。假设测试计划内有线程1到线程n (n>1),则线程1取了第1行,线程2也取第1行。

 


 

4、Once Only Controller 仅一次控制器(理解就是它不在逻辑控制器之内,任何循环的取样器,在它之下只执行一次,线程多少个就执行多少次)

 

顾名思义,一个线程只会执行一次,多个线程就执行多次;

 

5、Switch Controller 条件控制器

 


 

 

 

Switch Value:默认为空,取其下第一个取样器,可以理解成编号,如输入0,其下的第一个取样器为0,顺序依此类推;如果指定的编号超出了下面的节点数或者不指定,则运行第0个取样器,另外可以指定取样器的名称,匹配注意大小写及空格,如果匹配不上,则不运行取样器;

 

6、RandomController 随机控制器

 


 

Name:随机控制器,名称随意;

 

Comments:注释;

 

Ignore sub-controller blocks:忽略子控制器模块

 

7、Transaction Controller 事物控制器

 


 

 

 

Name:事物控制器,名称,随意,最好具有业务意义;

 

Comments:注释;

 

Generate parent sample:勾选,则聚合报告中只显示事务控制器的数据,而不会显示其中的各个请求的数据,反之则全部显示。在查看结果树中以一个上级目录显示请求事物;

 

Include duration of timer and pre-post processors in generated sample:选中这一项会统计定时器(timer)的时间,否则只统计采样器(sample)的时间;

 

8、生命周期/运行周期控制器(Runtime Controller)

 

 

 

 

posted @ 2018-01-22 18:59  乌骓  阅读(15509)  评论(1编辑  收藏  举报