jmeter下解决:beanshell 使用jsonpath解析json报错

beanshell

问题

在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)

导入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、查看结果,发现没有报错,并且成功输出断言。成功!!!!

运行成功,输出断言

写在最后

以上不是最好的解决方法,但毕竟也算的上是一种方法 = = ,...........

你可能感兴趣的:(jmeter下解决:beanshell 使用jsonpath解析json报错)