1. 程式人生 > >python api介面測試---要驗證登入狀態的介面

python api介面測試---要驗證登入狀態的介面

***

  • 有些測試系統為了演示多方便,會將登入的校驗去掉。不登入也可以用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作為引數,構建請求時,可以用到。