前言
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