接口测试新姿势-2
上一篇介绍了框架的大体构型,思路已经有了,如何实现呢?
Step1-读取数据
【核心】xlrd库,表格第一行为title名,循环读取各行数据,与对应列名组合为字典.
# 获取sheet
book = xlrd.open_workbook(conf.TEST_CASE_PATH)
sheets = book.sheets()
# 获取单sheet页数据
def handler_single_sheet(self, sheet):
"""
@param sheet:excel表sheet页
@return sheet页数据
"""
rows= sheet.nrows
title = sheet.row_values(0)
l = []
for i in range(1, rows):
common = dict(zip(title, sheet.row_values(i)))
common.update({'feature':sheet.name})
l.append(common)
return l
Step2-用例关联
如何将每一行读取到的数据作为一条用例执行?
【核心】Pytest参数化-将Step1拿到的数据参数化传递给test_case.
class Test_case(object):
@pytest.mark.parametrize('case', case_suite)
def test_case(self, case):
request = RequestHandler(case)
Step3-发送请求
【核心】Request库,将excel中拿到的url,data,method 等传入request,发送请求并获取返回值
def send_request(self):
"""
发送请求
"""
header = {
"device_types": "I",
"version": "1.0",
"timestamp": utils.get_timestamp(10)
}
data = self.handle_request_data(eval(self.case['data']))
data = utils.get_sign(data)
final_data = {'data':data}
try:
url = self.get_run_env() + self.case['url']
logger().info("请求行 {}".format(url))
response = requests.request(
method=self.case['method'],
url=url,
headers=header,
data=final_data
)
except:
logger().error("请求发送失败: url={}".format(self.case['url']))
logger().info('返回体 {}'.format(response.text))
return response
Step4-处理返回数据
【核心】数据格式转换-json格式转为字典格式
response = self.send_request().json()
Step5-断言
【核心】字典-将返回结果中与期望值匹配的value拿出存入valid字典。拿以下举例,即若返回值中含'code',则拿出返回值中'code'对应的value值存入valid字典.
def handler_result(self, expect, actual):
"""
@param expect:期待结果
actual:实际返回
@return 断言结果
"""
if isinstance(expect, list):
for item in expect:
item = eval(item)
valid = self.parse_validator(item)
check_item = valid["check"]
valid["check_value"] = actual[check_item]
self.do_validation(valid)
else:
raise ("expect value type is wrong ")
总结
以上即可搭建一个简单的框架了,需要用到的相关知识也在核心点中提及。做个总结及拓展:
1.Python数据处理-文件读取(txt/excel/csv)
2.Pytest框架-用例的执行管理
3.Python Request库
4.Python 数据类型转换(json/字典/字符串/列表)及对应数据常见操作使用
这里遗留2个问题:
1.做断言时有很多情况,例如相等,不等,大于等情况,若不进行函数绑定,即只能判断一种类型。故将期望值放在表格中,可灵活进行对比。那如何匹配对应函数并进行处理呢?
2.一个业务链中通常需要请求间数据传递,举个最简单的例子,咨询的前提是要登录,是否登录的判断为参数中是否有token值,token值由登录接口返回。即要发起咨询,就要拿到登录接口的返回值并提取相关参数作为参数传为下一个接口。那在此框架中又如何实现呢?