Jmeter断言失败排查:实际值与期望值一致仍断言失败
字符串比较导致断言失败的问题分析与解决
嗨,这问题我太熟了!你踩的是Java字符串比较的经典坑——绝对不能用!=或者==来判断两个字符串的内容是否一致,这俩运算符比的是字符串对象的内存地址,不是文本内容本身。
问题根源
看你代码里的判断条件:
if (vars.get("expected") != vars.get("actual")) {
哪怕actual和expected的文本完全一模一样,只要它们是两个不同的字符串对象(比如一个从变量池取、一个是你新建的),!=就会返回true,直接触发断言失败的逻辑,这就是为啥日志显示内容一致但断言还是报错的原因。
修正方案
把字符串比较改成用equals()方法,它才是专门用来对比字符串内容的:
// 直接用你定义的expected变量更稳妥,避免重复从vars里取值 if (!expected.equals(vars.get("actual"))) { props.put("testcaseExecutionStatus",5); String Status = props.get("testcaseExecutionStatus").toString(); log.info("Status:"+ Status); AssertionResult.setFailure(true); AssertionResult.setFailureMessage("Mismatch between expected and actual return"); }
要是担心vars.get("actual")可能返回null导致空指针异常,还可以把常量放前面(因为expected是你自己定义的,肯定不为null),写法和上面一样,只是逻辑上更安全。
额外小问题修复
你代码里还有个逻辑漏洞:不管if块里的失败逻辑执行没执行,最后都会把testcaseExecutionStatus设为1,这会直接覆盖掉失败状态的设置。应该把这部分放到else块里,保证状态判断准确:
if (!expected.equals(vars.get("actual"))) { props.put("testcaseExecutionStatus",5); String Status = props.get("testcaseExecutionStatus").toString(); log.info("Status:"+ Status); AssertionResult.setFailure(true); AssertionResult.setFailureMessage("Mismatch between expected and actual return"); } else { props.put("testcaseExecutionStatus",1); String Status = props.get("testcaseExecutionStatus").toString(); log.info("Status:"+ Status); }
内容的提问来源于stack exchange,提问作者Sarwat Hussain




