初级:pytest + yaml 热启动与反射

背景:

在我们编写 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 中的方法单独提取出来,只要提取出来那么剩下的就直接调用相关方法去执行,将执行结果进行请求的参数传递即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值