2016-12-13 37 views
2

對於我的請求,我得到了json響應。所以,我想在jMeter中使用JSONSchema進行結構和數據類型驗證。

如何以最佳方式實現此目標?
jMeter是否有任何插件可用於執行這些類型的任務?如何在jMeter中使用JSONSchema來驗證JSON數據



響應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

沒有根據模式驗證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

0

嘗試JSON Path Assertion JMeter的插件,它允許用戶執行JSON文檔的驗證(狀結構,值,類型一次一個),但不適用於模式驗證。

您可以下載使用JMeter-plugin Manager

手動下載JAR並把它/lib/ext文件夾,然後重新啓動JMeter的。


從文檔:

該組件允許進行JSON文件的驗證。

首先,它會解析JSON,如果數據不是JSON則會失敗。其次,它將使用Jayway JsonPath 1.2.0的語法搜索指定的路徑。如果找不到路徑,則會失敗。

第三,如果在文檔中找到JSON路徑,並且要求驗證期望值爲 ,那麼它將執行驗證。對於空值 值,GUI中有特殊複選框。

+0

如何使用JSON路徑聲明驗證JSON的結構? – KC7

+0

再次不完整的結構。當你使用'Jayway JsonPath 1.2.0'風格編寫斷言時,如果元素的路徑沒有找到,就會引發失敗,這是間接的,你正在測試結構。請參閱我的答案的「文檔」部分中的第二點 –

相關問題