一、前景
再编写项目自动化时,同项目中不同用例间存在很多公共入参,每次单独修改都很麻烦,尤其随着用例的增多,再设置入参上耗费时间过多,因此引入参数化,方便对公用参数统一管理
二、实现方法
1.封装模块对参数化入参进行处理
from utils.read import base_data
import yaml
import os
def func_yaml(data):
if isinstance(data, dict): # 判断类型 data是dict类型
for key, value in data.items(): # data.items():返回一个包含Series对象中所有键值对的列表。每个键值对都以元组的形式表示,
if isinstance(value, str) and '${' in value and '}' in value:
start = value.index('${')
end = value.index('}')
func_name = value[start + 2:end]
# eval不能取0开头的整数
a = str(eval(func_name))
if '/' in a:
b = a.strip('/')
else:
b = a
data[key] = value[0:start] + b + value[end + 1:]
# 如果键值对的值是字典类型,函数会递归调用func_yaml()函数来处理该嵌套字典。
# 递归处理字典:处理任意层级的嵌套字典数据,确保每个层级都能应用相同的转换逻辑,从而达到全面处理的目的。
elif isinstance(value, dict):
data[key] = func_yaml(value)
return data
# 获取yaml中统一管理的参数集
code_set = base_data.read_data()['CODE_SET']
order_set = base_data.read_data()['ORDER_SET']
cu_code = base_data.read_data()['CU_CODE']
def CU_CODE():
code = cu_code
return code
def ORDER_SET():
data = order_set
return data
def CODE_SET():
set = code_set
return set
if __name__ == '__main__':
data = {
"json_data": {
"paramMap": {
"data1": "${CU_CODE()}",
}
}}
print(func_yaml(data))
2.yaml参数化设置
参数值使用${CU_CODE()['CASE1']['CUST_CODE']}格式来实现参数化
# 入参设置
ORDER_SET:
STOP_PRICE: 10
START_DATE: 20240129
CLI_REMARK: test_auto
CU_CODE:
# 沪市
CASE1:
CUST_CODE: 666600005479
CUACCT_CODE: 666600005479
TRDACCT: A456742201
OP_PWD: 111111
# 深市
CASE2:
CUST_CODE: 666600005479
CUACCT_CODE: 666600005479
TRDACCT: /0157775877/
OP_PWD: 111111
CODE_SET:
# 沪-普通股票
CASE1:
JY_CODE: 400019
ORDER_PRICE: 10
# 沪-企业转债
CASE2:
JY_CODE: 550022
ORDER_PRICE: 10
BuyOrder1:
paramMap:
CUST_CODE: ${CU_CODE()['CASE1']['CUST_CODE']}
CUACCT_CODE: ${CU_CODE()['CASE1']['CUACCT_CODE']}
TRDACCT: ${CU_CODE()['CASE1']['TRDACCT']}
OP_PWD: ${CU_CODE()['CASE1']['OP_PWD']}
ORDER_VALID_DATE: ${ORDER_SET()['START_DATE']}
STOP_PRICE: ${ORDER_SET()['STOP_PRICE']}
CLI_REMARK: ${ORDER_SET()['CLI_REMARK']}
TRD_CODE: ${CODE_SET()['CASE1']['SG_CODE']}
ORDER_PRICE: ${CODE_SET()['CASE1']['ORDER_PRICE']}
3遇到的问题
再使用func_yaml方法是,发现0开头的参数值(例如02322),无法正确被读取,研究后发现是func_yaml中eval不能取0开头的整数,会将其转换为8进制。
解决方法:使用双斜杠//包围数值,/02322/,然后读取后去掉//