HttpRunner
開始支持HAR
啦!!!html
若是你尚未體會到這三個感嘆號的含義,那們你可能對HAR
還不瞭解。git
HAR
的全稱爲HTTP Archive
,是W3C(World Wide Web Consortium)
發佈的一個通用標準。簡單地說,HAR
是一個約定的JSON
文件格式,用於記錄HTTP
請求交互的全部內容,包括請求響應的詳細記錄和性能度量數據。github
雖然當前HAR
標準還處於Draft
狀態,但它已經被業界普遍地採用了,許多咱們平常使用的工具都已支持HAR
。在下面羅列的工具中,相信你們都已經比較熟悉了。web
能夠看出,工具覆蓋了主流的抓包工具、瀏覽器和接口測試工具。這些工具都支持HAR
標準,能夠將錄製獲得的數據包導出爲.har
的文件。json
假如咱們能夠將HAR
格式轉換爲HttpRunner
的自動化測試用例,這就至關於HttpRunner
能夠和很是多的工具結合使用,並得到了接口錄製和用例生成功能,靈活性和易用性都將獲得極大的提高。瀏覽器
那麼,將HAR
格式轉換爲HttpRunner
的自動化測試用例是否可行呢?bash
咱們不妨先研究下HAR
的格式。cookie
經過如上列出的任意一款工具,均可以將錄製獲得的數據包導出爲.har
的文件。咱們採用文本編輯器打開.har
文件後,會發現是一個JSON
的數據結構。數據結構
默認狀況下,.har
文件的JSON
數據結構是通過壓縮的,直接看可能不夠直觀。推薦你們能夠在文本編輯器中安裝Prettify JSON
的插件,而後就能夠將壓縮後的JSON
數據一鍵轉換爲美觀的格式。app
更好的方式是,咱們能夠直接查看W3C
編寫的HAR
格式標準。
經過文檔可知,HAR
是隻有一個key的JSON
數據結構,而且key值只能爲log
;而log
的值也爲一個JSON
結構,裏面的key包括:version
、creator
、browser
、pages
、entries
、comment
。
{
"log": {
"version": "",
"creator": {},
"browser": {},
"pages": [],
"entries": [],
"comment": ""
}
}複製代碼
其中,version
、creator
和entries
是必有字段,不論是哪款工具導出的.har
文件,確定都會包含這三個字段。而咱們在轉換生成自動化測試用例時,只需獲取HTTP請求和響應的內容,這些全都包含在entries
裏面,所以咱們只須要關注entries
的內容便可。
entries
字段對應的值爲一個列表型數據結構,裏面的值按照請求時間進行排序,羅列出各個HTTP請求的詳細內容。具體地,HTTP請求記錄的信息以下所示:
"entries": [
{
"pageref": "page_0",
"startedDateTime": "2009-04-16T12:07:23.596Z",
"time": 50,
"request": {...},
"response": {...},
"cache": {...},
"timings": {},
"serverIPAddress": "10.0.0.1",
"connection": "52492",
"comment": ""
},
]複製代碼
因而可知,記錄的HTTP信息很是全面,包含了HTTP請求交互過程當中的全部內容。
而從生成自動化測試用例的角度來看,咱們並不須要那麼多信息,咱們只需從中提取關鍵信息便可。
編寫自動化測試用例,最關鍵的信息是要知道接口的請求URL、請求方法、請求headers、請求數據等,這些都包含在request
字段對應的字典中。
"request": {
"method": "GET",
"url": "http://www.example.com/path/?param=value",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [],
"queryString" : [],
"postData" : {},
"headersSize" : 150,
"bodySize" : 0,
"comment" : ""
}複製代碼
根據這些信息,咱們就能夠完成HTTP請求的構造。
當請求發送出去後,咱們要想實現自動化地判斷接口響應是否正確,咱們還須要設置一些斷言。而與HTTP響應相關的全部信息全都包含在response
字段對應的字典中。
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [],
"content": {},
"redirectURL": "",
"headersSize" : 160,
"bodySize" : 850,
"comment" : ""
}複製代碼
從通用性的角度考慮,咱們會判斷HTTP響應的狀態碼是否正確,這對應着status
字段;若是咱們還想在接口業務層面具備更多的判斷,咱們還會判斷響應內容中的一些關鍵字段是否符合預期,這對應着content
字段。
"content": {
"size": 33,
"compression": 0,
"mimeType": "text/html; charset=utf-8",
"text": "\n",
"comment": ""
}複製代碼
對於content
字段,可能會稍微複雜一些,由於接口響應內容的格式可能多種多樣。
例如,響應內容可能text/html
頁面的形式,也多是application/json
的形式,具體類型能夠查看mimeType
獲得,而具體的內容存儲在text
字段中。
另外,有時候響應數據還多是通過編碼的,用的最多的編碼方式爲base64
。咱們能夠根據encoding
字段獲取獲得具體的編碼形式,而後採用對應的解碼方式對text
進行解碼,最終得到原始的響應內容。
"content": {
"size": 63,
"mimeType": "application/json; charset=utf-8",
"text": "eyJJc1N1Y2Nlc3MiOnRydWUsIkNvZGUiOjIwMCwiVmFsdWUiOnsiQmxuUmVzdWx0Ijp0cnVlfX0=",
"encoding": "base64"
},複製代碼
以上面的content
爲例,咱們經過encoding
查看到編碼形式爲base64
,並經過text
字段獲取到編碼後的內容;那麼咱們就能夠採用base64
的解碼函數,轉換獲得原始的內容。
>>> import base64
>>> base64.b64decode(text)
b'{"IsSuccess":true,"Code":200,"Value":{"BlnResult":true}}'複製代碼
同時,咱們根據mimeType
能夠獲得響應內容application/json
數據類型,那麼就能夠對其再進行json.loads
操做,最終獲得可供程序處理的JSON
數據結構。
經過上述對HAR
格式的詳細介紹,能夠看出HAR
格式十分清晰,在對其充分了解的基礎上,再編寫測試用例轉換工具就很簡單了。
編碼過程沒有太多值得說的,直接看最終成品吧。
最終產出的工具就是har2case
,是一個命令行工具,能夠直接將.har
文件轉換爲YAML
或JSON
格式的自動化測試用例。
當前har2case
已經上傳到PYPI
上了,經過pip
或easy_install
便可安裝。
$ pip install har2case
# or
$ easy_install har2case複製代碼
使用方式很簡單,只需在har2case
命令後分別帶上HAR
源文件路徑和目標生成的YAML/JSON
路徑便可。
$ har2case tests/data/demo.har demo.yml
INFO:root:Generate YAML testset successfully: demo.yml
$ har2case tests/data/demo.har demo.json
INFO:root:Generate JSON testset successfully: demo.json複製代碼
能夠看出,具體是生成YAML
仍是JSON
格式的問題,取決於指定目標文件的後綴:後綴爲.yml
或.yaml
則生成YAML
文件,後綴爲.json
則生成JSON
文件。
若是不指定目標文件也行,則會默認生成JSON
文件,文件名稱和路徑與.har
源文件相同。
$ har2case tests/data/demo.har
INFO:root:Generate JSON testset successfully: tests/data/demo.json複製代碼
具體的使用方式能夠經過執行har2case -h
查看。
在大多數狀況下,生成的用例可直接在HttpRunner
中使用,固然,是作接口自動化測試、接口性能測試,仍是持續集成線上監控,這都取決於你。
不過,假如錄製的場景中包含動態關聯的狀況,即後續接口請求參數依賴於前面接口的響應,而且每次調用接口時參數都會動態變化,那麼就須要人工再對生成的腳本進行關聯處理,甚至包括編寫一些自定義函數等。
讀到這裏,相信你們應該能體會到文章開頭那三個感嘆號的含義了,我也的確是帶着難以言表的興奮之情發佈這個新功能的。
通過小範圍的實際使用,效果非常不錯,接口自動化測試用例的編寫效率獲得了極大的提高。並且,因爲HAR
自己的開放性,留給用戶的選擇很是多。
即使如此,我以爲HttpRunner
的易用性還能夠獲得更大的提高。
當前,我規劃了兩項新特性將在近期完成:
PostMan
:將Postman Collection Format
格式轉換爲HttpRunner
支持的YAML/JSON
測試用例;Swagger
:將Swagger
定義的API轉換爲HttpRunner
支持的YAML/JSON
測試用例。等這兩個新特性完成以後,相信HttpRunner
會更上一個臺階。
若是大家有什麼更好的想法,歡迎聯繫我。