最近參與了一個項目,團隊有自動化測試訴求,可是測試人員沒有編程能力,開發人員也沒有精力幫忙,探索了已有的自動化測試工具,知足不了團隊需求後,決定本身造個輪子。git
Postman是一個不須要編碼能力,且十分方便的自動化測試工具,因爲項目中不少測試的驗證點須要驗證數據庫裏面數據的正確性,若是用Postman的話須要爲測試建立一些沒有必要的HTTP API。很遺憾, 這個輪子不知足咱們的要求。github
咱們探索的第二個工具是Rest-assured. 雖然他對API測試相關操做封裝了很簡潔美觀的DSL, 因爲其直接是Java代碼,像數據庫校驗什麼的毫無困難。可是要編寫基於Rest-assured的自動化測試,還得有必定的編碼基礎,很遺憾,這個輪子咱們用不來。sql
Cucumber支持天然語言形式編寫自動化測試,天然語言調用的是代碼,若是對cucumber作了足夠好的封裝,編寫測試的人不須要編寫代碼也能寫自動化測試。那就須要作足夠通用的封裝,因此Pandaria就是基於cucumber jvm封裝的HTTP(S) API自動化測試的DSL。Cucumber自己功能很是實用,使用pandaria依然可以直接使用cucumber jvm的全部功能。數據庫
在測試團隊缺少編碼能力,以及須要驗證數據庫的需求背景下,咱們嘗試着基於cucumber作封裝,使不會寫代碼的測試人員也能編寫自動化測試。以後咱們很驚訝的發現這種方式很是有效,因此將這個工具分享出來,但願能對有相同訴求的團隊有所幫助。編程
Scenario: simple get
* uri: /users/me
* send: GET
* status: 200
* verify: '$.username'='jakim'
* verify: '$.age'=18
複製代碼
使用pandaria寫API自動化測試,就像上面這樣,只須要使用抽象好的關鍵字,描述發送請求的過程,以及編寫你的驗證條件便可。json
上述代碼解讀: 往相對路徑uri爲/users/me
的地址發送GET請求,並驗證返回狀態爲200,且返回體裏面json path爲$.username
的值爲'jakim'
,json path $.age
處的值爲18
。api
* query:
""" SELECT NAME, AGE FROM USERS """
* verify: '$[0].name'='jakim'
* verify: '$[0].age'=18
複製代碼
或者bash
* query: select.sql
* verify: '$[0].name'='jakim'
* verify: '$[0].age'=18
複製代碼
SELECT NAME, AGE FROM USERS
複製代碼
測試人員只用寫SQL就能像校驗json同樣校驗數據庫內容。上述代碼會使用SQL語句SELECT NAME, AGE FROM USERS
到數據庫中查詢,並驗證返回結果的第1行的name
和age
屬性。restful
準備測試數據能夠直接執行SQL文件:異步
* execute sql: prepare_users.sql
* execute sql:
""" insert into users(name) values('test'); """
複製代碼
自動化測試常常須要等待一件事情完成,特別是異步操做時,這時候一般的作法是等待必定的時間,驗證結果,若是不經過,則重試必定的次數,直到驗證成功,或者超過最大次數失敗。使用Pandaria能夠這麼寫:
* wait: 1000ms times: 3
* uri: /sequence
* send: GET
* response body:
""" 3 """
複製代碼
上述代碼會往/sequence
發請求,並驗證返回消息體是否等於3
,若是等於則繼續往下執行,若是失敗則等待1000ms,而後重試,若是重試超過最大3
次,則測試失敗。
也能夠等待數據庫中數據知足某個條件
* wait: 1000ms times: 3
* query: select.sql
* verify: '$[0].name'='jakim'
* verify: '$[0].age'=18
複製代碼
不少時候restful api的uri的路徑中包含數據庫自增加的ID, 其多是一個異步操做生成,致使咱們不能直接從API返回結果中拿到,只能從數據庫中根據測試數據的條件查找,並在後續API測試中使用,使用pandaria咱們能夠這麼寫:
* query:
""" select id from users where name='test-user-name'; """
* var: 'auto_generated_id'<-'$[0].id'
* uri: /users/${auto_generated_id}
* send: GET
* verify: '$.id'=${auto_generated_id}
* verify: '$.name'='test-user-name'
複製代碼
上述代碼首先從數據庫查出自增加的id
,而後使用<-
操做符將結果中的id
定義爲名爲auto_generated_id
的變量,並在後續的操做中使用這個變量。
Pandaria目前還在持續開發中,咱們發現其已經能對咱們團隊帶來切實的效率提高,故藉此機會分享出來,但願能幫助到相似的團隊。