前言
5月初的時候,接到上頭需求,要求5月底做一次接口測試分享,不巧5月最后10天需求特別多,所以就在加班空隙寫了一個稿子,如下文。
有點簡單,只是一個概要,大部分語言還是自己組織,中間順便寫了幾個demo,大概花了一個多小時,最終也算順利分享完成。
常用抓包工具
開發者工具F12
wireshark
fiddler
burpsuite
charles(選用)
tcpdump
mitmproxy
接口分析
- URL 請求地址
- response code 狀態碼
- 200 ok
- 400 請求參數錯誤
- 404 請求失敗,資源在服務器上未發現
- 500 服務器出現錯誤
- 504 未收到響應
- Method get、post、put、delete等。
- Query String 請求參數
- Response 響應
接口測試方法
-
工具:
Postman Jmeter SoapUi curl命令
-
代碼:
RobotFramework
python + urlib / requests (選用)
java + httpclient / rest-assurd
-
用例管理:
yaml json xml Excel(選用)
結構介紹
主要依賴Excel管理用例,讀取表格中相關數據后發送請求,并將結果寫入一個新的Excel表格中。
讀取Excel
-
依賴第三方庫:
- xlrd
-
主要思路:
將所有測試數據讀取----保存在一個list中,該list有一個個dict組成
一行用例是一個dict,key為第一個行標題,value為對應的單元格中的值
核心代碼:
path = os.path.abspath(fpath)
myworkbook = xlrd.open_workbook(path)
mysheets = myworkbook.sheets()
data = []
l_col_names = []
datas = []
l_data = mysheet.row_values(i) #返回一個列表
if i == 0:
l_col_names = l_data
else:
c = len(l_col_names) - len(l_data)
for i in range(c):
l_data.append('') # 缺少元素用''補
data.append({k: v for k, v in zip(l_col_names, l_data)}) #生成個key為第一行數據,value為下面行的數據 dict
datas.append(data) #最終將所有的數據都存在一個list datas中
發送請求
-
依賴第三方庫:
- requests (核心)
-
主要思路:
將讀取到的Excel內容(URL、Method、Body等)按照格式發送請求,并返回結果。
將請求返回的test_name, code, cost_time, case_name, host, message, isok, url, body的信息,裝入列表中
發送請求核心代碼:
def post(url, body, headers): #post請求,url,body,headers均來自于讀取到的Excel內容
start = time.time()
body = json.loads(body)
r = requests.post(url, data=body, headers=headers)
body = r.text
status = r.status_code
message = r.reason
end = time.time()
return status, message, body, end - start #返回的結果用于寫入Excel中
def get(url, headers): #get請求
start = time.time()
r = requests.get(url, headers=headers)
message = r.reason
status = r.status_code
body = r.text
end = time.time()
return status, message, body, end-start
def do_resultV_temp(url, body, headers, result_code, test_name, case_name, host, case_result, method):
try:
(HTTPRESP, HTTPMSG, RESP_BODY, LATTENCY) = post(url, body, headers)
case_result_code = "ERROR"
if HTTPRESP == 200:
cost_time = int(LATTENCY * 1000) # 接口請求耗時
code = json.loads(RESP_BODY)['code'] # code
if str(code) == str(result_code):
case_result_code = 'PASS'
# 1604 測試環境 文章不足導致
elif str(code) == '-1604':
case_result_code = 'PASS'
else:
case_result_code = 'FAIL'
isok = case_result_code
message = json.loads(RESP_BODY)['message']
post_result = [test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method] #將相關結果存入一個list中
case_result.append(post_result)
else:
cost_time = '3000'
isok = case_result_code
message = 'ERROR'
post_result = [test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method]
case_result.append(post_result)
return RESP_BODY
except Exception, ex:
code = "%s ERROR" % HTTPRESP
RESP_BODY = ex
isok = 'FAIL'
message = 'ERROR'
cost_time = '3000'
RESP_BODY = str(RESP_BODY)
post_result = [test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method]
case_result.append(post_result)
return RESP_BODY
def run(fpath):
l_data = file_utils.case_xlsx_loader(fpath)
results = [] # 這邊的result就是上面的case_result
run_test(l_data, results)
return results
def excute(fpath):
all1 = run(fpath) # 這邊調用run方法,返回所有的測試結果,就是上面的[test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method] 列表
all = all1
all_result = []
for item in all:
result = {}
result['test_path'] = item[0]
result['test_time'] = item[2]
result['test_code'] = item[1]
result['test_name'] = item[3]
result['test_url'] = item[4]
result['test_message'] = item[5]
result['test_result'] = item[6]
result['test_request'] = str(item[7])
result['test_body'] = item[8]
result['test_response'] = item[9]
result['test_method'] = item[10]
all_result.append(result) #以dict的形式,保存測試結果
new_all_result = []
new_all_result = coding.to_unicode(all_result)
return new_all_result
保存結果
-
依賴第三方庫:
- xlsxwritter
-
主要思路:
將 excute 這個方法返回的所有測試結果,根據key讀取value并以此寫入表格對應的列中
-
核心代碼:
def test_detail(fpath, worksheet, workbook): test_data = runner.excute(fpath) temp = 3 #從第三行開始,根據字典key寫入測試結果 for item in test_data: _write_center(worksheet, u"A" + str(temp), item["test_name"], workbook) _write_center(worksheet, u"B" + str(temp), item["test_method"], workbook) _write_center(worksheet, u"C"+str(temp), item["test_url"], workbook) _write_center(worksheet, u"D"+str(temp), item["test_path"], workbook) try: _write_center(worksheet, u"E"+str(temp), item["test_code"], workbook) except: pass _write_center(worksheet, u"F"+str(temp), item["test_message"], workbook) _write_center(worksheet, u"G"+str(temp), item["test_result"], workbook) _write_center(worksheet, u"H"+str(temp), item["test_time"], workbook) _write_center(worksheet, u"I" + str(temp), "URL="+item["test_request"], workbook) _write_center(worksheet, u"J"+str(temp), item["test_body"], workbook) _write_center(worksheet, u"K"+str(temp), item["test_response"], workbook) temp = temp + 1