应用场景:
在做接口测试阶段时,我们需要对返回的json文件的字段必填项、数据类型和格式与原有的接口文档做基本的对比校验
解决:
使用json-schema-inferrer库,可根据json文档自动生成对应的json schema文档
步骤:
1.设置maven pom.xml
<dependency>
<groupId>com.github.fge</groupId>
<artifactId>json-schema-validator</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>com.github.saasquatch</groupId>
<artifactId>json-schema-inferrer</artifactId>
<version>0.1.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.2</version>
</dependency>
2.工具类方法实现
package com.cn.bluemoon.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.saasquatch.jsonschemainferrer.*;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Objects;
// 加载路径src/test/resources/templateOutput下所有的文件全部同步生成jsonschema文件到src/test/resources/jsonschema
public class JsonSchemaGenerator {
public static final String path = "src/test/resources/templateOutput";
public static final String outputPath = "src/test/resources/jsonschema";
private static final ObjectMapper mapper = new ObjectMapper();
private static final JsonSchemaInferrer inferrer = JsonSchemaInferrer.newBuilder()
.setSpecVersion(SpecVersion.DRAFT_06)
// .addFormatInferrers(FormatInferrers.email(), FormatInferrers.ip())
.setAdditionalPropertiesPolicy(AdditionalPropertiesPolicies.notAllowed())
.setRequiredPolicy(RequiredPolicies.nonNullCommonFields())
.addEnumExtractors(EnumExtractors.validEnum(java.time.Month.class),
EnumExtractors.validEnum(java.time.DayOfWeek.class))
.build();
public static void generatorAll() {
File folder = new File(path);
if (!folder.exists() || !folder.isDirectory()) {
return;
}
for (File file : Objects.requireNonNull(folder.listFiles())) {
if (file.isDirectory()) {
continue;
}
try {
InputStream stream = new FileInputStream(file);
String jsonSchema = inferrer.inferForSample(mapper.readTree(stream)).toPrettyString();
File jsonSchemaFile = new File(outputPath + "/" + file.getName());
System.out.println("Generation json schema: " + jsonSchemaFile.getPath());
FileUtils.write(jsonSchemaFile, jsonSchema);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
// public static void main(String[] args) throws URISyntaxException {
// generatorAll();
//}
}
- 将工具类方法在接口脚本前运行生成对应的 json schema文档
public class OrderDetail extends CleanBase {
@BeforeTest
public void init(){
JsonSchemaGenerator JsonToSchema = new JsonSchemaGenerator();
JsonToSchema.generatorAll();
}
---接口脚本
3.实现
输入
{
"token": "",
"pageSize": 20,
"pageNum": 1,
"tabType": 1
}
输出
{
"$schema" : "http://json-schema.org/draft-06/schema#",
"type" : "object",
"properties" : {
"pageSize" : {
"type" : "integer"
},
"tabType" : {
"type" : "integer"
},
"pageNum" : {
"type" : "integer"
},
"token" : {
"type" : "string"
}
},
"additionalProperties" : false,
"required" : [ "pageSize", "tabType", "pageNum", "token" ]
}
执行结果
image.png
补充:
1.可借助网站手动生成json schema文档(https://extendsclass.com/json-schema-validator.html)
2.优化生成的json schema脚本,中间可使用正则匹配(如若对正则表达式不太熟悉的话可借助工具https://www.bazhuayu.com/tutorial8/81zz)