自动化接口断言-Json schema验证

应用场景:

在做接口测试阶段时,我们需要对返回的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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。