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列有没有值,来自动提取。