初使用RequestsLibrary做接口測試時,你會不會感到困惑,為什么會有${resp.content}, ${resp.status_code}這樣的寫法,這個status_code什么鬼,f5查的時候怎么沒說明這個東西,為什么寫Demo的人知道可以這么寫,我少寫個’_’可不可以,還有其它啥高端玩法是我不知道的,這玩意的使用說明到底保存在哪啊喂!
說到這個,我們先來了解一下,返回的${resp}是個什么類型的對象,在rf上用個巧妙的方法查看:
運行這段腳本,第4行的打印結果是:INFO : <class 'requests.models.Response'>
從結果可以看出${resp}是一個類對象,源碼可在requests/models/Response查看,對象句點操作一般是取對象屬性,順藤摸瓜,找出該類的所有屬性,第6行打印結果:
['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__iter__', '__module__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']
粗體的是比較重要的,今后會被頻繁使用的屬性:
content: 響應body的內容,二進制編碼,如果返回只有文本內容,和text差不多
cookies:響應回寫的cookies,cookieJar類對象
headers: 響應頭內容
json(): 響應body內容,json格式
status_code: 狀態碼
text: 響應body的內容,默認unicode編碼
一、狀態碼
狀態碼什么的,百度上講的肯定比我講得清楚,我就不講了。
另外,一般來說,系統內部會有一個自定義的響應碼,與http的狀態碼不可混淆。
這里主要講一下RequestsLibrary中對30X狀態碼的處理,默認情況下,RequestsLibrary的重定向是開着的,也就是說,如果請求返回的狀態碼為302,它會自動幫你訪問重定向地址,並最終返回重定向地址的狀態碼。具體畫風如何,請查看Demo:
二、處理一個簡單的響應
響應body:
{
"origin": "183.16.189.96"
}
不多說了,看圖:第8行關鍵字需導入Collections庫
三、處理多層級的響應body
這是一個一般復雜的響應body,多層級的json,實際中,你可能要取到某個nickName為“
test1”的數據並校驗。
{
"api": "api.name",
"v": "1.0",
"code": "10000",
"error_msg": "success",
"data": {
"userlist": [{
"uid": "94901",
"nickName": "test1",
}, {
"uid": "1010640",
"nickName": "test2",
}, {
"uid": "1012130",
"nickName": "test3",
}]
}
}
還是希望大家有點python基礎,這種json返回格式,一層層地來抽絲剝繭,{}為字典,用字典運算符,為list,用列表運算符,假設上面那個json是我的響應body。
取第一個nickName的值應該是這樣:${resp.json()[‘data’][‘userlist’][0][‘nickName’]},log該變量,值應為:test1。用大白話解釋這個表達式就是:把最外面的字典里的data的值里邊的userlist的值的第一個字典元素取出來,再對這個字典里的nickName的值。好吧,我已經盡我最大能力翻譯了。
另外還有人,可能想一次把所有列表中的nickName取了,也有個簡單的辦法:
這個用法有點炫酷,細說起來可以整成一個熟練使用rf+evaluate裝逼指南系列。這是題外話了。對於初學者,還是1 要懂點python, 2 要懂rf和python之間的表達切換,rf里最好的調試語句是log。建議多寫多log。