在jmeter中使用Beanshell验证JSON响应

时间:2017-02-28 09:22:10

标签: java json jmeter beanshell

我试图使用Beanshell断言在我的jmeter中断言Json响应。以下是我的代码。

import org.json.JSONObject;
import org.json.JSONArray;
import java.lang.String;
import org.apache.log.Logger;

try{
  String jsonString = prev.getResponseDataAsString();
  JsonObject jsonobj = JsonObject.readFrom(jsonString);
  JsonArray jsonarr = jsonobj.get("items").asArray();
  String pickup = jsonarr.get(2).asObject().get("CM_NAME").asString();
  log.info(pickup); 
 }
catch(Exception e)
{
 log.info("beanshell Exception "+e.getMessage());
}

这是我必须验证的Json路径

$.items[2].CM_NAME

运行脚本后,我得到以下脚本。

  

断言失败消息:org.apache.jorphan.util.JMeterException:   调用bsh方法时出错:eval源文件:内联评估:   ``import org.json.JSONObject; import org.json.JSONArray;进口   java.lang.String中; 。 。 。 '':类型变量声明:类:   在命名空间

中找不到JsonObject

我使用的是jmeter版本2.11。任何人都可以帮助我让我的脚本正常工作,我的代码是否正确?

2 个答案:

答案 0 :(得分:1)

我建议您改用JsonPath,这正是您想要做的事情。

此外,升级到已将此库嵌入其类路径的JMeter 3.1,或下载JAR文件并将其放入/ lib / ext。

完整代码示例:

import com.jayway.jsonpath.JsonPath;

String author0 = JsonPath.read(document, "$.store.book[0].author");
Failure = !"John Smith".equals(author0);
if (Failure) {
  FailureMessage = "Expected John Smith as author";
}

答案 1 :(得分:1)

如果你真的想这样做,你需要确保relevant JSON library位于JMeter Classpath的某个地方(通常只需将jar放到JMeter的“lib”文件夹并重启JMeter即可它)

展望未来我建议使用不同的方法,如:

  1. 通过JSON Path Assertion可以JMeter Plugins,您可以直接在那里使用您的JSON路径查询。您可以通过JMeter Plugins Manager

    安装JSON Path Assertion

    JSON Plugins JMeter Plugin Manager

  2. 切换为JSR223 AssertionGroovy语言。 Groovy有built-in JSON support所以你不需要任何额外的库。例如,如果您有以下JSON响应:

    {
      "items": [
        {
          "CM_NAME": "foo"
        },
        {
          "CM_NAME": "bar"
        },
        {
          "CM_NAME": "baz"
        }
      ]
    }
    

    您需要使用以下Groovy代码提取baz值:

    def response = SampleResult.getResponseDataAsString()
    def json = new groovy.json.JsonSlurper().parseText(response)
    
    log.info(json.items[2].CM_NAME)
    

    Groovy JSON Example