java Jmeter -使用while控制器在满足特定条件后停止发送请求

pes8fvy9  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(396)

我正在创建一个jmeter脚本,该脚本从先前捕获的名为MultitrackeId的变量中选取一个值,该变量可以包含“n”个值。
MultitrackerId variables
例如,在屏幕截图中,有5个值需要反复发送,直到响应主体中出现“SUCCESSFUL”为止,我使用单个线程、计数器和WHILE控制器按如下顺序进行迭代:
counter
因此,计数器将${miltitrackedid_matchNr}作为最大值,并从1开始递增1。以下是请求中的实现方式:
implmentation
目前WHile控制器没有任何条件,所以它只用于迭代。此时,线程保持无限循环,发送如下请求:
domain/${__V(MultitrackerId_${counter})} --> /multitrackerIdvalue_1 domain/${__V(MultitrackerId_${counter})} --> /multitrackerIdvalue_2 domain/${__V(MultitrackerId_${counter})} --> /multitrackerIdvalue_3 domain/${__V(MultitrackerId_${counter})} --> /multitrackerIdvalue_4 domain/${__V(MultitrackerId_${counter})} --> /multitrackerIdvalue_5
然后又开始了
domain/${__V(MultitrackerId_${counter})} --> /multitrackerIdvalue_1 ... ... ... domain/${__V(MultitrackerId_${counter})} --> /multitrackerIdvalue_5
我需要按所示顺序循环所有multitrackerId值,直到找到“SUCCESSFULL”值,然后停止发送该特定请求,并等待其他multitrackerId请求在响应中包含该值,以最终停止线程并结束测试。
我已尝试找出哪种情况是指示的情况,我目前正在使用_
${\__javaScript("${VarStatus}".indexOf("SUCCESSFUL") == -1)}
然而,考虑到在响应中第一次出现“SUCCESSFULL”之后,线程将停止,而不满足剩余MultitrackerId的条件,这不是一个合适的解决方案。
你有什么建议或可能的解决方法吗?
谢谢你!

tp5buhyn

tp5buhyn1#

JMeter的内置测试元素不够灵活,无法实现您的标准,您需要使用JSR223 PostProcessor和一些Groovy脚本。
设置示例:
1.将While控制器的条件更改为以下__jexl3()函数:

${__jexl3(${matches} < 5,)}

1.将While控制器中的请求置于If Controller下,并使用以下条件:

${__jexl3("${__V(MultitrackerId_${counter})}_skip" != "true",)}

1.将JSR223 PostProcessor添加为可能返回SUCCESSFUL的请求的子项,并在其中放置以下代码:

def matches = vars.getObject('matches') ?: 0

if (prev.getResponseData().contains('SUCCESSFUL')) {
    vars.putObject('matches', matches + 1)
    def variable = 'multitrackerIdvalue_' + ((vars.get('__jm__While Controller__idx') as int) + 1)
    vars.put(variable + '_skip', 'true')
}

相关问题