如何在JMeter 5.4.3中实现JSON Schema v0.7/2020-12验证REST响应
在JMeter 5.4.3中实现JSON Schema v0.7/2020-12版本验证
替代方案:使用JSR223 Assertion + JSON Schema Java库
由于Schema Assertion插件仅支持v0.4且存在线程变量混淆问题,推荐通过JSR223 Assertion结合专业JSON Schema验证库来实现需求,步骤如下:
1. 准备依赖Jar包
下载以下Jar包并放入JMeter安装目录的lib文件夹,随后重启JMeter:
- everit-json-schema-1.14.0.jar(支持v0.7和2020-12版本)
- json-schema-validator-1.14.0.jar
- jackson-databind-2.15.2.jar
- jackson-core-2.15.2.jar
- jackson-annotations-2.15.2.jar
2. 编写JSR223 Assertion验证脚本
在需要验证的HTTP请求下添加JSR223 Assertion,选择Groovy作为语言,粘贴以下脚本(根据你的Schema版本调整):
import org.everit.json.schema.Schema import org.everit.json.schema.loader.SchemaLoader import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.ObjectMapper // 获取接口响应JSON内容 def responseJson = prev.getResponseDataAsString() if (responseJson.isEmpty()) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("响应为空,无法执行JSON Schema验证") return } // 替换为你的目标JSON Schema(支持v0.7或2020-12) def schemaJson = ''' { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "id": {"type": "integer"}, "name": {"type": "string"} }, "required": ["id", "name"] } ''' // 初始化JSON解析工具 ObjectMapper mapper = new ObjectMapper() JsonNode responseNode = mapper.readTree(responseJson) JsonNode schemaNode = mapper.readTree(schemaJson) // 加载Schema并指定版本:2020-12用draftV202012Support(),v0.7用draftV7Support() SchemaLoader loader = SchemaLoader.builder() .schemaJson(schemaNode) .draftV202012Support() .build() Schema schema = loader.load().build() // 执行验证并处理结果 try { schema.validate(responseNode) } catch (Exception e) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("JSON Schema验证失败: " + e.getMessage()) }
3. 优化线程安全问题
如果你的Schema是固定不变的,为避免重复加载和线程变量混淆,可将Schema加载逻辑移至Setup Thread Group,把Schema对象存入全局属性:
Setup Thread Group中的脚本:
import org.everit.json.schema.Schema import org.everit.json.schema.loader.SchemaLoader import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.ObjectMapper def schemaJson = '''你的Schema内容''' ObjectMapper mapper = new ObjectMapper() JsonNode schemaNode = mapper.readTree(schemaJson) SchemaLoader loader = SchemaLoader.builder() .schemaJson(schemaNode) .draftV202012Support() .build() Schema schema = loader.load().build() props.put("globalSchema", schema) // 存入全局属性
然后在业务线程组的JSR223 Assertion中直接调用:
import org.everit.json.schema.Schema import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.ObjectMapper def responseJson = prev.getResponseDataAsString() if (responseJson.isEmpty()) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("响应为空,无法执行JSON Schema验证") return } Schema schema = props.get("globalSchema") ObjectMapper mapper = new ObjectMapper() JsonNode responseNode = mapper.readTree(responseJson) try { schema.validate(responseNode) } catch (Exception e) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("JSON Schema验证失败: " + e.getMessage()) }
版本切换说明
- 若使用v0.7版本,需修改两处:
- Schema中的
$schema字段改为"http://json-schema.org/draft-07/schema#" - SchemaLoader配置替换为
.draftV7Support()
- Schema中的
内容的提问来源于stack exchange,提问作者Narek K.
相关产品推荐
相关产品推荐

