背景:
在我们编写 yaml 用例的时候,通常在 yaml 中会用到读取其他模块下的配置内容,在 yaml 文件中接着提取是没有作用的。 此时需要借助其他方式来运行 yaml 中的方法去获取想要的内容。
实例:
如下 yaml 文件需要读取其他 yaml 文件保存的 token,如下,用例编写:
-
feature: xxx
story: xxxx
title: $ddt{case_title}
name: 纪要查询接口
parameterize:
case_title-query-assert_tr1: ddt_datas/xxx_search_ddt.yaml
request:
method: post
url: ${read_config_yaml(base,base_url)}api/v1/xxxx/xxx/search/list
json:
query: $ddt{query}
code: composite
headers:
Content-Type: application/json
Authorization: Bearer ${read_extract_yaml(token)}
validate:
- equals: $ddt{assert_tr1}
上图解释:
在 yaml 中存在调用两个function: read_config_yaml 和 read_extract_yaml
由于 yaml 不能直接运行 function,此时我们需要借助外力。
如下处理:我们在项目根目录下新建:redloads 文件夹/test.py
test.py
class GetToken:
def read_extract_yaml(self,key):
print("key 读取 extract 是什么呢:",key)
with open(get_object_path() + "extract.yaml", 'r', encoding='utf-8') as f:
print("get_object_path()::::获取基础路径",get_object_path())
value = yaml.load(stream=f, Loader=yaml.FullLoader)
return value[key]
def read_config_yaml(self,one_nodo, two_node):
with open(get_object_path() + "config.yaml", 'r', encoding='utf-8') as f:
value = yaml.load(stream=f, Loader=yaml.FullLoader)
return value[one_nodo][two_node]
以上类中已经写明路方法的执行代码,这样远远不能实现目标,所以我们需要剥解yaml 用例相关方法。那么此时应该如何处理呢?对于初学者在这里会卡住。
思路:
我们有了yaml 用例,也能读取yaml ,现在缺的就是怎么把 yaml 中的函数给运行起来?
这个思路就是:拆解+替换
如果我们能把用例中的方法以一定的规则拆解,然后找到对应的值进行替换,那不就完成了?
如何实现? 可以参考以下代码
def replace_value(self, casedata):
if casedata:
data_type = type(casedata)
str_data = json.dumps(casedata)
# 替换处理
for cs in range(1, str_data.count('${') + 1):
if "${" in str_data and "}" in str_data:
start_index = str_data.index("${")
end_index = str_data.index("}", start_index)
oldvalue = str_data[start_index:end_index + 1]
func_name = oldvalue[2:oldvalue.index('(')]
args_value1 = oldvalue[oldvalue.index('(') + 1:oldvalue.index(')')]
if args_value1 != "":
if "," in args_value1:
args_value2 = args_value1.split(',')
new_value = getattr(self.obj, func_name)(*args_value2)
else:
new_value = getattr(self.obj, func_name)(args_value1)
else:
new_value = getattr(self.obj, func_name)
if isinstance(new_value, int) or isinstance(new_value, float):
str_data = str_data.replace('"' + oldvalue + '"', str(new_value))
else:
str_data = str_data.replace(oldvalue, str(new_value))
# 还原数据类型
if isinstance(data, dict) or isinstance(data, list):
data = json.loads(str_data)
else:
data = data_type(str_data)
return data
以上方法会把 yaml 中的方法单独提取出来,只要提取出来那么剩下的就直接调用相关方法去执行,将执行结果进行请求的参数传递即可。