ForEach Controller只支持一个变量作为输入,但是有时候我们其它的输入变量也同步随着ForEach Controller中的变量值不同而不同,我们需要使用多个变量作为输入变量。
除了ForEach控制器中的变量,其它变量我们可以用__V函数和__counter函数(或计数器)来生成Debug sampler/Debug PostProcessor中的变量,__V函数可以处理带有内嵌变量的值,而__counter函数则可以从1递增的生成数字
比如如下场景:
某个班次有班次代码,班次开始时间,班次结束时间。先需要从A表查出这3个变量,然后将这3个变量作为一个insert的输入值,插入到B表,由于B表与A表的班次关系是一一对应的,所以需要用到ForEach控制器来控制。
然而ForEach只支持一个变量的输入,我们怎么引用3个变量呢?这里我们无法通过ForEach控制器直接处理,我们需要借助Jmeter __V函数和计数器来实现
备注:__V函数可以嵌套函数使用
**计数器配置:**一般情况下勾选上与每用户独立的跟踪计数器、在每个线程组迭代上重置计数器
提取的变量:
如下将提取的taskId用于ForEach控制器,其它变量的值随着taskId的不同而变化:
ForEach控制器配置:
ForEach控制器中的变量值:
注意:foreach中的变量必须在此逻辑控制器下面的第一个服务请求中的变量中
变量嵌套使用,其它变量对应的变量值:
ForEach控制器可以嵌套使用
在外层 ForEach 控制器内部添加另一个 ForEach 控制器,对外层获取到的某个参数的多个值,每个值都执行一次服务请求;
关联的灵活使用:
背景:在一个线程组的两个服务请求存在关联时,后一个服务请求将前一个服务请求的的两个或者多个提取值都作为请求数据,但是这多个值存在对应关联,如果获取正确的所有值作为后一个服务请求的请求数据
数据格式:
前一个服务请求列表嵌套Json,每个Json都作为列表中的一个元素,那么:
1、前一个服务请求每个字段有很多值;我们要提取中的两个或者多个字段,作为后一个服务请求的请求数据,但是提取的字段中不同Json的值都有对应关系,如列表中第一个Json中字段A的值,对应列表中的第一个Json中字段B的值,列表中第二个Json中字段A的值,对应列表中的第一个Json中字段B的值…,这样下一个服务请求的请求数据才能正确,可以使用JSR223前置处理器实现。
1、获取前一个服务请求需要用到的相关字段的所有值,然后都放到列表中
2、对于字段A,获取其当前取值,根据当前取值,获取其索引位置
3、通过索引,在另一个列表中获取其对应值,因为索引一样,和步骤2中的当前值存在对应关系
truckCustomerId = vars.get('truckCustomerIds_ALL')
truckCustomerIdList = truckCustomerId.split(',') #将字段A的所有值放在列表ListA中
trSpStoreId = vars.get('trSpStoreIds_ALL') #将字段B的所有值放在列表ListB中
trSpStoreIdList = trSpStoreId.split(',')
selectCustomerId=vars.get('customerId_item') #获取当前字段A的取值
i=truckCustomerIdList.index(selectCustomerId) #通过当前字段A的取值获取该值在列表ListA中的索引
selecttrSpStoreId=trSpStoreIdList[i] #通过索引获取列表ListB中对应的值,因为索引一样,和ListA中的当前值存在对应关系
vars.put('trSpStoreId_item',selecttrSpStoreId)