接口封装遇到的坑--3

注:代码标红的地方是我自己出错的地方

一.关于反射取值:

1.yaml文件里面 不小心多写了脏数据access_token

2.  1)替换的方法中,涉及到反射,反射的参数和方法都是字符串,对于调用的方法比如返回随机数的方法,需要把截取的字符串的参数,强转为int

   2)  当对于数字替换的时候,只有字符串才可以替换,所以替换的时候,随机数函数返回的new_value为int,需要转换强转为字符串才可以处理

   3)反射:方法和参数都要是字符串,所以yaml文件的access_token和(100,900),截取完毕就是字符串,默认字符串的形态可以直接放在反射的方法和参数中,不要加引号

创建标签的yaml

-
  name: 创建标签
  request:
    method: post
    url: /cgi-bin/tags/create?access_token=${get_accesstoken(access_token)}
    json: {"tag":{"name":"广东一哥${get_randomNum(100,999)}"}}
  validate: none

 

整个替换代码如下:

 def repalce_value(self,data):
        if data:
            # 获取数据类型
            data_type = type(data)
            if isinstance(data,dict) or isinstance(data,list):
                data_str = json.dumps(data)
            else:
                data_str = str(data)

            #替换
            for cs in range(1,data_str.count("${")+1):
                if "${" in data_str and "}" in data_str:
                    start_index = data_str.index("${")
                    end_index = data_str.index("}", start_index)
                    old_value = data_str[start_index:end_index + 1]
                    # print(old_value)
                    func_name = old_value[2:old_value.index("(")]
                    args_name = old_value[old_value.index("(")+1:old_value.index(")")]
                    #判断参数是否是空
                    if args_name != "":
                        #反射(方法和参数都要是字符串,所以yaml文件的access_token和(100,900)默认就是字符串的形态,不要加引号)
                        args_names = args_name.split(",")
                        new_value = getattr(self.obj,func_name)(*args_names)
                    else:
                        new_value = getattr(self.obj,func_name)()

                    # new_value = read_extract_yaml(old_value[2:-1])
                    data_str = data_str.replace(old_value, str(new_value))

            #替换完成后再返回给data
            if isinstance(data,dict) or isinstance(data,list):
                data = json.loads(data_str)
            else:
                data = data_type(data_str)
        return data

 

反射调用的方法

import random
from common.yaml_util import read_extract_yaml

class Test:
    #获得随机数
    def get_randomNum(self,min,max):
        return random.randint(int(min),int(max))
    #取得accesstoken
    def get_accesstoken(self,key):
        return read_extract_yaml(key)

 二.断言

  遇到的坑 1.各个方法传的参数不完整  2.遍历字典忘记加了items()  3. res_json='' ''  和  res_code = res.status_code加了代码不会置灰???

  首先断言在取值之后,取值后之后的用例才能正常过

  断言放在规范yaml文件的方法中:

    #规范yaml用例的规范,caseargs为字典
    def standard_yaml(self, caseinfo):
        caseinfo_keys = caseinfo.keys()
        if "name" in caseinfo_keys and "request" in caseinfo_keys and "validate" in caseinfo_keys:
            request_keys = caseinfo["request"].keys()
            if "method" in request_keys and "url" in request_keys:
                print("框架测试通过")
                method = caseinfo["request"].pop("method")
                url = caseinfo["request"].pop("url")
                res = self.sendutil(method=method ,url=url,**caseinfo["request"])
                print(res.text)

                #提取相关的返回值,实现接口的关联
                res_test=res.text
                res_json=''
                res_code = res.status_code
                # res_code=200
                try:
                    res_json = res.json()
                except Exception as e:
                    print("返回文件不是json")
                    
                #是否需要在返回值中获取值
                if "extract"in caseinfo_keys:
                    for key,value in caseinfo["extract"].items():
                        if "(.*?)" in value or "(.+?)"in value:
                            zz_value = re.search(value,res_test)
                            if zz_value:
                                write_extract_yaml({key:zz_value.group(1)})
                        else:
                            json_value = jsonpath.jsonpath(res_json,value)
                            if json_value:
                                write_extract_yaml({key:json_value[0]})
                #断言
                yq_result = caseinfo["validate"]
                sj_result = res_json
                self.assert_result(yq_result,sj_result,res_code)

            else:
                print("请检查yaml文件method和url")
        else:
            print("请检查yaml文件是否存在name、request和validate")

断言调取

#断言
    def assert_result(self,yq_result,sj_result,res_code):
        all_flag = 0
        for value in yq_result:
            for key,value in value.items():
                if key=="equals":
                    flag = self.assert_equals(value,res_code,sj_result)
                    all_flag+=flag
                elif key=="contains":
                    flag = self.assert_contains(value,sj_result)
                    all_flag += flag
                else:
                    print("此框架不支持此种断言")
        assert all_flag ==0
    #相等断言
    def assert_equals(self,value,res_code,sj_result):
        flag = 0
        for equals_key, equals_value in value.items():
            if equals_key=="status_code":
                 if equals_value!=res_code:
                    flag += 1
                    print(f"断言失败,真实的状态码为{res_code}")
            else:
                list = jsonpath.jsonpath(sj_result,f"$..{equals_key}")
                if list:
                    if equals_value not in list:
                        flag += 1
                        print("断言失败")
                else:
                    flag+=1
                    print(f"返回的列表中不存在对应的{equals_key}")
        return flag

    #包含断言
    def assert_contains(self,value,sj_result):
        flag =0
        if value not in sj_result:
            flag+=1
            print("包含断言失败")
        return flag

 

  没篇一句:

  除开学习 那还能怎么办?

posted on 2021-12-13 21:43  Titen  阅读(73)  评论(0编辑  收藏  举报

导航