前言
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
来源: http://www.jianshu.com/p/d46ebdb065b2