代码拉取完成,页面将自动刷新
# coding=utf-8
# 导入datetime库
import datetime
# 导入DynamicParam类
from config.config import DynamicParam, api_host
# 导入logger对象
from tools.logs import logger
# 导入base()方法
import common.setting as base
# 导入json库
import json
# 导入pytest框架
import pytest
# RdTestcase类
from tools.read_excel import RdTestcase
# 导入RequestSend类
from tools.send_request import RequestSend
# 初始化类
attribute = DynamicParam()
# 实例化测试用例对象
case_data = RdTestcase()
# 根据测试用例对象获取测试用例列表
case_list = case_data.get_data()
# 获取当前时间
current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
result_list = []
# 测试用例执行类
class TestApi:
# 类方法,运行开始前只执行1次
def setup_class(self):
# 初始化excel报告
RdTestcase().re_excel2()
# 打印日志
logger.info(f"***** 开始执行测试用例,开始时间为:{current_time} *****")
# 类方法,运行结束后只执行1次
def teardown_class(self):
# 打印日志
logger.info(f"***** 执行用例完成,完成时间为:{current_time} *****")
# 将结果写入excel
RdTestcase().write_excel2(result_list)
# 测试用例参数化
@pytest.mark.parametrize('case', case_list)
def test_run(self, case):
# 定义变量
res_data = None
# 根据条件,从配置文件获取url信息,并拼接完整url信息
url = api_host + case['url']
# 获取测试用例名称
case_name = case['title']
# 获取method内容
method = case['method']
# 获取headers内容,格式化字符为字典
headers = eval(case['headers'])
# 获取cookies内容,格式化字符为字典
cookies = eval(case['cookies'])
# 获取请求内容,格式化字符为字典
data = eval(case['request_body'])
# 获取关联内容
relation = str(case['relation'])
# 根据关联,获取url参数中是否有变量需要被替换,有则替换,无则默认
url = self.correlation(url)
# 根据关联,获取headers参数中是否有变量需要被替换,有则替换,无则默认
headers = self.correlation(headers)
# 根据关联,获取cookies参数中是否有变量需要被替换,有则替换,无则默认
cookies = self.correlation(cookies)
# 根据关联,获取data参数中是否有变量需要被替换,有则替换,无则默认
data = self.correlation(data)
# 异常处理
try:
# 打印日志
logger.info("✈✈✈正在执行{}用例:".format(case_name))
# 执行测试用例,发送http请求
res_data = RequestSend().send(url, method, data=data, headers=headers, cookies=cookies)
# 打印日志
logger.info("用例执行成功,请求的结果为{}".format(res_data))
# 异常捕获
except:
# 打印日志
logger.info("用例执行失败,请查看日志找原因")
# 断言结果为失败
assert False
# 判断res_data是否存在
if res_data:
# res_data存在后,判断relation不为None
if relation != "None":
# 根据响应结果,以及关联信息(token=cookies.admin-token),设置变量token的值为响应结果的信息
try:
self.set_relation(relation, res_data["body"]["data"])
except:
self.set_relation(relation, res_data)
# 结果进行验证
self.assert_response(case, res_data)
# 重新生成结果集,并添加到result_list列表
result = case
result['url'] = url
result['res_data'] = res_data
result['headers'] = headers
result['cookies'] = cookies
result['request_body'] = data
result['is_pass'] = self.assert_response(case, res_data)
result_list.append(result)
# 返回res_data信息
return res_data
# 响应结果关联设置函数
def set_relation(self, relation, res_data):
# 异常处理
try:
# 判断relation内容为True
if relation:
# 根据,进行分割,结果为List
relation = relation.split(",")
# 循环打印relation列表
for i in relation:
# 根据=进行分割
var = i.split("=")
# 列表第1个值设置为var_name
var_name = var[0]
# 列表第2值内容按.进行分割,结果内容保存变量var_tmp
var_tmp = var[1].split(".")
# 在响应结果res_data中,根据条件var_tmp进行匹配
res = base.parse_relation(var_tmp, res_data)
# 打印信息
print(f"{var_name}={res}")
# 把定义的变量名称以及值 以属性的方式设置到DynamicParam类中,实现动态存储
setattr(DynamicParam, var_name, res)
# 捕获异常
except Exception as e:
# 打印异常信息
print(e)
# 根据关联,获取该变量内容
def correlation(self, data):
# 根据正则,获取数据
res_data = base.find(data)
# 判断res_data为True
if res_data:
# 定义空的字典
replace_dict = {}
# 循环打印
for i in res_data:
# 根据名称,从DynamicParam动态获取属性值,并把结果内容赋值给变量data_tmp
data_tmp = getattr(DynamicParam, str(i), "None")
# 把结果更新到字典replace_dict中
replace_dict.update({str(i): data_tmp})
# 参数进行替换,并把str转换为python对象
data = json.loads(base.replace(data, replace_dict))
# 返回结果
return data
# 结果验证方法
def assert_response(self, case, res_data):
# 变量初始化为False
is_pass = False
# 异常处理,捕获assert抛出的异常,不直接抛出
try:
# 根据结果进行断言验证
assert int(res_data['body']['error']) == int(case['expected_code'])
# 打印信息
logger.info("用例断言成功")
# 设置变量为True
is_pass = True
# 捕获异常
except:
# 设置变量为False
is_pass = False
# 打印日志
logger.info("用例断言失败")
# 无论是否出现异常,都执行下面内容代码
finally:
# 根据变量结果是True/False,进行断言验证,成功则通过,失败则未通过
assert is_pass
# 返回该变量结果
return is_pass
# 主程序执行入口
if __name__ == '__main__':
pytest.main()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。