1 # 正则表达式 2 improt re 3 4 # re相关的文章®ular表达式学习手册 5 1、https://www.cnblogs.com/Simple-Small/p/9150947.html 6 2、https://tool.oschina.net/uploads/apidocs/jquery/regexp.html 7 3、https://gitee.com/thinkyoung/learn_regex 8 9 # 操作对象-字符串 10 1、从字符串当中,提取匹配的内容 11 re 模块 12 re.findall --返回的是列表 列表里是匹配的所有字符 13 # 1、匹配1个字符 14 .除换行符以外的是所有字符 \n 15 \d 只匹配数字0-9 16 \D 匹配非数字 17 \w 匹配包括下划线的任何单词字符,等价于"[A-Z,a-z,0-9]",支持中文 18 \W 匹配任何非单词字符 等价于“[^A-Za-z0-9]” 19 [a-z] 匹配小写字母 20 [A-Z] 匹配大写字母 21 [0-9] 匹配数字 22 [adcd] 字符集合 匹配所包含的任意一个字符,例如“[abc]” 可以匹配plain的"a" 23 [a|b] 匹配x或y 例如 "z|food"能匹配"z"或者"food","(z|f)ood"则匹配“zood”或“food” 24 # 2、数量匹配 25 * 匹配前一个字符,0次或多次 26 + 匹配前一个字符,1次或者多次 27 ?匹配前有个字符,0次或1次 28 {n} 匹配前一个字符n次 29 {n,m} 匹配前一个字符少是n次,最多是m次 30 {n,} 匹配前一个字符至少是n次,没有下限 31 贪婪模式: 32 尽可能的匹配更多更长,对于人民币一样,希望越多越好 33 非贪婪模式:尽可能的匹配更少,在数量表达后面加上 对于无偿的加班时间,越少越好 34 35 # 边界匹配: 36 ^ 匹配输入字符串的开始位置 37 $ 匹配输入字符串的结束位置 38 39 # 匹配分组() 40 41 期望结果与实际结果比对: 42 import ast 43 import jsonpath 44 # 从excel当中,读取出来的断言列表 45 check_str = '[{"expr":"$.code","expected":0,"type":"eq"},{"expr":"$.msg","expected":"OK","type":"eq"}]' 46 47 # 把字符串转换成python列表 48 check_list = ast.literal_eval(check_str) # 比eval安全一点。转成列表。 49 print(check_list) 50 51 # 比对结果列表 52 check_res = [] 53 54 for check in check_list: 55 # 通过jsonpath表达式,从响应结果当中拿到了实际结果 56 actual = jsonpath.jsonpath(response, check["expr"]) 57 if isinstance(actual,list): 58 actual = actual[0] 59 # 与实际结果做比对 60 if check["type"] == "eq": 61 check_res.append(actual == check["expected"]) 62 # eval用法 63 strr = """ 64 [{"expr":"$.code","expected":0,"type":"eq"}, 65 {"expr":"$.msg","expected":"OK","type":"eq"}, 66 {"expr":"$..leave_amount","expected":2000.55+2000,"type":"eq"} 67 ] 68 """ 69 70 res = eval(strr) 71 print(res) 72 73 # 充值接口: 74 校验 :登录成功(意味要鉴权) 75 步骤:充值 76 断言:校验金额是否正确 77 后置:私放资源/清理数据 78 1、类级别地的前置 -- 所有的充值用例,只需要登陆一次就够了。 79 登陆帐号: 80 1、用固定的一个帐号 - 配置化(Conf目录下,data.ini里配置用户) 81 2、已配置的帐号,如何保证它是已经存在的?? 82 用之前,查一下数据库,如果没有,就注册(session前置)。 83 84 85 2、接口关联处理 -- 登陆接口的返回值,要提取出来,然后作为充值接口的请求参数 86 87 准备知识 :re正则表达式、 postman是如何处理参数传递(接口关联的)。 88 """ 89 类对象设置动态属性 90 setattr(对象/类, attr, value) 91 getattr(对象/类, attr) 92 hasattr(对象/类, attr) True表示有attr, False表示没有attr 93 delattr(对象/类, attr) 94 95 在代码运行的过程中,动态的给Data类设置/获取/删除属性。 96 """ 97 jsonpath 与 类的动态属性结合 98 """ 99 从响应结果当中,提取值,并设置为全局变量(Data类作为本框架的全局变量类) 100 1、提取表达式:放在excel当中 101 (可能提取1个,可能提取多个。。以表达式个数为准) 102 103 2、提取出来之后,设置为Data类属性 104 """ 105 # 占位符的替换 106 ss = '{"member_id":#member_id#,"amount":2000}' 107 member_id = "16" 108 new_ss = ss.replace("#member_id#", member_id) 109 print(new_ss) 110 充值接口的用例编写、自动化用例设计 111 前置:登陆 112 获取登陆的返回结果里的 token,用户id,用户余额 113 114 步骤:充值 115 116 接口依赖/关联处理: 117 1、将上一个接口的响应数据,提取出来(jsonpath/dict方式)之后,将它设置为全局变量(设置Data类的类属性) 118 2、下一个接口的请求数据,若要替换,直接从全局变量中读取(获取Data类的类属性值) 119 120 处理接口关联: 121 第一步:提取值 122 通过jsonpath从响应结果中提取,然后设置为全局变量。我的框架中Data类用来存储全局变量的。 123 如何通过jsonpath去提取的呢?可能会提取1个值?可能会提取多个值?框架通用性,所有接口通用。 124 1)在excel当中添加了一列:extract。如果当前这一行的请求,有需求要从响应中提取。 125 那么就在extract列对应的位置,写上表达式。 126 形式是字典形式,key-value.key就是变量名,value就jsonpath提取表达式。 127 2)定义了一公共的提取方法: 128 解析excel当中extract列,然后从响应结果中提取,然后设置为Data类的属性。 129 3)在测试框架的接口自动化用例当中,通过判断extract列有没有值,来自动提取。 130 131 第二步:替换值 132 133 第一步:提取值 134 通过jsonpath从响应结果中提取,然后设置为全局变量。我的框架中Data类用来存储全局变量的。 135 如何通过jsonpath去提取的呢?可能会提取1个值?可能会提取多个值?框架通用性,所有接口通用。 136 1)在excel当中添加了一列:extract。如果当前这一行的请求,有需求要从响应中提取。 137 那么就在extract列对应的位置,写上表达式。 138 形式是字典形式,key-value.key就是变量名,value就jsonpath提取表达式。 139 2)定义了一公共的提取方法: 140 解析excel当中extract列,然后从响应结果中提取,然后设置为Data类的属性。 141 3)在测试框架的接口自动化用例当中,通过判断extract列有没有值,来自动提取。