如何在jMeter中使用JSONSchema验证JSON数据

时间:2016-12-13 12:00:19

标签: json jmeter jsonschema jmeter-plugins

根据我的要求,我收到json回复。所以,我想在JSONSchema中使用jMeter进行结构和数据类型验证。

如何以最佳方式实现这一目标?
jMeter中是否有可用于执行这些任务的插件?

示例

响应Json是

{
  "id": "60D5B6D2-9607-4E23-91D0-14EB5EA806EA",
  "imp": [
    {
      "id": "1",
      "tagid": "759926",
      "banner": {
        "w": 300,
        "h": 250,
        "topframe": 1,
        "api": [
          5
        ]
      }
    }
  ]
}

JSONSchema是

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "imp": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "tagid": {
            "type": "string"
          },
          "banner": {
            "type": "object",
            "properties": {
              "w": {
                "type": "integer",
                "minimim": 10,
                "maximum": 150
              },
              "h": {
                "type": "integer",
                "minimim": 10,
                "maximum": 150
              },
              "topframe": {
                "type": "integer",
                "minimim": 10,
                "maximum": 150
              },
              "api": {
                "type": "array",
                "items": {
                  "type": "integer"
                }
              }
            },
            "additionalProperties": false,
            "required": [
              "w",
              "h",
              "topframe",
              "api"
            ]
          }
        },
        "additionalProperties": false,
        "required": [
          "id",
          "tagid",
          "banner"
        ]
      }
    }
  },
  "additionalProperties": false,
  "required": [
    "id",
    "imp"
  ]
}

2 个答案:

答案 0 :(得分:2)

没有针对架构验证JSON对象的内置支持,因此您必须执行一些脚本,如Validate JSON against Schema in Java文章中所述。如果引用的链接消失,您将需要JMeter Classpath

中的以下库
activation-1.1.jar
btf-1.2.jar
guava-16.0.1.jar
jackson-annotations-2.2.3.jar
jackson-core-2.2.3.jar
jackson-coreutils-1.8.jar
jackson-databind-2.2.3.jar
joda-time-2.3.jar
jopt-simple-4.6.jar
json-schema-core-1.2.5.jar
json-schema-validator-2.2.6.jar
jsr305-3.0.0.jar
libphonenumber-6.2.jar
mailapi-1.4.3.jar
msg-simple-1.1.jar
rhino-1.7R4.jar
uri-template-0.9.jar

获取它们的最快和最简单的方法是创建最小pom.xml文件,如:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>foo</groupId>
    <artifactId>bar</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.github.fge/json-schema-validator -->
        <dependency>
            <groupId>com.github.fge</groupId>
            <artifactId>json-schema-validator</artifactId>
            <version>2.2.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.fge/jackson-coreutils -->
        <dependency>
            <groupId>com.github.fge</groupId>
            <artifactId>jackson-coreutils</artifactId>
            <version>1.8</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.fge/json-schema-core -->
        <dependency>
            <groupId>com.github.fge</groupId>
            <artifactId>json-schema-core</artifactId>
            <version>1.2.5</version>
        </dependency>
    </dependencies>


</project>

并执行mvn dependency:copy-dependencies命令。

之后,您将可以使用以下内容:

import java.io.File;
import java.io.IOException;
import java.net.URL;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.github.fge.jackson.JsonLoader;
import com.github.fge.jsonschema.core.exceptions.ProcessingException;
import com.github.fge.jsonschema.core.report.ProcessingMessage;
import com.github.fge.jsonschema.core.report.ProcessingReport;
import com.github.fge.jsonschema.main.JsonSchema;
import com.github.fge.jsonschema.main.JsonSchemaFactory;


public class ValidationUtils {

    public static final String JSON_V4_SCHEMA_IDENTIFIER = "http://json-schema.org/draft-04/schema#";
    public static final String JSON_SCHEMA_IDENTIFIER_ELEMENT = "$schema";

    public static JsonNode getJsonNode(String jsonText)
            throws IOException
    {
        return JsonLoader.fromString(jsonText);
    } // getJsonNode(text) ends

    public static JsonNode getJsonNode(File jsonFile)
            throws IOException
    {
        return JsonLoader.fromFile(jsonFile);
    } // getJsonNode(File) ends

    public static JsonNode getJsonNode(URL url)
            throws IOException
    {
        return JsonLoader.fromURL(url);
    } // getJsonNode(URL) ends

    public static JsonNode getJsonNodeFromResource(String resource)
            throws IOException
    {
        return JsonLoader.fromResource(resource);
    } // getJsonNode(Resource) ends

    public static JsonSchema getSchemaNode(String schemaText)
            throws IOException, ProcessingException
    {
        final JsonNode schemaNode = getJsonNode(schemaText);
        return _getSchemaNode(schemaNode);
    } // getSchemaNode(text) ends

