rest-assured之Schema validation(包括JSON Schema validation及Xml Schema validation)

  rest-assured从2.1.0版本开始支持  Schema 验证,包括JSON Schema validation及Xml Schema validation。我们之前断言响应体都是一个一个字段来进行断言,这样如果断言的字段比较多的话就非常的麻烦,为了解决这个问题,我们可以使用schema文件来进行响应体的断言,schema文件可以断言整个response 。

1.JSON Schema validation

例如:在classpath下面放置以下的schema文件,products-schema.json:

 1 {
 2     "$schema": "http://json-schema.org/draft-04/schema#",
 3     "title": "Product set",
 4     "type": "array",
 5     "items": {
 6         "title": "Product",
 7         "type": "object",
 8         "properties": {
 9             "id": {
10                 "description": "The unique identifier for a product",
11                 "type": "number"
12             },
13             "name": {
14                 "type": "string"
15             },
16             "price": {
17                 "type": "number",
18                 "minimum": 0,
19                 "exclusiveMinimum": true
20             },
21             "tags": {
22                 "type": "array",
23                 "items": {
24                     "type": "string"
25                 },
26                 "minItems": 1,
27                 "uniqueItems": true
28             },
29             "dimensions": {
30                 "type": "object",
31                 "properties": {
32                     "length": {"type": "number"},
33                     "width": {"type": "number"},
34                     "height": {"type": "number"}
35                 },
36                 "required": ["length", "width", "height"]
37             },
38             "warehouseLocation": {
39                 "description": "Coordinates of the warehouse with the product",
40                 "$ref": "http://json-schema.org/geo"
41             }
42         },
43         "required": ["id", "name", "price"]
44     }
45 }

我们可以通过上面的schema文件来验证 "/products" 这个请求的响应数据是否符合规范:

1 get("/products").then().assertThat().body(matchesJsonSchemaInClasspath("products-schema.json"));

matchesJsonSchemaInClasspath 是从 io.restassured.module.jsv.JsonSchemaValidator 这个类中静态导入的,并且推荐静态导入这个类中的所有方法,然而为了能够使用io.restassured.module.jsv.JsonSchemaValidator 这个类必须依赖 json-schema-validator module ,我们可以从这个网页下载它,或者是通过maven添加以下依赖来获取:

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>3.0.6</version>
</dependency>

1.1 JSON Schema Validation 设置

  rest-assured 的 json-schema-validator module 使用的是 Francis Galiegue‘s  json-schema-validator(fge) 库来实现验证(Validation)。如果想要配置基础 fge 库,我们可以这样写:

1 // Given
2 JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory.newBuilder().setValidationConfiguration(ValidationConfiguration.newBuilder().setDefaultVersion(DRAFTV4).freeze()).freeze();
3
4 // When
5 get("/products").then().assertThat().body(matchesJsonSchemaInClasspath("products-schema.json").using(jsonSchemaFactory));

  这个 using 方法允许我们传递一个jsonSchemaFactory 实例,rest-assured在进行验证的时候就会使用这个实例。这种配置就允许我们在验证响应结果时进行更详细的配置。

  fge 库同时也允许设置validation为 checked或者unchecked,默认情况下rest-assured使用的是checked的validation,如果想要改变这个值,我们可以提供一个 JsonSchemaValidatorSettings 的实例给matcher。例如:

1 get("/products").then().assertThat().body(matchesJsonSchemaInClasspath("products-schema.json").using(settings().with().checkedValidation(false)));

上面的 setting 方法是从 JsonSchemaValidatorSettings 这个类中静态导入的。

1.2  Json Schema Validation静态配置

  让我们来想象一下,假如我们想一直使用unchecked的validation并且想设置Json Schema的版本为3,与其将JsonSchemaValidatorSettings 的实例一个个提供给所有的matchers,我们不如将它定义为一个静态的:

1 JsonSchemaValidator.settings = settings().with().jsonSchemaFactory(
2         JsonSchemaFactory.newBuilder().setValidationConfiguration(ValidationConfiguration.newBuilder().setDefaultVersion(DRAFTV3).freeze()).freeze()).
3         and().with().checkedValidation(false);
4
5 get("/products").then().assertThat().body(matchesJsonSchemaInClasspath("products-schema.json"));

通过上面的方式,现在任意一个导入了  JsonSchemaValidator 的matcher都会使用 DRAFTV3 作为默认的版本并且使用unchecked的validation。

  为了重置 JsonSchemaValidato 为默认的配置,我们可以简单的调用一下 reset 方法来实现:

1 JsonSchemaValidato.reset();

1.3 不依赖rest-assured的JSON Schema Valition

  我们不依赖rest-assured也一样可以使用 json-schema-valition ,只要我们把JSON文件表示为 String 类型,我们可以这么做:

 1 import org.junit.Test;
 2 import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath;
 3 import static org.hamcrest.MatcherAssert.assertThat;
 4
 5 public class JsonSchemaValidatorWithoutRestAssuredTest {
 6
 7
 8     @Test public void
 9     validates_schema_in_classpath() {
10         // Given
11         String json = ... // Greeting response
12
13         // Then
14         assertThat(json, matchesJsonSchemaInClasspath("greeting-schema.json"));
15     }
16 }

