You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Jmeter断言失败排查:实际值与期望值一致仍断言失败

字符串比较导致断言失败的问题分析与解决

嗨,这问题我太熟了!你踩的是Java字符串比较的经典坑——绝对不能用!=或者==来判断两个字符串的内容是否一致,这俩运算符比的是字符串对象的内存地址,不是文本内容本身。

问题根源

看你代码里的判断条件:

if (vars.get("expected") != vars.get("actual")) {

哪怕actualexpected的文本完全一模一样,只要它们是两个不同的字符串对象(比如一个从变量池取、一个是你新建的),!=就会返回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

火山引擎 最新活动