    public static JsonSchema getSchemaNode(File schemaFile)
            throws IOException, ProcessingException
    {
        final JsonNode schemaNode = getJsonNode(schemaFile);
        return _getSchemaNode(schemaNode);
    } // getSchemaNode(File) ends

    public static JsonSchema getSchemaNode(URL schemaFile)
            throws IOException, ProcessingException
    {
        final JsonNode schemaNode = getJsonNode(schemaFile);
        return _getSchemaNode(schemaNode);
    } // getSchemaNode(URL) ends

    public static JsonSchema getSchemaNodeFromResource(String resource)
            throws IOException, ProcessingException
    {
        final JsonNode schemaNode = getJsonNodeFromResource(resource);
        return _getSchemaNode(schemaNode);
    } // getSchemaNode() ends

    public static void validateJson(JsonSchema jsonSchemaNode, JsonNode jsonNode)
            throws ProcessingException
    {
        ProcessingReport report = jsonSchemaNode.validate(jsonNode);
        if (!report.isSuccess()) {
            for (ProcessingMessage processingMessage : report) {
                throw new ProcessingException(processingMessage);
            }
        }
    } // validateJson(Node) ends

    public static boolean isJsonValid(JsonSchema jsonSchemaNode, JsonNode jsonNode) throws ProcessingException
    {
        ProcessingReport report = jsonSchemaNode.validate(jsonNode);
        return report.isSuccess();
    } // validateJson(Node) ends

    public static boolean isJsonValid(String schemaText, String jsonText) throws ProcessingException, IOException
    {
        final JsonSchema schemaNode = getSchemaNode(schemaText);
        final JsonNode jsonNode = getJsonNode(jsonText);
        return isJsonValid(schemaNode, jsonNode);
    } // validateJson(Node) ends

    public static boolean isJsonValid(File schemaFile, File jsonFile) throws ProcessingException, IOException
    {
        final JsonSchema schemaNode = getSchemaNode(schemaFile);
        final JsonNode jsonNode = getJsonNode(jsonFile);
        return isJsonValid(schemaNode, jsonNode);
    } // validateJson(Node) ends

    public static boolean isJsonValid(URL schemaURL, URL jsonURL) throws ProcessingException, IOException
    {
        final JsonSchema schemaNode = getSchemaNode(schemaURL);
        final JsonNode jsonNode = getJsonNode(jsonURL);
        return isJsonValid(schemaNode, jsonNode);
    } // validateJson(Node) ends    

    public static void validateJson(String schemaText, String jsonText) throws IOException, ProcessingException{
        final JsonSchema schemaNode = getSchemaNode(schemaText);
        final JsonNode jsonNode = getJsonNode(jsonText);
        validateJson(schemaNode, jsonNode);
    } // validateJson(text) ends

    public static void validateJson(File schemaFile, File jsonFile) throws IOException, ProcessingException{
        final JsonSchema schemaNode = getSchemaNode(schemaFile);
        final JsonNode jsonNode = getJsonNode(jsonFile);
        validateJson(schemaNode, jsonNode);
    } // validateJson(File) ends

    public static void validateJson(URL schemaDocument, URL jsonDocument) throws IOException, ProcessingException{
        final JsonSchema schemaNode = getSchemaNode(schemaDocument);
        final JsonNode jsonNode = getJsonNode(jsonDocument);
        validateJson(schemaNode, jsonNode);
    } // validateJson(URL) ends

    public static void validateJsonResource(String schemaResource, String jsonResource) throws IOException, ProcessingException{
        final JsonSchema schemaNode = getSchemaNode(schemaResource);
        final JsonNode jsonNode = getJsonNodeFromResource(jsonResource);
        validateJson(schemaNode, jsonNode);
    } // validateJsonResource() ends

    private static JsonSchema _getSchemaNode(JsonNode jsonNode)
            throws ProcessingException
    {
        final JsonNode schemaIdentifier = jsonNode.get(JSON_SCHEMA_IDENTIFIER_ELEMENT);
        if (null == schemaIdentifier){
            ((ObjectNode) jsonNode).put(JSON_SCHEMA_IDENTIFIER_ELEMENT, JSON_V4_SCHEMA_IDENTIFIER);
        }

        final JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
        return factory.getJsonSchema(jsonNode);
    } // _getSchemaNode() ends
}
JSR223 Assertion中的

答案 1 :(得分:0)

尝试JSON Path Assertion JMeter插件,它允许您执行JSON文档的验证(如结构,值,一次输入一个),但不能用于模式验证。

您可以使用JMeter-plugin Manager

下载

手动下载jar并将其放入/lib/ext文件夹并重新启动JMeter。

来自文档:

  

此组件允许您执行JSON文档的验证。

     

首先,如果数据不是JSON,它将解析JSON并失败。

     

其次,它将使用Jayway的语法搜索指定的路径   JsonPath 1.2.0。如果找不到路径,它将失败。

     

第三,如果在文档中找到JSON路径,并进行验证   要求预期值,它将执行验证。对于null   值,GUI中有特殊复选框。