python api介面測試---講解
阿新 • • 發佈:2018-12-19
講解+體會
一般攜帶引數的地方就在,url,訊息頭,訊息體裡面。 訊息頭裡面,沒說就是沒有引數。訊息頭的格式是不用我們關心的,就是www-from-urlencode(鍵值對) 訊息體的格式,看訊息頭裡面的Content-Type
import requests #訊息體的格式是www-from-urlencode,構建字典傳參 payload = { "action" : "add_course", "data":"""{ "name":"初中化學", "desc":"初中化學課程", "display_idx":"4" } """ } #data引數是json格式的字串,在python裡面表示換行的字串,用3個引號。當然不換行也可以,那就不需要3引號了。json裡面的都是雙引號
#傳送post請求 data接收的是字典型別的,會自動轉化成urlencode格式 res = requests.post(“http://localhost/api/mgr/sq_mgr/”,data=payload) #返回的是request庫裡面的response物件
#如果要獲取響應的訊息體的內容的字串格式就呼叫res.text,返回的是字串型別的物件。只不過字串的內容符合json格式的。如果要檢查裡面的內容,可以用切片,和字串split的方法等。如果訊息體是json格式,就可以呼叫json方法。基本都可以呼叫json方法…json()方法返回的是:把json格式的字串轉化成對應的python裡面的物件。不一定是字典。要看json裡面原來是什麼。可能是列表,字典,正數2也行。
retObj = res.json()
print(retObj) #python物件,可以打印出來看看
#有一個很實際的問題,如何寫一個用例確保,每次新增的課程名不存在:可以用隨機數(在很大範圍裡面),可以加時間戳。如果一串程式碼要頻繁的重寫,要做成函式,方便呼叫。可以單獨做一個庫檔案。
程式碼: (lib檔案裡面,封裝的程式碼)
import requests import pprint #pprint打印出來比較好看 #新增課程的函式 #課程名由呼叫者決定,做好做成引數 def api_add_course(name,desc,idx): #訊息體的格式是www-from-urlencode,構建字典傳參 payload = { "action" : "add_course", "data":"""{ "name":"%s", "desc":"%s", "display_idx":"%s" } """%(name,desc,idx) } #data引數是json格式的字串,在python裡面表示換行的字串,用3個引號。當然不換行也可以,那就不需要3引號了。json裡面的都是雙引號 #傳送post請求 data接收的是字典型別的,會自動轉化成urlencode格式 res = requests.post("http://localhost/api/mgr/sq_mgr/",data=payload) #返回的是request庫裡面的response物件 #如果要獲取響應的訊息體的內容的字串格式就呼叫res.text,返回的是字串型別的物件。只不過字串的內容符合json格式的。如果要檢查裡面的內容,可以用切片,和字串split的方法等。如果訊息體是json格式,就可以呼叫json方法。基本都可以呼叫json方法..json()方法返回的是:把json格式的字串轉化成對應的python裡面的物件。不一定是字典。要看json裡面原來是什麼。可能是列表,字典,正數2也行。 retObj = res.json() pprint.pprint(retObj) #python物件,可以打印出來看看 #返回的是響應中訊息體對應的物件 return retObj #列出課程的api def api_list_course(): #傳送post請求 data接收的是字典型別的,會自動轉化成urlencode格式 res = requests.get("http://localhost/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20") #返回的是request庫裡面的response物件 #如果要獲取響應的訊息體的內容的字串格式就呼叫res.text,返回的是字串型別的物件。只不過字串的內容符合json格式的。如果要檢查裡面的內容,可以用切片,和字串split的方法等。如果訊息體是json格式,就可以呼叫json方法。基本都可以呼叫json方法..json()方法返回的是:把json格式的字串轉化成對應的python裡面的物件。不一定是字典。要看json裡面原來是什麼。可能是列表,字典,正數2也行。 retObj = res.json() pprint.pprint(retObj) #python物件,可以打印出來看看,不能改diamante去檢查,用return返回的話,可以讓程式碼檢查 #返回的是響應中訊息體對應的物件 return retObj
呼叫者裡面的程式碼:
from lib import * #也可以import 呼叫函式的時候,前面加上lib.函式名》》》lib.api_add_course()
from datetime import datetime #匯入這個,在這題裡,主要是讓每次新增的課程不一樣
curTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
coureListBefore = api_list_course()["retlist"] #字典的取值。沒加課程之前,先列出下課程,方便新增課程之後的比較
name = "python"+curTime #方便後面驗證課程名
ret = api_add_course(name,"python課程",2) #新增課程名 他的返回值是響應的訊息體所對應的物件
#檢查retcode是否為0
if ret["retcode"] ==0:
print("新增課程的返回碼為0")
else:
print(f'新增課程的返回碼為{ret["retcode"]}!!!') #格式化輸出
#呼叫課程介面,看新加的課程是不是在裡面
coureListafter = api_list_course()["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 ===============")
控制的輸出:
“”"
{'retcode': 0,
'retlist': [{'desc': 'python課程',
'display_idx': 2,
'id': 1024,
'name': 'python2018-11-03 15:39:08'}],
'total': 1}
{'id': 1029, 'retcode': 0}
新增課程的返回碼為0
{'retcode': 0,
'retlist': [{'desc': 'python課程',
'display_idx': 2,
'id': 1024,
'name': 'python2018-11-03 15:39:08'},
{'desc': 'python課程',
'display_idx': 2,
'id': 1029,
'name': 'python2018-11-03 15:49:26'}],
'total': 2}
=============== test case pass ===============