python api介面測試---要驗證登入狀態的介面
阿新 • • 發佈:2018-11-29
***
- 有些測試系統為了演示多方便,會將登入的校驗去掉。不登入也可以用api 實際的系統需要攜帶正確得到id才能呼叫後面的介面成功
登入的目的是後續的請求中攜帶sessionid,sessionid哪來的?是登入的時候響應訊息裡面建立的。
登入成功後,返回的結果裡有一個set_cookie,cookie裡面就有sessionid
要取到sessionid,後續的請求里加上
先登入,獲取到sessionid
def api_login(username,password): payload = { "username": username, "password": password } #就是引數傳進來的使用者名稱,密碼 res = requests.post("http://localhost/api/mgr/loginReq",data=payload) retObj = res.json() pprint.pprint(retObj) # 如何獲取響應訊息體裡面的set_cookie欄位 # 1.print(res.headers["Set-Cookie"]) #結果是:字串sessionid=5xa0w1katbt0rddw04frp10jtvq94cb3; HttpOnly; Path=/ 利用字串的split方法,取出sessionid。看看文件,還有更好的方法 #print(res.cookies["sessionid"]) #最快的方法 h2tm183v7u6dcwec0o8xmxm6z4pxncvi return retObj,res.cookies["sessionid"] #下面的介面,可以把sessionid傳進去
下面的問題就是,如何在下面的介面上,加上cookie的內容
方法1:定義headers,拼接cookie :
def api_list_course(sessionid): headers = { "cookie": "sessionid=" + sessionid } #傳送post請求 data接收的是字典型別的,會自動轉化成urlencode格式 res = requests.get("http://localhost/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20",headers=headers) #返回的是request庫裡面的response物件 retObj = res.json() pprint.pprint(retObj) #返回的是響應中訊息體對應的物件 return retObj
方法2:可以直接使用cookie引數 :
def api_list_course(sessionid): #傳送post請求 data接收的是字典型別的,會自動轉化成urlencode格式 res = requests.get("http://localhost/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20",cookies={"sessionid":sessionid}) #返回的是request庫裡面的response物件 retObj = res.json() pprint.pprint(retObj) #返回的是響應中訊息體對應的物件 return retObj ***
*
ret,sessionid = api_login(“auto”,“sdfsdfsdf”) #login 函式返回的是:return retObj,res.cookies[“sessionid”],一個是json,一個是sessionid.是一個元組 這裡把sessionid到,以後的引數裡面都可以傳sessionid,就能有登入態了。用例裡面的函式呼叫的時候,只要先登入一下就行了
from lib import * #也可以import 呼叫函式的時候,前面加上lib.函式名》》》lib.api_add_course()
from datetime import datetime #匯入這個,在這題裡,主要是讓每次新增的課程不一樣
ret,sessionid = api_login("auto","sdfsdfsdf") #先呼叫登入介面,將返回值的sessionid賦值給變數sessionid
curTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
coureListBefore = api_list_course(sessionid)["retlist"] #字典的取值。沒加課程之前,先列出下課程,方便新增課程之後的比較
name = "python"+curTime #方便後面驗證課程名
ret = api_add_course(name,"python課程",2,sessionid) #新增課程名 他的返回值是響應的訊息體所對應的物件
#檢查retcode是否為0
if ret["retcode"] ==0:
print("新增課程的返回碼為0")
else:
print(f'新增課程的返回碼為{ret["retcode"]}!!!') #格式化輸出
#呼叫課程介面,看新加的課程是不是在裡面
coureListafter = api_list_course(sessionid)["retlist"] #就是在這樣的python物件中找資料,是python基礎的問題,類似如下的資料結構
# {'retcode': 0,
# 'retlist': [{'desc': 'java課程', 'display_idx': 1, 'id': 995, 'name': 'java'},
# {'desc': '初中化學課程', 'display_idx': 4, 'id': 1018, 'name': '初中化學'}],
# 'total': 2}
#思路1,咋子新增課程之前,可以先呼叫列成課程的介面,新增完在呼叫一下,兩者比一下,是不是就多出一個
#有這樣的語法:main_list = list(set(list_2)-set(list_1)) set是不允許出現重複的,類似於集合一樣的東西
#思路2,自己寫程式碼,用for迴圈
added = [] #就是新新增的課程
for one in coureListafter: #在新增後的課程列表裡找
if one not in coureListBefore: #如果不在之前的列表中,就是新加的
added.append(one)
#首先判斷先增加的只有一門課程
#assert 是斷言的關鍵字,第一個引數如果是True,他就認為檢查點通過,否則就認為檢查點失敗
try:
assert len(added) ==1 #如果不等於1,檢查點就失敗,丟擲異常
newcourse = added[0] #取出第一個元素,然後檢查每一個資訊是否是之前新加的課程資訊
assert newcourse["name"] == name
assert newcourse["desc"] == "python課程"
assert newcourse["display_idx"] == 2
# print(newcourse) 可以打印出來看看
print("\n=============== test case pass ===============")
except:
print("\n=============== test case faild ===============")
對有登入驗證的系統,先登入獲取sessionid。把sessionid作為引數,構建請求時,可以用到。