问题
在jmeter中使用beanshell脚本时,使用json-path-xxxxx.jar解析json数据时会报错:Error in method invocation: Static method read( java.lang.String, java.lang.String ) not found in class'com.jayway.jsonpath.JsonPath
,以下讲一下解决这个问题的方法
问题重现
1、在测试计划中导入pathpath的jar包(我使用的是jmeter中lib目录下的json-path-2.4.0.jar
)
2、对接口(要求接口的返回值是json
),接口的返回值为
{
"msg": "Success",
"code": "0000",
"data": {
"versionView": {
"updateNotice": "很遗憾此版本已停用,请更新!",
"downloadUrl": "xxxxxxxxxxxxxxxxxxxxx",
"sign": "",
"updateTime": 1558584325000,
"clientVersion": "4.1.5",
"versionCode": 415,
"platform": "iphone",
"clientType": "ios",
"createTime": 1553753740000,
"rate": null,
"name": "testxxxxxxx",
"needForceUpdate": true,
"id": 3538,
"status": "PUBLISHED"
}
},
"requestId": "2937a3ab656c426b9b4e4b29dfeaa07a"
}
添加BeanShell断言,脚本获取需要获取字段needForceUpdate
,断言值是否为false
。脚本如下
import com.jayway.jsonpath.JsonPath;
String s = prev.getResponseDataAsString();
String res = JsonPath.read(s,"$..needForceUpdate").toString();
if (res!="false"){
Failure = true;
FailureMessage = "返回结果为不需要强制更新";
}
运行结果报错,报错内容如下:
2019-07-12 16:58:37,511 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: `` import com.jayway.jsonpath.JsonPath; String s = prev.getResponseDataAsString() . . . '' : Typed variable declaration : Error in method invocation: Static method read( java.lang.String, java.lang.String ) not found in class'com.jayway.jsonpath.JsonPath'
2019-07-12 16:58:37,511 WARN o.a.j.a.BeanShellAssertion: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: `` import com.jayway.jsonpath.JsonPath; String s = prev.getResponseDataAsString() . . . '' : Typed variable declaration : Error in method invocation: Static method read( java.lang.String, java.lang.String ) not found in class'com.jayway.jsonpath.JsonPath'
运行结果报错
解决方法
以上报错处的代码在idea上运行是没有问题的,也不知道问题出在了哪些。
上面报错大概的意思就是找不到com.jayway.jsonpath.JsonPath
类里的静态方法read
。
于是想到了一种方法:对read方法再封装一次,使用封装后的函数
。
1、编写代码,代码思路,类JsonUtil中的方法ParaseJson封装read方法,第一个参数是json字符串,第二个参数是jsonpath。代码如下:
import com.jayway.jsonpath.JsonPath;
public class JsonUtil {
public String ParaseJson(String str,String paras){
String res = JsonPath.read(str,paras).toString();
return res;
}
}
2、将代码导出为jar包(导出方法自行百度
)。这里直接提供我导出的jar包jmeterUtil.jar,提取码:o0fr
3、将jar包放入路径\apache-jmeter-5.0\lib\ext
,导入jmeter。
4、编写代码如下:
import jmeterUtil.*;
String s = prev.getResponseDataAsString();
JsonUtil t = new JsonUtil();
String data = t.ParaseJson(s,"$..needForceUpdate");
if (res!="true"){
Failure = true;
FailureMessage = "返回结果为不需要强制更新";
}
5、查看结果,发现没有报错,并且成功输出断言。成功!!!!
运行成功,输出断言写在最后
以上不是最好的解决方法,但毕竟也算的上是一种方法 = = ,...........
网友评论