javascript
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
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的rest-assured之Schema validation(包括JSON Schema validation及Xml Schema validation)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nature:中国正在上演AI人才争夺战
- 下一篇: Spring Boot 中使用 Rabb