利用JSON Schema校驗JSON數據格式


最近筆者在工作中需要監控一批http接口,並對返回的JSON數據進行校驗。正好之前在某前端大神的分享中得知這個神器的存在,調研一番之后應用在該項目中,並取得了不錯的效果,特地在此分享給各位讀者。

什么是JSON Schema?

       JSON Schema是一組特殊的JSON詞匯,用來標記和校驗JSON數據,也可以理解為一種的對JSON數據格式定義的約定。截至本文撰寫時間,該約定的草案已經演進至第7版(draft-07)。JSON Schema使用一種人機都容易理解的方式來描述已有的數據格式。可用於客戶端校驗用戶提交,或者自動化測試中校驗結果。

如何獲取JSON Schema?

       JSON Schema在各常用語言下基本都有實現,包括:C/C++, Java, JavaScript, PHP, Python, Scala, Go等,不同語言的實現對約定草案的支持程度不盡相同,單就筆者在自動化測試中進行接口返回格式校驗的需求來說均可滿足。

       各位讀者可以在官網鏈接中獲取JSON Schema在不同語言中的實現,請按需取用~

JSON Schema的用法

用過JSON的同學都知道,JSON是構建在以下幾種數據結構上的:

1.object:

       {"name": "picotaro", "age": 38}

2.array:

       ["apple", "pen", "pineapple"]

3.number:

       10086

        3.1415926

 4.string:

        "pen pinapple apple pen"

5.boolean:

        true

        false

6.null:

        null

通過上述這六種數據格式,我們可以自由組合出復雜的JSON數據,比如:

       上面兩個都是有效的JSON數據,那么當我們需要對接口返回進行校驗時,我們該怎么做呢?一般的探活監控可以通過http碼或者錯誤碼來進行識別結果是否正確,但如果我們需要精准校驗json數據的格式呢?難道我們要寫一套復雜的通用邏輯來處理么?不,這個時候我們用JSON Schema就可以啦(眾人:少廢話,show me the code)。

       假設我們需要接口的回顯為第一種格式的數據,那么我們可以定義如下的JSON Schema來描述接口:

       你可能已經注意到JSON Schema本身就是一個JSON數據,因為其本身就是一段數據而非程序,只是一種"描述其他數據的結構"的描述性格式而已,然后校驗器會根據這個schema來判斷數據是否滿足要求。就目前情況來說,第一種會通過,而第二種就會失敗。就這樣,我們通過利用一些簡單的、配置式的定義來完成復雜JSON數據的校驗工作。

以下是上面出現過的配置項的含義:

  1.type: 規定值的類型

  2.required: 規定object下哪些鍵是必須的

  3.properties: 規定object下鍵的格式

  4.const: @since draft-07,常量,值必須等於該常量

  5.enum: 枚舉值,即值只能是enum數組中的某一項

  6.maxLength: 規定字符串的最大長度

  7.maximum: 規定數字的最大值

  8.minimum: 規定數字的最小值

  9.minItems: 規定數組元素的最少個數

       怎么樣,是不是覺得非常簡單?下一節是可用的配置項信息,可以結合自己的實際需要來編寫配置。

配置項

       因最新草案(draft-07)的支持尚不夠廣泛,本文的配置項以舊版(draft-04)為准。

通用配置

 1.type: string/array, 規定值的類型只能從6個基礎類型中選擇:number/integer, string, object, array, boolean, null

  2.enum: array, 規定值必須等於該枚舉數組中的某一項

number/integer

number和integer作為共享關鍵字,不得同時出現。兩者分別表示數字和整形

  1.multipleOf: number, 規定值必須為該項的倍數

  2.maximum: number, 規定值必須小於等於該項

  3.exclusiveMaximum: boolean, 如果出現該項且不為false,那么值就必須小於maximum

  4.minimum: number, 規定值必須大於等於該項

  5.exclusiveMinimum: boolean, 如果出現該項且不為false,那么值就必須大於minimum

string

  1.maxLength: integer, 規定值的長度必須小於等於該項

  2.minLength: integer, 規定值的長度必須大於等於該項

  3.pattern: string, 正則表達式,規定值必須匹配該項

object

  1.maxProperties: integer, 規定值所包含的鍵值個數必須小於等於該項

  2.minProperties: integer, 規定值所包含的鍵值個數必須大於等於該項

  3.required: array, 規定哪些鍵必須出現

  4.properties: object, 該項的鍵為值中可能出現的鍵,該項的值為有效的schema數據。參考上一節的例子

  5.patternProperties: object, 該項的鍵為正則表達式,用以匹配可能出現鍵,該項的值為有效的schema數據

Example:

  6.additionalProperties: boolean/object, 該項比較復雜

   6.1.如果出現該項且為false,那么當對象所有的鍵經過properties和patternProperties匹配后仍有剩余的,即出錯

     6.2.如果該項為object,那么其中定義了經過properties和patternProperties匹配后剩余的鍵的特性

Example:

  7.dependencies: object, 如果出現了某個鍵則其依賴的鍵也必須出現

     7.1.屬性依賴, 則dependencies中每個鍵的值為array,數組的元素該鍵的依賴

Example:

      7.2.schema依賴,則dependencies中每個鍵的值為object,該對象中通過properties指定其依賴的鍵

Example:

array

 1.items: 規定每個元素的特性

     1.1.object, 一個有效的schema,對所有數據的元素應用該校驗方式

Example:

     1.2.array,每個元素均為一個有效的schema,用一一對應的方式對數組中的元素進行校驗

Example:

 2.additionalItems: boolean, 如果出現該項且為false,那么items中值為array的情況下,對應數據中不可出現額外的項

Example:

 3.maxItems: integer, 規定元素個數必須小於等於該項

 4.minItems: integer,規定元素個數必須大於等於該項

 5.uniqueItems: boolean, 如果出現該項且為true,那么數組中的每個元素都不能相同

boolean

無單獨配置項

null

無單獨配置項

小結

       有了JSON Schema這個神器,接口測試的數據校驗變得簡單了不少,作為接口監控腳本的一部分,也很容易知道結果中哪部分出了問題。實在是居家旅行、測試開發,必備良葯。

 

轉自:https://mp.weixin.qq.com/s/iWAyKpdbN3pVwKKJDyGstA

 

---------------------------------------------------------------------------------

關注微信公眾號即可在手機上查閱,並可接收更多測試分享~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM