一、概述
MeterSphere接口测试使用JMeter做为执行引擎,JMeter中变量要满足ForEach循环控制器执行需要存在多个相同前缀并且后缀不同的变量,例如,当JMeter中存在nameList_1和nameList_2两个变量时,则可以将nameList做为变量前缀在ForEach循环控制器中执行两次。
而CSV文件配置则是将CSV文件中的每一列参数值存储为一个整体的对象遍历读取,所以可以直接配合次数循环使用,但不满足ForEach循环控制器使用条件。
本文将结合JMeter中变量存储的背景,介绍几种常见的ForEach循环控制器和次数循环控制器使用场景。
二、场景列表变量与ForEach循环
在MeterSphere接口自动化场景中,支持添加列表变量。例如,下图添加了名为nameList的列表变量,实际上MeterSphere中分别存储了名为nameList_1、nameList_2、nameList_3的三个常量变量,满足ForEach循环控制器的使用条件。
配合ForEach循环控制器使用可以遍历到nameList中的三个值。
三、后置操作提取与ForEach循环
在接口测试过程中,接口返回的响应体可能会返回多个对象,往往需要将多个对象中的同一个字段的多个值全部提取,用于后续的接口遍历使用。
例如,在下图的接口中,响应体包含三个name字段,这时候可以在后置操作中使用JSONPATH表达式“$.data[*].name”,并勾选匹配多条,将多个name字段值全部提取出来。
实际上MeterSphere中存储了nameList_1、nameList_2、nameList_3三个变量,可以配合ForEach循环控制器进行遍历。
四、SQL提取与ForEach循环
从SQL中查询字段列表,并进行遍历也是接口测试中常见的场景,当SQL查询时使用按例存储模式进行存储,则会存储多个Var_index格式的变量。
例如,在下面的示例中,SQL从数据库中查询了name字段值,并使用按列存储方式存储为nameList,实际上场景中存在了nameList_1、nameList_2、nameList_3三个变量。
在后续步骤中可以配合ForEach循环控制器遍历nameList中的所有值。
五、脚本设置多个同前缀变量与ForEach
当某个接口会循环执行,并且每次执行时响应体相同字段会返回不同的值,而不同的值需要在后续接口中遍历使用时,可以将每次执行返回的值在脚本中设置为Var_index这种变量名格式,以此满足后续ForEach循环控制器执行的条件。
例如,在下面的示例中,接口A每次循环会返回不同的参数值,需要将每次返回的值存储起来给后面的接口B遍历使用。
这种情况下,首先可以在接口A的循环外定义一个num初始值,做为递增的变量名后缀。
然后在接口A的后置脚本中提取name字段变量值,并且在后置脚本中将当前的变量值复制给idx,而idx的格式为nameList_n,循环执行三次时,场景中就会存在nameList_1、nameList_2和nameList_3三个变量值。
后续则可以将nameList变量做为ForEach循环控制器的变量名前缀进行遍历使用。
六、脚本设置列表变量与ForEach
除了SQL查询、自定义列表变量和后置提取匹配多条以外,有时候还需要在脚本中将复杂参数处理为列表参数变量,并用于后续的ForEach循环控制器中遍历。而在JMeter中,真正列表形式变量是不支持与ForEach循环控制器配合使用的,而后置操作中通过匹配多条提取出来的变量刚好是Var_index这种格式,可以满足ForEach循环条件,所以可以将脚本中的数组设置为当前接口响应体,并从响应体中将参数通过匹配多条提取出来,用于后续遍历使用。
例如,在下面的后置脚本中,设置了一个名为goalList的数组变量,并且通过prev.setResponseData(goalList.toString())方法将数组设置为了当前接口的响应体。
并且通过JSONPATH匹配多条的方式将响应体所有值提取了出来。
在后续步骤中就可以以goalList做为变量前缀配合ForEach循环控制器遍历脚本中处理的数组变量了。
七、多个列表变量配合一个ForEach
在上面的示例中,演示了后置操作使用匹配多条提取出变量后如何配合ForEach循环控制器使用,而往往后置操作会有多个不同字段需要使用匹配多条提取出来进行遍历,这种情况需要配合ForEach循环控制器和嵌套引用方式进行遍历。
例如,在下面的示例中,不仅name字段需要遍历,age和size字段也需要遍历。
首先,可以在场景变量中定义一个计数器,用来获取当前循环次数。
然后在在ForEach循环控制器中,以nameList变量前缀进入循环,age参数和size参数则分别使用${_BeanShell(vars.get("ageList${num}“))}和${_BeanShell(vars.get("sizeList${num}”))}这种格式引用到正确的值。
这样就可以实现nameList、ageList和sizeList三个变量在接口中遍历使用了。
八、CSV与次数循环
由于CSV文件中的每一列参数值都存储为一个整体对象,而不是Var_index这种多个变量名的格式,所以不满足与ForEach循环控制器配合使用的条件,而是支持在次数循环中从参数对象中遍历每一行参数值。
例如在下面的示例中,CSV文件列名配合次数循环控制器即可实现循环遍历参数。