背景
最近參與了一個項目,團隊有自動化測試訴求,但是測試人員沒有編程能力,開發人員也沒有精力幫忙,探索了已有的自動化測試工具,滿足不了團隊需求后,決定自己造個輪子。
- Postman
Postman是一個不需要編碼能力,且十分方便的自動化測試工具,由于項目中很多測試的驗證點需要驗證數據庫里面數據的正確性,如果用Postman的話需要為測試創建一些沒有必要的HTTP API。很遺憾, 這個輪子不滿足我們的要求。
- Rest-assured
我們探索的第二個工具是Rest-assured. 雖然他對API測試相關操作封裝了很簡潔美觀的DSL, 由于其直接是Java代碼,像數據庫校驗什么的毫無困難。但是要編寫基于Rest-assured的自動化測試,還得有一定的編碼基礎,很遺憾,這個輪子我們用不來。
- Cucumber
Cucumber支持自然語言形式編寫自動化測試,自然語言調用的是代碼,如果對cucumber做了足夠好的封裝,編寫測試的人不需要編寫代碼也能寫自動化測試。那就需要做足夠通用的封裝,所以Pandaria就是基于cucumber jvm封裝的HTTP(S) API自動化測試的DSL。Cucumber本身功能非常實用,使用pandaria依然能夠直接使用cucumber jvm的所有功能。
Pandaria
在測試團隊缺乏編碼能力,以及需要驗證數據庫的需求背景下,我們嘗試著基于cucumber做封裝,使不會寫代碼的測試人員也能編寫自動化測試。之后我們很驚訝的發現這種方式非常有效,所以將這個工具分享出來,希望能對有相同訴求的團隊有所幫助。
測試HTTP API
Scenario: simple get
* uri: /users/me
* send: GET
* status: 200
* verify: '$.username'='jakim'
* verify: '$.age'=18
使用pandaria寫API自動化測試,就像上面這樣,只需要使用抽象好的關鍵字,描述發送請求的過程,以及編寫你的驗證條件即可。
上述代碼解讀: 往相對路徑uri為/users/me
的地址發送GET請求,并驗證返回狀態為200,且返回體里面json path為$.username
的值為'jakim'
,json path $.age
處的值為18
。
驗證數據庫
* query:
"""
SELECT NAME, AGE FROM USERS
"""
* verify: '$[0].name'='jakim'
* verify: '$[0].age'=18
或者
* query: select.sql
* verify: '$[0].name'='jakim'
* verify: '$[0].age'=18
select.sql
SELECT NAME, AGE FROM USERS
測試人員只用寫SQL就能像校驗json一樣校驗數據庫內容。上述代碼會使用SQL語句SELECT NAME, AGE FROM USERS
到數據庫中查詢,并驗證返回結果的第1行的name
和age
屬性。
準備測試數據可以直接執行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目前還在持續開發中,我們發現其已經能對我們團隊帶來切實的效率提升,故借此機會分享出來,希望能幫助到類似的團隊。