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)