文章目录
一、python动态解析.yaml文件参数:
1.1、创建.yaml文件参数:
创建test_case.yaml文件
- name: ${name}
request:
url: 'http://www.baidu.com/'
headers:
content-type: ${value}
params:
username: ${user}
password: ${pwd}
assert:
expect: none
real: none
1.2、yaml文件读取:
python解析.yaml用例
def read_testcase_yaml(path: str):
with open(DATAS_YAML_PATH + path, mode='r', encoding='utf-8') as f:
return yaml.load(f, Loader=yaml.FullLoader)
1.3、校验yaml文件用例参数格式:
校验test_case.yaml文件用例编写格式,是否符合预期,用第一层及第二层参数断言验证
def check_info_yaml(case_info):
# 获取列表所有的key
# case_info = case_info[0]
case_info_keys = case_info.keys()
# 首先判断caseInfo中是否包含必填的字段
if 'name' in case_info_keys and 'request' in case_info_keys:
# 获取request中所有的key
request_keys = case_info['request'].keys()
# 判断request中是否包含url、headers、params
if 'url' in request_keys and 'headers' in request_keys and 'params' in request_keys:
print("yaml用例标准化格式:校验通过")
else:
print("二级关键词必须包含:url,headers,params")
else:
print("一级关键词必须包含:name,request,assert")
1.4、动态参数化用例做替换:
这里是主要用框架内部环境变量去做映射,达到替换环境变量的目的
不懂如何设置环境变量的可以参照:https://editor.csdn.net/md/?articleId=124766449
def replace_value(data, *args, **kwargs):
# 判断data是否存在
# print(f"参数data为:{data}")
if data is not None:
# 判断data类型是列表及字典类型则用json方法转为字符串类型
# print("进入到判断中")
if isinstance(data, list) or isinstance(data, dict):
# print("进入到字典或列表")
str_data = json.dumps(data, ensure_ascii=False)
# 判断data非字典及列表则强转为字符串即可
else:
# print("进入到其它类型")
str_data = str(data)
# print(f"当前参数:{str_data}")
# 对字符串str_data进行循环,判断是否存在${},存在则替换所有参数
for rv in range(1, str_data.count("$") + 1): # 这里判断替换次数
length = len(str_data)
# print(f"当前长度为:{length}")
# print(f"{str_data.count('$')}")
start_index = str_data.index('${')
# print(f"当前起始值为:{start_index}")
end_index = str_data.index('}', start_index, length + 1)
# print(start_index, end_index)
# print(f"当前需要替换值:{str_data[start_index:end_index + 1:]}")
replace_data = read_environment(f'{str_data[start_index + 2:end_index:]}')
if replace_data is not None:
str_data = str_data.replace(str_data[start_index:end_index + 1:], str(replace_data))
else:
print(
f"您要读取替换的key值:{str_data[start_index + 2:end_index:]},不存在")
rv += 1
return eval(str_data)
else:
print(f"您输入参数有误要替换的参数项为:{data}")
1.5、查看效果:
4个.yaml文件当中的参数均呗替换成功
1.6、自动化批量执行用例:
参数预制:
def setup_params(self, **var):
'''
如果有自定义传参则进行替换,没有传参则默认随机变量
:param var:
:return:
'''
for keys in var.keys():
self.list.append(keys)
if 'mobile' in self.list:
mobile = var['mobile']
else:
mobile = Ran().ran_mobile()
add_environment('mobile', mobile)
def get(self, params):
'''
返回请求参数的url、headers、params
:param params:
:return:
'''
url = params['request']['url']
headers = params['request']['headers']
data = params['request']['params']
return [url, headers, data]
def case(self, islast='true', **var):
a = read_case_yaml('test_cases.yaml')
length = len(a)
if islast == 'true':
number = length
else:
number = length - 4
host = read_environment('env_datas')['host']
for i in range(0, number):
a1 = a[i]
check_info_yaml(a1)
name = a1['name']
with allure.step(f"{name}"):
if name == '拉取注册协议':
self.setup_params(**var)
a2 = replace_value(a1)
print(f"替换前的值为:{a1}")
print(f"替换后的值为:{a2}")
if name == '注册短信OTP验证':
self.get(a2)[2]['bizContent']['agreementList'] = eval(
self.get(a2)[2]['bizContent']['agreementList'])
print(f"********当前的openId为:{read_environment('openId')}")
sql = kcms_sql(openId=read_environment('openId'), number=read_environment('personal')).insert_kums
Mysql('xw').inserDB(sql=sql)
if name == '签署个人协议' or name == '签署税银授信协议':
self.get(a2)[2]['bizContent']['templateList'] = eval(self.get(a2)[2]['bizContent']['templateList'])
if name == '查询授信额度':
time.sleep(1)
res = RunMethod().post(url=host + self.get(a2)[0], headers=self.get(a2)[1], json=self.get(a2)[2])