JMeter SMTP Sampler在取样器失败场景下未触发的问题排查
看起来你遇到的问题是当Create Service取样器失败时,IF Controller里的SMTP Sampler没按预期执行。我帮你梳理几个最可能的原因和对应的修复方法:
IF Controller的条件表达式写法错误
直接写!${JMeterThread.last_sample_ok}在JMeter的IF Controller里可能无法正确解析逻辑非操作。因为${JMeterThread.last_sample_ok}会被替换成true或false字符串,但JMeter默认的简单条件判断不会把!true或!false当成布尔值处理。正确的做法是用JMeter的函数来处理逻辑判断,比如用
__jexl3函数:${__jexl3(!${JMeterThread.last_sample_ok},)}或者更可靠的
__groovy函数:${__groovy(!ctx.getThread().getLastSampleOk(),)}这两个函数能正确解析逻辑非,返回布尔值给IF Controller判断。
未开启“变量表达式解析”选项
检查你的IF Controller配置,有没有勾选Interpret Condition as Variable Expression?(把条件解释为变量表达式)。如果没勾选,JMeter会把整个条件字符串当成“非空即真”来判断,不管实际的布尔值是什么,这会导致条件判断完全失效。中间有其他取样器干扰了
last_sample_ok的状态JMeterThread.last_sample_ok记录的是上一个执行的取样器的成功状态。如果在Create Service和IF Controller之间还有其他测试取样器,一旦中间某个取样器执行成功,last_sample_ok会被覆盖成true,导致IF Controller不触发。解决方法:要么确保IF Controller紧跟在
Create Service取样器之后,中间不插入其他会产生取样结果的组件;要么用自定义变量保存Create Service的结果——比如在Create Service的后置处理器里添加脚本:vars.put("createServiceSuccess", String.valueOf(ctx.getThread().getLastSampleOk()));然后IF Controller的条件改为:
${__jexl3(!${createServiceSuccess},)}这样就不会被后续取样器干扰了。
线程组的错误停止设置导致线程提前终止
检查你的线程组配置,有没有勾选Stop thread if sampler error(如果取样器错误则停止线程)。如果勾选了,当Create Service执行失败时,线程会直接停止,IF Controller里的SMTP Sampler根本没机会运行。把这个选项取消勾选即可。
你可以按照上面的顺序逐一排查,应该能解决问题。
内容的提问来源于stack exchange,提问作者sromit

