HttpRunner 支持 HAR 意味着什麼?

HttpRunner開始支持HAR啦!!!html

若是你尚未體會到這三個感嘆號的含義,那們你可能對HAR還不瞭解。git

HAR 是什麼?

HAR的全稱爲HTTP Archive,是W3C(World Wide Web Consortium)發佈的一個通用標準。簡單地說,HAR是一個約定的JSON文件格式,用於記錄HTTP請求交互的全部內容,包括請求響應的詳細記錄和性能度量數據。github

雖然當前HAR標準還處於Draft狀態,但它已經被業界普遍地採用了,許多咱們平常使用的工具都已支持HAR。在下面羅列的工具中,相信你們都已經比較熟悉了。web

  • Fiddler
  • Charles Web Proxy
  • Google Chrome
  • Firebug
  • HttpWatch
  • Firefox
  • Internet Explorer 9
  • Microsoft Edge
  • Paw
  • Restlet Client

能夠看出,工具覆蓋了主流的抓包工具、瀏覽器和接口測試工具。這些工具都支持HAR標準,能夠將錄製獲得的數據包導出爲.har的文件。json

假如咱們能夠將HAR格式轉換爲HttpRunner的自動化測試用例,這就至關於HttpRunner能夠和很是多的工具結合使用,並得到了接口錄製和用例生成功能,靈活性和易用性都將獲得極大的提高。瀏覽器

那麼,將HAR格式轉換爲HttpRunner的自動化測試用例是否可行呢?bash

咱們不妨先研究下HAR的格式。cookie

HAR 格式詳解

經過如上列出的任意一款工具,均可以將錄製獲得的數據包導出爲.har的文件。咱們採用文本編輯器打開.har文件後,會發現是一個JSON的數據結構。數據結構

默認狀況下,.har文件的JSON數據結構是通過壓縮的,直接看可能不夠直觀。推薦你們能夠在文本編輯器中安裝Prettify JSON的插件,而後就能夠將壓縮後的JSON數據一鍵轉換爲美觀的格式。app

更好的方式是,咱們能夠直接查看W3C編寫的HAR格式標準

經過文檔可知,HAR是隻有一個key的JSON數據結構,而且key值只能爲log;而log的值也爲一個JSON結構,裏面的key包括:versioncreatorbrowserpagesentriescomment

{
    "log": {
        "version": "",
        "creator": {},
        "browser": {},
        "pages": [],
        "entries": [],
        "comment": ""
    }
}複製代碼

其中,versioncreatorentries是必有字段,不論是哪款工具導出的.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

編碼過程沒有太多值得說的,直接看最終成品吧。

最終產出的工具就是har2case,是一個命令行工具,能夠直接將.har文件轉換爲YAMLJSON格式的自動化測試用例。

當前har2case已經上傳到PYPI上了,經過pipeasy_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會更上一個臺階。

若是大家有什麼更好的想法,歡迎聯繫我。

相關文章
相關標籤/搜索