需要在BeanShell断言中将值从String更改为Long以进行验证。
First Apporach
long balance_after_credit = Long.parseLong(String.valueOf("${balance_after_credit_from_db}"));
第二种方法
long balance_after_credit = Long.parseLong(vars.get("balance_after_credit_from_db"));
例如,考虑为变量balance_after_credit_from_db.
错误
org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``long token_balance_after_credit = Long.parseLong(vars.get("token_balance_after_c . . . '' : Typed variable declaration : Method Invocation Long.parseLong
奇怪的是有时候,我没有得到错误,脚本正在通过。 任何人都可以指出我在做错了什么。 TIA。
答案 0 :(得分:1)
不建议将JMeter变量内联到基于代码的脚本中,所以请选择第二种方法。
您如何知道完全字符串始终从数据库返回?它很容易可以是任何其他对象类型,实际上是Mapping SQL and Java Types文章中描述的任何对象类型。更安全的方法将是这样的:
if (vars.getObject("balance_after_credit_from_db") instanceof String) {
long balance_after_credit = Long.parseLong(vars.get("balance_after_credit_from_db"));
}
else {
log.error("Unexpected \balance_after_credit_from_db\" variable type");
log.error("Expected: String, Actual: " + vars.getObject("balance_after_credit_from_db").getClass().getName());
throw new Exception("Unexpected variable type");
}
因此,在非String JDBC查询结果的情况下,您将能够在 jmeter.log 文件中看到相关消息
有关在JMeter测试中使用来自数据库的实体的更多信息,请参阅Debugging JDBC Sampler Results in JMeter文章
答案 1 :(得分:0)
第二个选项
long balance_after_credit = Long.parseLong(vars.get("balance_after_credit_from_db"));
如果您有一个有效的数字变量值,应该可以工作。例如,尝试运行这样的东西:
vars.put("x", "743432545");
long balance_after_credit = Long.parseLong(vars.get("x"));
它不会返回任何异常。
问题是当未定义变量时,具有空值或非数值。然后Long.parseLong
将抛出一个NumberFormatException
,你将其捕获并利用(将其视为断言失败):
String rawValue = vars.get("balance_after_credit_from_db");
long balance_after_credit = Long.MAX_VALUE; // initialize with some unrealistic value
try {
balance_after_credit = Long.parseLong(rawValue);
}
catch(NumberFormatException e) {
Failure = true;
FailureMessage = "Variable does not contain a valid long. It was " + rawValue + " instead";
}