接口封装遇到的坑--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
没篇一句:
除开学习 那还能怎么办?
本文来自博客园,作者:Titen,转载请注明原文链接:https://www.cnblogs.com/chengxiazuohua/p/15685402.html