JMeter中If Controller后HTTP请求不执行?如何实现取token且必发Send Document
为什么If Controller执行后,后续的HTTP请求不会执行?
问题根因
你遇到的执行逻辑异常,基本是两类配置错误导致的:
- 节点层级嵌套错位:If Controller是块级控制元件,它仅负责管控自己下方的所有子节点:判定为true时才会依次执行全部子节点,判定为false时直接跳过整棵子节点树。你现在遇到的Send Document不执行的问题,90%的概率是误把
Send Document节点拖到了If Controller的内部子层级,误以为是If后面的“同级后续节点”,实际上已经被纳入If的管辖范围,自然会跟着If的判定结果变化,不会独立执行。你可以现在点开左侧的JMeter节点树,展开If Controller看子节点列表,如果能找到Send Document,就是这个问题。 - If判定逻辑配置失效:如果勾选了If Controller面板上的
Interpret Condition as Variable Expression?选项,但表达式没有正确返回布尔值、存在语法错误,会导致If的判定结果始终不符合预期,连带内部所有节点的执行逻辑全部异常。
匹配你业务需求的正确实现方案
你的核心需求是:读取CSV逐行数据、比对相邻两行的目标值、值不相等时才发起token获取请求、不管判定结果如何都要执行Send Document。按照下面的步骤搭脚本就能实现:
- 理顺脚本节点层级,严格按照同级关系摆放,避免错误嵌套:
- 线程组
CSV Data Set Config:配置CSV文件路径、变量名(比如把每行读到的目标值存为csv_current_value)、分隔符、循环读取规则,确保每一次线程迭代都能正确读到一行CSV数据- JSR223 前置处理器(放在CSV配置下方):写Groovy脚本实现相邻值比对逻辑
脚本核心逻辑:
- 第一次迭代时,因为没有上一行的基准值,直接标记需要获取token
- 非首次迭代时,把上一轮留存的
csv_previous_value和当前读到的csv_current_value做字符串严格比对 - 把比对结果存为布尔变量
need_refresh_token - 比对完成后,把当前的
csv_current_value赋值给csv_previous_value,作为下一轮迭代的比对基准
- If Controller:配置判定表达式为
${need_refresh_token},保持Interpret Condition as Variable Expression?为默认勾选状态即可。所有和获取token相关的HTTP请求、断言、变量提取器,全部放到If Controller的子节点层级下——这部分是只有值不相等时才需要执行的逻辑 Send DocumentHTTP请求节点:一定要放在和If Controller完全同级的位置,绝对不要嵌套到If Controller的内部子节点里,这样不管If的判定结果是true还是false,这个节点都会在If逻辑跑完后无条件执行
- 线程组
- 关键避坑提示
- 不要直接把前后值的比对逻辑写在If Controller的表达式里,提前用Groovy脚本算好结果存成布尔变量再引用,能避免JMeter弱类型转换导致的判定失效
- 如果调整完结构后
Send Document还是不执行,检查线程组配置是否开启了「遇到错误就终止线程」、CSV配置是否设置了「读到文件末尾就停止线程」,避免逻辑中途被强制中断 - 不要在If Controller的子层级里放任何需要无条件执行的节点,一旦嵌套就会被If的判定逻辑牵连
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

