天天看點

技術分享 | 接口自動化測試如何處理 Header cookie

Cookie(複數形态:Cookies)是某些網站為了辨識使用者身份而儲存在使用者本地終端上的資料。在接口測試過程中,如果網站采取了 Cookie 認證的方式,那麼發送的請求需要附帶 Cookie,才會得到正常的響應的結果。接口自動化測試也是同理,需要在構造接口測試用例時加入 Cookie。

實戰練習

對于要對 Cookie 進行驗證的網站發起請求,如果在請求過程中沒有傳遞 Cookie 資料,則會傳回錯誤的響應結果。下面的實戰以雪球為例。

沒有 Cookie 資料的場景

下方示例對雪球的 url 發起一個 get 請求,在請求過程中沒有添加 Cookie 資料。

>>> import requests
>>>
>>> url="https://xueqiu.com/stock/search.json"
>>> params={"code": "sogo", "size": "3", "page": "1"}
>>> header={ "Accept": "application/json",
...          "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) \
    AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
...          }
>>> r = requests.get(url, params=params, headers=header)
>>> r.text
'{"error_description":
"遇到錯誤,請重新整理頁面或者重新登入帳号後再試",\
"error_uri":"/stock/search.json",
"error_code":"400016"}'      

由上面的例子可以看到,如果在請求過程中沒有添加 Cookie 資料,結果報錯,要求登入賬号。

添加 Cookie 的場景

接下來,在請求過程中添加正确的 Cookie 資訊,即可得到正常的響應資訊。

Python 版本

同樣通路雪球,通過關鍵字參數 cookies 傳遞正确的 Cookie 資料。

>>> import requests
>>>
>>> url="https://xueqiu.com/stock/search.json"
>>> params={"code": "sogo", "size": "3", "page": "1"}
>>> header={ "Accept": "application/json",
...          "User-Agent": "Mozilla/5.0 \
    (Macintosh; Intel Mac OS X 10_14_6)\
     AppleWebKit/537.36 (KHTML, like Gecko) \
     Chrome/77.0.3865.90 Safari/537.36",
...          }
>>> cookies={
    "xq_a_token":"...省略..."
    }
>>> requests.get(url,
params=params, headers=header, cookies=cookies).text
'{"q":"sogo","page":1,"size":3,"stocks":
[{"code":"SOGO","name":"搜狗",
"enName":"","hasexist":"false","flag":null,
"type":0,"stock_id":1029472,"ind_id":0,
"nd_name":"通訊業務","ind_color":null,
"_source":"sc_1:1:sogo"}]}'      

Java 版本

在 Java 中,可以使用 cookie() 方法傳入雪球所需要的 Cookie 資料資訊。

import static io.restassured.RestAssured.*;

public class Requests {
    public static void main(String[] args) {
        given().
                params("code", "sogo", "size", 3, "page", 1).
                cookie("xq_a_token", "...省略...").
                when().
                get("https://xueqiu.com/stock/search.json").
                then().statusCode(200).log().all();
    }
}