2.Xml的 Schema 和 DTD Validation(验证)

  通过使用 Xml Schema(XSD)或者DTD我们同样可以验证Xml响应体。

XSD例子:

1 get("/carRecords").then().assertThat().body(matchesXsd(xsd));

DTD例子:

1 get("/videos").then().assertThat().body(matchesDtd(dtd));

matchesXsd 方法和 matchesDtd 方法属于 Hamcrest matchers 包里,我们需要静态导入 io.restassured.matcher.RestAssuredMatchers

原文地址:https://www.cnblogs.com/lwjnicole/p/8297350.html

时间: 2024-10-13 20:41:08

rest-assured之Schema validation(包括JSON Schema validation及Xml Schema validation)的相关文章

XML Schema学习札记(1)——基础总览

内容整理自:www.w3school.com.cn 转载自:http://www.xgezhang.com/xml_schema_1.html 什么是XML Schema? XML Schema 是基于 XML 的 DTD 替代者. XML Schema 可描写叙述 XML 文档的结构,并对其进行制约和校验. XML Schema 语言也可作为 XSD(XML Schema Definition)来引用. 它能够: 定义可出如今文档中的元素 定义可出如今文档中的属性 定义哪个元素是子元素 定义子

XML Schema

XML Schema 是基于 XML 的 DTD 替代者. XML Schema 描述 XML 文档的结构. XML Schema 语言也称作 XMLSchema 定义(XML Schema Definition,XSD). 实例 <?xml version="1.0"?> <note> <to>George</to> <from>John</from> <heading>Reminder</he

XML文档类型定义---XML Schema结构

5.1 Schema概述 XML Schema是2001年5月正式发布的W3C的推荐标准,经过数年的大规模讨论和开发如今终于尘埃落定,成为全球公认的XML环境下首选的数据建模工具. 使用DTD虽然带来较大的方便,但是,DTD存在一些缺陷:一是它用不同于XML的语言编写,需要不同的分析器技术.这增加了工具开发商的负担,降低了软件瘦身的可能性,此外开发人员需要多学一门语言及其语法.而XML Schema是按标准XML规则编写的,更容易掌握.二是DTD不支持名称空间.随着大部分的数据处理日益以XML为

XML Schema &lt;第三篇&gt;

原文:http://www.cnblogs.com/kissdodog/archive/2013/02/25/2931941.html 验证XML文档是否符合议定的XML结构有两种方法,分别是DTD模式与XML Schema.本文主要介绍XML Schema. 一.XML Schema的优点 XML Schema基于XML,没有专门的语法. XML Schema可以像其他XML文件一样解析和处理. XML Schema支持一系列的数据类型(int.float.Boolean.date等). XM

疯狂XML学习笔记(7)-----------XML Schema

XML Schema 是基于 XML 的 DTD 替代者. XML Schema 可描述 XML 文档的结构. XML Schema 语言也可作为 XSD(XML Schema Definition)来引用. 您应当具备的基础知识 在继续学习之前,您需要对下面的知识有基本的了解: HTML / XHTML XML 以及 XML 命名空间 对 DTD 的基本了解 如果您希望首先学习这些项目,请在 首页 访问这些教程. 什么是 XML Schema? XML Schema 的作用是定义 XML 文档

xml schema 学习笔记

最近研究XML做一些笔记. 最近做xml 方面的开发, 需要对xml schema做些研究,初步理解xml schema是规定了一个xml 文档的如何写.我的理解为xml schema 相当于一个类, xml文档相当于一个对象实例. xml schema中描述了一个以该文档为模式的xml 文档该如何写. 另外NameSpace是个关键点,NameSpace 我理解为一个类名,当要用到该xml schema 时,便用其NameSpace加前缀到相应的元素或属性前面. 在开发相应的项目时,感觉nam

XSD(XML Schema Definition)学习笔记

今天学习了XSD相关的知识,为了以后查找的方便,写一些笔记. 一.什么是XSD? 1.XSD全称:XML Schema Definition.XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD.XML Schema: 定义可出现在文档中的元素 定义可出现在文档中的属性 定义哪个元素是子元素 定义子元素的次序 定义子元素的数目 定义元素是否为空,或者是否可包含文本 定义元素和属性的数据类型 定义元素和属性的默认值以及固定值 XML Schema 在 2001 年 5 月

XML Schema/XSD

                                                                      XML Schema XML Schema 是基于 XML的 DTD替代者. XML Schema 可描述 XML文档的结构. XML Schema 语言也可作为 XSD(XML Schema Definition)来引用. XML Schema: 定义可出现在文档中的元素 定义可出现在文档中的属性 定义哪个元素是子元素 定义子元素的次序 定义子元素的数目

XML详解:第二部分 XML Schema

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4290897.html XML Schema. 22 全局/局部声明/定义... 23 模式与名称空间... 23 目标名称空间... 23 局部元素和属性的限定... 24 未声明目标名称空间... 26 在XML实例文档中引用Schema