Commit 57fd14e1de4c238ace43aed43a97a2f85e822b38
Committed by
liujiqiang
1 parent
8f3f2bcf
删除冗余的代码和注释
Showing
4 changed files
with
578 additions
and
903 deletions
src/commons/ConfigDB.py
1 | -#!/usr/bin/python | |
2 | -# -*- coding: UTF-8 -*- | |
3 | -import MySQLdb | |
4 | -import commons.common as ca | |
5 | -import json | |
6 | -from commons.Logging import Logger | |
7 | -# import chardet | |
8 | -log=Logger() | |
9 | - | |
10 | - | |
11 | -dbhost=ca.get_global_config('global_data','Database','dbhost') | |
12 | -dbport=ca.get_global_config('global_data','Database','dbport') | |
13 | -dbname=ca.get_global_config('global_data','Database','dbname') | |
14 | -dbuser=ca.get_global_config('global_data','Database','dbuser') | |
15 | -dbpassword=ca.get_global_config('global_data','Database','dbpassword') | |
16 | -#dbcharset=get_global_config('Database','dbcharset') | |
17 | - | |
18 | -def mysql_selectOne(select_action): | |
19 | - action=select_action | |
20 | - db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) | |
21 | - cursor = db.cursor() | |
22 | - # 使用cursor()方法获取操作游标 | |
23 | - try: | |
24 | - # 使用execute方法执行SQL语句 | |
25 | - cursor.execute(action) | |
26 | - # 使用 fetchone() 方法获取一条数据 | |
27 | - data = cursor.fetchone() | |
28 | -# print data | |
29 | - return data | |
30 | - except Exception as e: | |
31 | - print("数据库操作异常:%s" % str(e)) | |
32 | - log.error("数据库操作异常:%s" % str(e)) | |
33 | - assert False | |
34 | - finally: | |
35 | - # 关闭数据库连接 | |
36 | - db.close() | |
37 | - | |
38 | -def mysql_selectAll(select_action): | |
39 | - action=select_action | |
1 | +#!/usr/bin/python | |
2 | +# -*- coding: UTF-8 -*- | |
3 | +import MySQLdb | |
4 | +import commons.common as ca | |
5 | +import json | |
6 | +from commons.Logging import Logger | |
7 | +# import chardet | |
8 | +log=Logger() | |
9 | + | |
10 | + | |
11 | +dbhost=ca.get_global_config('global_data','Database','dbhost') | |
12 | +dbport=ca.get_global_config('global_data','Database','dbport') | |
13 | +dbname=ca.get_global_config('global_data','Database','dbname') | |
14 | +dbuser=ca.get_global_config('global_data','Database','dbuser') | |
15 | +dbpassword=ca.get_global_config('global_data','Database','dbpassword') | |
16 | +#dbcharset=get_global_config('Database','dbcharset') | |
17 | + | |
18 | +def mysql_selectOne(select_action): | |
19 | + action=select_action | |
40 | 20 | db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) |
41 | - #游标加上cursorclass=MySQLdb.cursors.DictCursor后,返回值会变成字典,不加时返回数据格式如:(("001","test"),)加了后变成({'name': test, 'id': 001L,}) | |
42 | - #cursor = db.cursor(cursorclass=MySQLdb.cursors.DictCursor) | |
43 | 21 | cursor = db.cursor() |
44 | - # 使用cursor()方法获取操作游标 | |
45 | - try: | |
46 | - # 使用execute方法执行SQL语句 | |
47 | - cursor.execute(action) | |
48 | - # 使用 fetchall() 方法获取所有数据 | |
49 | - data = cursor.fetchall() | |
50 | -# print data | |
51 | - return data | |
52 | - except Exception as e: | |
53 | - print("数据库操作异常:%s" % str(e)) | |
54 | - log.error("数据库操作异常:%s" % str(e)) | |
55 | - assert False | |
56 | - finally: | |
57 | - # 关闭数据库连接 | |
58 | - db.close() | |
59 | - | |
60 | -def mysql_delete(delete_action): | |
61 | - action=delete_action | |
62 | - db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) | |
63 | - cursor = db.cursor() | |
64 | - # 使用cursor()方法获取操作游标 | |
65 | - try: | |
66 | - # 使用execute方法执行SQL语句 | |
67 | - cursor.execute(action) | |
68 | - # 提交 | |
69 | - db.commit() | |
70 | - except Exception as e: | |
71 | - print("数据库操作异常:%s" % str(e)) | |
72 | - log.error("数据库操作异常:%s" % str(e)) | |
73 | - # 错误回滚 | |
74 | - db.rollback() | |
75 | - finally: | |
76 | - # 关闭数据库连接 | |
77 | - db.close() | |
78 | - | |
79 | -def mysql_update(update_action): | |
80 | - action=update_action | |
81 | - db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) | |
82 | - cursor = db.cursor() | |
83 | - # 使用cursor()方法获取操作游标 | |
84 | - try: | |
85 | - # 使用execute方法执行SQL语句 | |
86 | - cursor.execute(action) | |
87 | - # 提交 | |
88 | - db.commit() | |
89 | - except Exception as e: | |
90 | - print("数据库操作异常:%s" % str(e)) | |
91 | - log.error("数据库操作异常:%s" % str(e)) | |
92 | - # 错误回滚 | |
93 | - db.rollback() | |
94 | - finally: | |
95 | - # 关闭数据库连接 | |
96 | - db.close() | |
97 | - | |
98 | -def mysql_insert(insert_action): | |
99 | - action=insert_action | |
100 | - db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) | |
101 | - cursor = db.cursor() | |
102 | - # 使用cursor()方法获取操作游标 | |
103 | - try: | |
104 | - # 使用execute方法执行SQL语句 | |
105 | - cursor.execute(action) | |
106 | - # 提交 | |
107 | - db.commit() | |
108 | - except Exception as e: | |
109 | - print("数据库操作异常:%s" % str(e)) | |
110 | - log.error("数据库操作异常:%s" % str(e)) | |
111 | - # 错误回滚 | |
112 | - db.rollback() | |
113 | - finally: | |
114 | - # 关闭数据库连接 | |
115 | - db.close() | |
116 | - | |
117 | -def mysql_check_insert(api,section,check_sql,delete_sql,insert_sql): | |
118 | - log.info(u"======测试数据准备======") | |
119 | - check=ca.get_api_config(api, section, check_sql) | |
120 | - delete=ca.get_api_config(api, section, delete_sql) | |
121 | - insert=ca.get_api_config(api, section, insert_sql) | |
122 | -# print check | |
123 | -# print delete | |
124 | -# print insert | |
125 | - try: | |
126 | - db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) | |
127 | - cursor = db.cursor() | |
128 | - # 使用cursor()方法获取操作游标 | |
129 | - # 使用execute方法执行SQL语句 | |
130 | - cursor.execute(check) | |
131 | - result=cursor.fetchall() | |
132 | - # 提交 | |
133 | - db.commit() | |
134 | - if result: | |
135 | - log.info(u"检查到数据库有重复数据%r"%str(result)) | |
136 | - log.info(u"删除查询到的重复数据%r"%str(delete)) | |
137 | - cursor.execute(delete) | |
138 | - log.info(u"删除数据完成") | |
139 | - log.info(u"向数据库中插入测试数据%r"%str(insert)) | |
140 | - cursor.execute(insert) | |
141 | - log.info(u"插入数据完成") | |
142 | - result=cursor.fetchall() | |
143 | - db.commit() | |
144 | - return result | |
145 | - else: | |
146 | - log.info(u"数据库没有重复数据直接插入自定义数据%r"%str(insert)) | |
147 | - result=cursor.execute(insert) | |
148 | - log.info(u"插入数据完成,返回结果为为%r"%str(result)) | |
149 | -# cursor.fetchall() | |
150 | - db.commit() | |
151 | - return result | |
152 | - | |
153 | - except Exception as e: | |
154 | - print(u"数据库操作异常:%r" % str(e)) | |
155 | - log.error(u"数据库操作异常:%r" % str(e)) | |
156 | - # 错误回滚 | |
157 | - db.rollback() | |
158 | - assert False | |
159 | - finally: | |
160 | - # 关闭数据库连接 | |
161 | - db.close() | |
162 | - | |
163 | - | |
164 | - | |
165 | -def mysql_select_order(orderNum): | |
166 | - return mysql_selectOne("SELECT * FROM `order`.orders WHERE code = '%s';"%orderNum) | |
167 | - | |
168 | -def mysql_delete_order(orderNum): | |
169 | - mysql_delete("DELETE FROM `order`.orders WHERE code = '%s';"%orderNum) | |
170 | - | |
171 | -def mysql_select_coupon(couponNum): | |
172 | - return mysql_selectOne("SELECT * FROM `customer`.customer_coupon WHERE id = '%s';"%couponNum) | |
173 | - | |
174 | -def mysql_delete_coupon(couponNum): | |
175 | - mysql_delete("DELETE FROM `customer`.customer_coupon WHERE id = '%s';"%couponNum) | |
176 | - | |
177 | - | |
178 | -def Check_in_Mysql(in_data,sql_spm): | |
179 | - log.info(u"======从数据库中查询传入数据======") | |
180 | - result=mysql_selectAll(sql_spm) | |
181 | - log.info(u"传入in_data为: %s"%in_data) | |
182 | - log.info(u"数据库查询到的结果为 %s"%result) | |
183 | - | |
184 | - result=str(result) | |
185 | -# print "1111111",result.decode("utf-8") | |
186 | - if len(str(in_data)) == 0 and len(result)!=0: | |
187 | - log.error(u"传入数据为空!!\n") | |
188 | - assert False | |
189 | - return | |
190 | - elif len(str(in_data)) == 0 and len(result)==0: | |
191 | - log.error(u"传入数据与数据库查询结果都为空!!\n") | |
192 | - assert False | |
193 | - return | |
194 | - elif len(str(in_data)) != 0 and len(result)==0: | |
195 | - log.error(u"数据库查询结果为空\n") | |
196 | - assert False | |
197 | - return | |
198 | - elif isinstance(in_data,(list)): | |
199 | - log.info(u'检查的数据格式 为list类型') | |
200 | - for i in range(0,len(in_data)): | |
201 | - #由于数据库查询的数据中,中文的格式为unicode-escape,所以传入的数据需要进行encode | |
202 | - in_data[i]=str(in_data[i]).decode("utf-8").encode("unicode-escape") | |
203 | -# log.info(u"正在检查输入数据:%s"%in_data[i]) | |
204 | - if in_data[i] in result: | |
205 | - assert True | |
206 | - log.info(u"遍历list第%d次,插入数据%r与数据库查询结果一致"%(i,in_data[i])) | |
207 | - else: | |
208 | - log.error(u"#########ERROR#########:\n in_data与数据库查询结果不一致%r"%in_data[i]) | |
209 | - assert False | |
210 | - return True | |
211 | - | |
212 | - elif str(in_data).decode("utf-8").encode("unicode-escape") in result: | |
213 | - assert True | |
214 | - log.info(u"in_data与数据库查询结果一致!!%r"%in_data) | |
215 | - return True | |
216 | - else: | |
217 | - log.info(u"#########ERROR#########:\n in_data与数据库查询结果不一致!!%r"%in_data) | |
218 | - assert False | |
219 | - | |
220 | -def Check_in_Response(check_data,src_data): | |
221 | - #check_data必须为列表形式,src_data必须为r.json()的数据类型 | |
222 | - log.info(u"======从响应Body中查询传入数据======") | |
223 | - src_data=json.dumps(src_data) | |
224 | - src_data=src_data.replace(" ","") | |
225 | - log.info(u"传入check_data为: %s"%check_data) | |
226 | - log.info(u"对比的响应数据为 %s"%src_data) | |
227 | - if len(check_data) == 0 or len(src_data)==0: | |
228 | - log.error(u"传入数据为空!!\n") | |
229 | - assert False | |
230 | - return | |
231 | - elif isinstance (check_data,str) : | |
232 | - check_data=check_data.replace(" ","").replace("[","").replace("]","").decode("utf-8").split(",") | |
233 | - for i in range(0,len(check_data)): | |
234 | - #由于数据库查询的数据中,中文的格式为unicode-escape,所以传入的数据需要进行encode | |
235 | - check_data[i]=check_data[i].decode("utf-8").encode("unicode-escape") | |
236 | -# print type(check_data),check_data[i] | |
237 | - if check_data[i] in src_data: | |
238 | - assert True | |
239 | - log.info(u"遍历list第%d次,字段%s在请求响应结果中"%((i+1),check_data[i].decode("unicode-escape"))) | |
240 | - else: | |
241 | - log.error(u"#########ERROR#########:\n check_data不在请求响应结果中%s"%check_data[i].decode("unicode-escape")) | |
242 | - assert False | |
243 | - return True | |
244 | - elif isinstance (check_data,list) and len(check_data) > 0: | |
245 | - for i in range(0,len(check_data)): | |
246 | - #由于数据库查询的数据中,中文的格式为unicode-escape,所以传入的数据需要进行encode | |
247 | - check_data[i]=check_data[i].decode("utf-8").encode("unicode-escape") | |
248 | - print(type(check_data),check_data[i],str(check_data[i])) | |
249 | - print(type(src_data),src_data) | |
250 | - if check_data[i] in src_data: | |
251 | - assert True | |
252 | - log.info(u"遍历list第%d次,插入数据%r与数据库查询结果一致"%(i,check_data[i])) | |
253 | - else: | |
254 | - log.error(u"#########ERROR#########:\n check_data数据库查询结果不一致%r"%check_data[i]) | |
255 | - assert False | |
256 | - return True | |
257 | - else: | |
258 | - log.info(u"#########ERROR#########:\n 检查数据有问题,请检查!!!!!%r") | |
259 | - assert False | |
260 | - | |
261 | - | |
262 | -# test=ca.get_api_config('listCoupon', 'RequstHeader', 'testlist') | |
263 | -# print type(test),test | |
264 | -# print test.replace(" ","").replace("[","").replace("]","").decode("utf-8").split(",") | |
265 | -# test1=test.replace(" ","").replace("[","").replace("]","").decode("utf-8").split(",") | |
266 | -# | |
267 | -# a='couponBizType' | |
268 | -# b='code' | |
269 | -# data1=[a,b:"200"] | |
270 | -# data2={"code":"200","data":{"code":u"你好","data":[{"couponBizType":1,"couponCode":"004","couponCode123":"004"}],"result":"OK","success":2},"result":"OK","success":2} | |
271 | -# | |
272 | -# print Check_in_Response(data1, data2) | |
273 | - | |
274 | -# d=mysql_selectAll("select id as ddd,created_id,name from `product`.tag where id =1") | |
275 | -# d1=mysql_selectOne("select id,created_id,name from `product`.tag where id =1111") | |
276 | -# print d | |
277 | -# print d1 | |
278 | -# print d[0][0] | |
279 | -# print chardet.detect(str(d)) | |
280 | -# print chardet.detect(str(d[0][2])) | |
281 | -# mysql_insert(ca.get_api_config('submitOrder', 'coupon', 'insert')) | |
282 | -# d=ca.get_api_config('submitOrder', 'coupon', 'insert') | |
283 | -# d=d.decode("utf-8") | |
284 | -# print d | |
285 | -# mysql_insert(d) | |
286 | - | |
287 | -# c={"couponBizType":1,"couponCode":"004"} | |
288 | -# a={"code":"200","data":{"code":"200","data":[],"result":"OK","success":1},"result":"OK","success":2} | |
289 | -# b={"code":"200","data":{"code":"200","data":[{"couponBizType":1,"couponCode":"004","couponCode123":"004"}],"result":"OK","success":2},"result":"OK","success":2} | |
290 | -# # print json_cmp(a, b) | |
291 | -# print json_cmp(a, b) | |
292 | -# print 123 | |
293 | -# mysql_check_insert('listCoupon', 'listCoupon01',1,2,3) | |
294 | -# a=mysql_selectAll("select * from `order`.orders where id =271") | |
295 | -# print a | |
296 | -# if a: | |
297 | -# print 111 | |
298 | - | |
299 | -# def string(str1): | |
300 | -# a=[] | |
301 | -# b=[] | |
302 | -# str1= list(str1) | |
303 | -# print type(str1[0]),type(str1[1]),len(str1) | |
304 | -# for i in range(len(str1)): | |
305 | -# if str1[i] in '0123456789': | |
306 | -# b.append(str1[i]) | |
307 | -# else: | |
308 | -# a.append(str1[i]) | |
309 | -# a= "".join(a) | |
310 | -# b= "".join(b) | |
311 | -# c=a+b | |
312 | -# return c | |
313 | -# | |
314 | -# print string("A1B2c3") | |
315 | -# | |
316 | -# assert None, "add assert message" | |
317 | 22 | \ No newline at end of file |
23 | + try: | |
24 | + # 使用execute方法执行SQL语句 | |
25 | + cursor.execute(action) | |
26 | + data = cursor.fetchone() | |
27 | + return data | |
28 | + except Exception as e: | |
29 | + print("数据库操作异常:%s" % str(e)) | |
30 | + log.error("数据库操作异常:%s" % str(e)) | |
31 | + assert False | |
32 | + finally: | |
33 | + # 关闭数据库连接 | |
34 | + db.close() | |
35 | + | |
36 | +def mysql_selectAll(select_action): | |
37 | + action=select_action | |
38 | + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8') | |
39 | + cursor = db.cursor() | |
40 | + try: | |
41 | + # 使用execute方法执行SQL语句 | |
42 | + cursor.execute(action) | |
43 | + # 使用 fetchall() 方法获取所有数据 | |
44 | + data = cursor.fetchall() | |
45 | +# print data | |
46 | + return data | |
47 | + except Exception as e: | |
48 | + print("数据库操作异常:%s" % str(e)) | |
49 | + log.error("数据库操作异常:%s" % str(e)) | |
50 | + assert False | |
51 | + finally: | |
52 | + # 关闭数据库连接 | |
53 | + db.close() | |
54 | + | |
55 | +def mysql_delete(delete_action): | |
56 | + action=delete_action | |
57 | + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) | |
58 | + cursor = db.cursor() | |
59 | + try: | |
60 | + # 使用execute方法执行SQL语句 | |
61 | + cursor.execute(action) | |
62 | + # 提交 | |
63 | + db.commit() | |
64 | + except Exception as e: | |
65 | + print("数据库操作异常:%s" % str(e)) | |
66 | + log.error("数据库操作异常:%s" % str(e)) | |
67 | + # 错误回滚 | |
68 | + db.rollback() | |
69 | + finally: | |
70 | + # 关闭数据库连接 | |
71 | + db.close() | |
72 | + | |
73 | +def mysql_update(update_action): | |
74 | + action=update_action | |
75 | + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) | |
76 | + cursor = db.cursor() | |
77 | + try: | |
78 | + # 使用execute方法执行SQL语句 | |
79 | + cursor.execute(action) | |
80 | + # 提交 | |
81 | + db.commit() | |
82 | + except Exception as e: | |
83 | + print("数据库操作异常:%s" % str(e)) | |
84 | + log.error("数据库操作异常:%s" % str(e)) | |
85 | + # 错误回滚 | |
86 | + db.rollback() | |
87 | + finally: | |
88 | + # 关闭数据库连接 | |
89 | + db.close() | |
90 | + | |
91 | +def mysql_insert(insert_action): | |
92 | + action=insert_action | |
93 | + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) | |
94 | + cursor = db.cursor() | |
95 | + try: | |
96 | + # 使用execute方法执行SQL语句 | |
97 | + cursor.execute(action) | |
98 | + # 提交 | |
99 | + db.commit() | |
100 | + except Exception as e: | |
101 | + print("数据库操作异常:%s" % str(e)) | |
102 | + log.error("数据库操作异常:%s" % str(e)) | |
103 | + # 错误回滚 | |
104 | + db.rollback() | |
105 | + finally: | |
106 | + # 关闭数据库连接 | |
107 | + db.close() | |
108 | + | |
109 | +def mysql_check_insert(api,section,check_sql,delete_sql,insert_sql): | |
110 | + log.info(u"======测试数据准备======") | |
111 | + check=ca.get_api_config(api, section, check_sql) | |
112 | + delete=ca.get_api_config(api, section, delete_sql) | |
113 | + insert=ca.get_api_config(api, section, insert_sql) | |
114 | + | |
115 | + try: | |
116 | + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) | |
117 | + cursor = db.cursor() | |
118 | + # 使用execute方法执行SQL语句 | |
119 | + cursor.execute(check) | |
120 | + result=cursor.fetchall() | |
121 | + # 提交 | |
122 | + db.commit() | |
123 | + if result: | |
124 | + log.info(u"检查到数据库有重复数据%r"%str(result)) | |
125 | + log.info(u"删除查询到的重复数据%r"%str(delete)) | |
126 | + cursor.execute(delete) | |
127 | + log.info(u"删除数据完成") | |
128 | + log.info(u"向数据库中插入测试数据%r"%str(insert)) | |
129 | + cursor.execute(insert) | |
130 | + log.info(u"插入数据完成") | |
131 | + result=cursor.fetchall() | |
132 | + db.commit() | |
133 | + return result | |
134 | + else: | |
135 | + log.info(u"数据库没有重复数据直接插入自定义数据%r"%str(insert)) | |
136 | + result=cursor.execute(insert) | |
137 | + log.info(u"插入数据完成,返回结果为为%r"%str(result)) | |
138 | +# cursor.fetchall() | |
139 | + db.commit() | |
140 | + return result | |
141 | + | |
142 | + except Exception as e: | |
143 | + print(u"数据库操作异常:%r" % str(e)) | |
144 | + log.error(u"数据库操作异常:%r" % str(e)) | |
145 | + # 错误回滚 | |
146 | + db.rollback() | |
147 | + assert False | |
148 | + finally: | |
149 | + # 关闭数据库连接 | |
150 | + db.close() | |
151 | + | |
152 | +def mysql_select_order(orderNum): | |
153 | + return mysql_selectOne("SELECT * FROM `order`.orders WHERE code = '%s';"%orderNum) | |
154 | + | |
155 | +def mysql_delete_order(orderNum): | |
156 | + mysql_delete("DELETE FROM `order`.orders WHERE code = '%s';"%orderNum) | |
157 | + | |
158 | +def mysql_select_coupon(couponNum): | |
159 | + return mysql_selectOne("SELECT * FROM `customer`.customer_coupon WHERE id = '%s';"%couponNum) | |
160 | + | |
161 | +def mysql_delete_coupon(couponNum): | |
162 | + mysql_delete("DELETE FROM `customer`.customer_coupon WHERE id = '%s';"%couponNum) | |
163 | + | |
164 | + | |
165 | +def Check_in_Mysql(in_data,sql_spm): | |
166 | + log.info(u"======从数据库中查询传入数据======") | |
167 | + result=mysql_selectAll(sql_spm) | |
168 | + log.info(u"传入in_data为: %s"%in_data) | |
169 | + log.info(u"数据库查询到的结果为 %s"%result) | |
170 | + | |
171 | + result=str(result) | |
172 | + if len(str(in_data)) == 0 and len(result)!=0: | |
173 | + log.error(u"传入数据为空!!\n") | |
174 | + assert False | |
175 | + return | |
176 | + elif len(str(in_data)) == 0 and len(result)==0: | |
177 | + log.error(u"传入数据与数据库查询结果都为空!!\n") | |
178 | + assert False | |
179 | + return | |
180 | + elif len(str(in_data)) != 0 and len(result)==0: | |
181 | + log.error(u"数据库查询结果为空\n") | |
182 | + assert False | |
183 | + return | |
184 | + elif isinstance(in_data,(list)): | |
185 | + log.info(u'检查的数据格式 为list类型') | |
186 | + for i in range(0,len(in_data)): | |
187 | + in_data[i]=str(in_data[i]).decode("utf-8").encode("unicode-escape") | |
188 | + | |
189 | + if in_data[i] in result: | |
190 | + assert True | |
191 | + log.info(u"遍历list第%d次,插入数据%r与数据库查询结果一致"%(i,in_data[i])) | |
192 | + else: | |
193 | + log.error(u"#########ERROR#########:\n in_data与数据库查询结果不一致%r"%in_data[i]) | |
194 | + assert False | |
195 | + return True | |
196 | + | |
197 | + elif str(in_data).decode("utf-8").encode("unicode-escape") in result: | |
198 | + assert True | |
199 | + log.info(u"in_data与数据库查询结果一致!!%r"%in_data) | |
200 | + return True | |
201 | + else: | |
202 | + log.info(u"#########ERROR#########:\n in_data与数据库查询结果不一致!!%r"%in_data) | |
203 | + assert False | |
204 | + | |
205 | +def Check_in_Response(check_data,src_data): | |
206 | + #check_data必须为列表形式,src_data必须为r.json()的数据类型 | |
207 | + log.info(u"======从响应Body中查询传入数据======") | |
208 | + src_data=json.dumps(src_data) | |
209 | + src_data=src_data.replace(" ","") | |
210 | + log.info(u"传入check_data为: %s"%check_data) | |
211 | + log.info(u"对比的响应数据为 %s"%src_data) | |
212 | + if len(check_data) == 0 or len(src_data)==0: | |
213 | + log.error(u"传入数据为空!!\n") | |
214 | + assert False | |
215 | + return | |
216 | + elif isinstance (check_data,str) : | |
217 | + check_data=check_data.replace(" ","").replace("[","").replace("]","").decode("utf-8").split(",") | |
218 | + for i in range(0,len(check_data)): | |
219 | + #由于数据库查询的数据中,中文的格式为unicode-escape,所以传入的数据需要进行encode | |
220 | + check_data[i]=check_data[i].decode("utf-8").encode("unicode-escape") | |
221 | +# print type(check_data),check_data[i] | |
222 | + if check_data[i] in src_data: | |
223 | + assert True | |
224 | + log.info(u"遍历list第%d次,字段%s在请求响应结果中"%((i+1),check_data[i].decode("unicode-escape"))) | |
225 | + else: | |
226 | + log.error(u"#########ERROR#########:\n check_data不在请求响应结果中%s"%check_data[i].decode("unicode-escape")) | |
227 | + assert False | |
228 | + return True | |
229 | + elif isinstance (check_data,list) and len(check_data) > 0: | |
230 | + for i in range(0,len(check_data)): | |
231 | + check_data[i]=check_data[i].decode("utf-8").encode("unicode-escape") | |
232 | + print(type(check_data),check_data[i],str(check_data[i])) | |
233 | + print(type(src_data),src_data) | |
234 | + if check_data[i] in src_data: | |
235 | + assert True | |
236 | + log.info(u"遍历list第%d次,插入数据%r与数据库查询结果一致"%(i,check_data[i])) | |
237 | + else: | |
238 | + log.error(u"#########ERROR#########:\n check_data数据库查询结果不一致%r"%check_data[i]) | |
239 | + assert False | |
240 | + return True | |
241 | + else: | |
242 | + log.info(u"#########ERROR#########:\n 检查数据有问题,请检查!!!!!%r") | |
243 | + assert False | ... | ... |
src/commons/Logging.py
1 | -#!/usr/bin/python | |
2 | -# -*- coding: UTF-8 -*- | |
3 | -import logging,os | |
4 | - | |
5 | -class Logger(): | |
6 | - | |
7 | - def __init__(self, path=__name__,clevel = logging.ERROR,Flevel = logging.DEBUG,test = 'w'): | |
8 | - #test = 'w'时每次日志文件都重新写入,test = 'a'时为追加模式,在原来日志文件上追加日志 | |
9 | - #重写模式的时,发送test.log没有信息,用追加模式可以(注意如果为a时日志可能出现重复,为w时没有这个现象) | |
10 | - #设置日志路径 | |
11 | - current_path=os.path.dirname(os.path.dirname(__file__)) | |
12 | - path=current_path+"/report"+"/test.log" | |
13 | - | |
14 | - self.logger = logging.getLogger(path) | |
15 | - | |
16 | - self.logger.setLevel(logging.DEBUG) | |
17 | - | |
18 | - fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] : %(message)s', '%Y-%m-%d %H:%M:%S') | |
19 | -# fmt = logging.Formatter('[%(asctime)s] %(levelname)s [%(name)s,%(funcName)s: %(filename)s, %(lineno)d] %(message)s', '%Y-%m-%d %H:%M:%S') | |
20 | - #设置CMD日志 | |
21 | - | |
22 | - sh = logging.StreamHandler() | |
23 | - | |
24 | - sh.setFormatter(fmt) | |
25 | - | |
26 | - sh.setLevel(clevel) | |
27 | - | |
28 | - #设置文件日志 | |
29 | - | |
30 | - fh = logging.FileHandler(path,mode=test,encoding="utf-8") | |
31 | - | |
32 | - fh.setFormatter(fmt) | |
33 | - | |
34 | - fh.setLevel(Flevel) | |
35 | - | |
36 | - self.logger.addHandler(sh) | |
37 | - | |
38 | - self.logger.addHandler(fh) | |
39 | - | |
40 | - | |
41 | - def debug(self,message): | |
42 | - #初始化得时候self.logger = logging.getLogger(path) | |
43 | - self.logger.debug(message) | |
44 | - | |
45 | - def info(self,message): | |
46 | - | |
47 | - self.logger.info(message) | |
48 | - | |
49 | - | |
50 | - def warn(self,message): | |
51 | - | |
52 | - self.logger.warn(message) | |
53 | - | |
54 | - | |
55 | - def error(self,message): | |
56 | - | |
57 | - self.logger.error(message) | |
58 | - | |
59 | - | |
60 | - def critical(self,message): | |
61 | - | |
62 | - self.logger.critical(message) | |
63 | - | |
64 | - | |
65 | - | |
66 | - | |
67 | -# a=Logger() | |
68 | -# a.info("123") | |
69 | -# from Case_Method.Logging import * | |
70 | - | |
71 | -# logcommonsonfig(level=logging.DEBUG, # log level | |
72 | -# format='[%(asctime)s] %(levelname)s [%(funcName)s: %(filename)s, %(lineno)d] %(message)s', # log格式 | |
73 | -# datefmt='%Y-%m-%d %H:%M:%S', # 日期格式 | |
74 | -# filename='test.log', # 日志输出文件 | |
75 | -# filemode='a') # 追加模式 | |
76 | 1 | \ No newline at end of file |
2 | +#!/usr/bin/python | |
3 | +# -*- coding: UTF-8 -*- | |
4 | +import logging,os | |
5 | + | |
6 | +class Logger(): | |
7 | + | |
8 | + def __init__(self, path=__name__,clevel = logging.ERROR,Flevel = logging.DEBUG,test = 'w'): | |
9 | + current_path=os.path.dirname(os.path.dirname(__file__)) | |
10 | + path=current_path+"/report"+"/test.log" | |
11 | + | |
12 | + self.logger = logging.getLogger(path) | |
13 | + | |
14 | + self.logger.setLevel(logging.DEBUG) | |
15 | + | |
16 | + fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] : %(message)s', '%Y-%m-%d %H:%M:%S') | |
17 | + | |
18 | + sh = logging.StreamHandler() | |
19 | + | |
20 | + sh.setFormatter(fmt) | |
21 | + | |
22 | + sh.setLevel(clevel) | |
23 | + | |
24 | + #设置文件日志 | |
25 | + | |
26 | + fh = logging.FileHandler(path,mode=test,encoding="utf-8") | |
27 | + | |
28 | + fh.setFormatter(fmt) | |
29 | + | |
30 | + fh.setLevel(Flevel) | |
31 | + | |
32 | + self.logger.addHandler(sh) | |
33 | + | |
34 | + self.logger.addHandler(fh) | |
35 | + | |
36 | + | |
37 | + def debug(self,message): | |
38 | + | |
39 | + self.logger.debug(message) | |
40 | + | |
41 | + def info(self,message): | |
42 | + | |
43 | + self.logger.info(message) | |
44 | + | |
45 | + | |
46 | + def warn(self,message): | |
47 | + | |
48 | + self.logger.warn(message) | |
49 | + | |
50 | + | |
51 | + def error(self,message): | |
52 | + | |
53 | + self.logger.error(message) | |
54 | + | |
55 | + | |
56 | + def critical(self,message): | |
57 | + | |
58 | + self.logger.critical(message) | ... | ... |
src/commons/SendEmail.py
1 | -#!/usr/bin/python | |
2 | -# -*- coding: UTF-8 -*- | |
3 | -import os | |
4 | -import smtplib # 用于建立smtp连接 | |
5 | -from email.mime.multipart import MIMEMultipart # 混合MIME格式,支持上传附件 | |
6 | -from email.header import Header # 用于使用中文邮件主题 | |
7 | -from email.mime.text import MIMEText # 邮件需要专门的MIME格式 | |
8 | -from email.mime.image import MIMEImage | |
9 | -from email.mime.application import MIMEApplication | |
10 | -from commons.Logging import Logger | |
11 | -log=Logger() | |
12 | - | |
13 | -def send_email_text(): | |
14 | - # 1. 编写邮件内容(Email邮件需要专门的MIME格式) | |
15 | - msg = MIMEText('this is a test email', 'plain', 'utf-8') # plain指普通文本格式邮件内容 | |
16 | - | |
17 | - # 2. 组装Email头(发件人,收件人,主题) | |
18 | - msg['From'] = '328351418@qq.com' # 发件人 | |
19 | - msg['To'] = '328351418@qq.com' # 收件人 | |
20 | - msg['Subject'] = 'Api Test Report' # 邮件主题 | |
21 | - | |
22 | - # 3. 连接smtp服务器并发送邮件 | |
23 | - smtp = smtplib.SMTP_SSL('smtp.qq.com') # smtp服务器地址 使用SSL模式 | |
24 | - smtp.login('328351418@qq.com', 'apebatdwkggkbiee') # 用户名和密码 | |
25 | - smtp.sendmail("328351418@qq.com", "328351418@qq.com", msg.as_string()) | |
26 | - smtp.quit() | |
27 | - | |
28 | - | |
29 | -def send_email(send_file,send_to=["lixi@diligrp.com","328351418@qq.com"]): | |
30 | - | |
31 | - log_path=os.path.dirname(os.path.dirname(__file__)) | |
32 | - log_path=log_path+"/report/test.log" | |
33 | - msg = MIMEMultipart() # 混合MIME格式 | |
34 | - msg['From'] = '328351418@qq.com' # 发件人 | |
35 | - msg['To'] = '175930106@qq.com' # 收件人 | |
36 | - msg['Subject'] = Header('接口测试报告', 'utf-8') # 中文邮件主题,指定utf-8编码 | |
37 | - | |
38 | - text = MIMEText('this is a test email', 'plain', 'utf-8') | |
39 | - msg.attach(MIMEText(open(send_file,'rb' ).read(), 'html', 'utf-8')) # 邮件正文添加html格式内容(会丢失css格式) | |
40 | - | |
41 | - att1 = MIMEText(open(send_file, 'rb').read(), 'base64', 'utf-8') # 二进制格式打开需要添加的附件 | |
42 | - att1["Content-Type"] = 'application/octet-stream' | |
43 | - att1["Content-Disposition"] = 'attachment; filename="report.html"' # filename为邮件中附件显示的名字 | |
44 | - | |
45 | -# att2 = MIMEText(open("../Case_Report/test.log", 'rb').read(), 'base64', 'utf-8') # 二进制格式打开需要添加的附件 | |
46 | - att2 = MIMEText(open(log_path, 'rb').read(), 'base64', 'utf-8') # 二进制格式打开需要添加的附件 | |
47 | - att2["Content-Type"] = 'application/octet-stream' | |
48 | - att2["Content-Disposition"] = 'attachment; filename="test.log"' # filename为邮件中附件显示的名字 | |
49 | - msg.attach(text) | |
50 | - msg.attach(att1) | |
51 | - msg.attach(att2) | |
52 | - | |
53 | - #一下发送日志不会在test.log上,因为提前msg.attach了 | |
54 | - log.info("发送邮件") | |
55 | - try: | |
56 | - smtp = smtplib.SMTP_SSL('smtp.qq.com') # smtp服务器地址 使用SSL模式 | |
57 | - re=smtp.login('328351418@qq.com', 'wveicahctcizbghh') # 用户名和密码 | |
58 | - smtp.sendmail("328351418@qq.com", send_to, msg.as_string()) | |
59 | - print(re) | |
60 | -# smtp.sendmail("328351418@qq.com", "328351418@qq.com", msg.as_string()) # 发送给另一个邮箱 | |
61 | -# logging.info("邮件发送完成!") | |
62 | - except Exception as e: | |
63 | - log.error(str(e)) | |
64 | - print(e) | |
65 | - finally: | |
66 | - smtp.quit() | |
67 | - log.info("邮件发送完毕") | |
68 | - | |
69 | - | |
70 | -# | |
71 | -# f='E:\\EclipseWorkspace\\\WorksapceDemo\\Request-demo\\src\\report\\2019-11-28 15_39_01_result.html' | |
72 | -# send_email(send_file=f) | |
73 | -# fromaddr = '328351418@qq.com' | |
74 | -# password = 'apebatdwkggkbiee' | |
75 | -# toaddrs = ['328351418@qq.com', '328351418@qq.com'] | |
76 | -# | |
77 | -# content = 'hello, this is email content.' | |
78 | -# textApart = MIMEText(content) | |
79 | -# | |
80 | -# imageFile = 'E:\\EclipseWorkspace\\nong12test\\Request-fresh\\src\\Case_Report\\report.html' | |
81 | -# imageApart = MIMEApplication(open(imageFile, 'rb').read()) | |
82 | -# imageApart.add_header('Content-Disposition', 'attachment', filename='report.html') | |
83 | -# | |
84 | -# # pdfFile = '算法设计与分析基础第3版PDF.pdf' | |
85 | -# # pdfApart = MIMEApplication(open(pdfFile, 'rb').read()) | |
86 | -# # pdfApart.add_header('Content-Disposition', 'attachment', filename=pdfFile) | |
87 | -# # | |
88 | -# # | |
89 | -# # zipFile = '算法设计与分析基础第3版PDF.zip' | |
90 | -# # zipApart = MIMEApplication(open(zipFile, 'rb').read()) | |
91 | -# # zipApart.add_header('Content-Disposition', 'attachment', filename=zipFile) | |
92 | -# | |
93 | -# m = MIMEMultipart() | |
94 | -# m.attach(textApart) | |
95 | -# m.attach(imageApart) | |
96 | -# # m.attach(pdfApart) | |
97 | -# # m.attach(zipApart) | |
98 | -# m['Subject'] = 'TEST REPORT' | |
99 | -# m['From'] = '328351418@qq.com' | |
100 | -# m['to'] = '175930106@qq.com' | |
101 | -# | |
102 | -# try: | |
103 | -# server = smtplib.SMTP('smtp.qq.com') | |
104 | -# server.login(fromaddr,password) | |
105 | -# server.sendmail(fromaddr, toaddrs, m.as_string()) | |
106 | -# print('success') | |
107 | -# server.quit() | |
108 | -# except smtplib.SMTPException as e: | |
109 | -# print('error:',e) #打印错误 | |
110 | -# | |
111 | -# | |
112 | -# # file='E:\\EclipseWorkspace\\nong12test\\Request-fresh\\src\\Case_Report\\2019-01-28 17_54_18_result.html' | |
113 | -# # | |
114 | -# # email(file) | |
115 | 1 | \ No newline at end of file |
2 | +#!/usr/bin/python | |
3 | +# -*- coding: UTF-8 -*- | |
4 | +import os | |
5 | +import smtplib | |
6 | +from email.mime.multipart import MIMEMultipart | |
7 | +from email.header import Header | |
8 | +from email.mime.text import MIMEText | |
9 | +from email.mime.image import MIMEImage | |
10 | +from email.mime.application import MIMEApplication | |
11 | +from commons.Logging import Logger | |
12 | +log=Logger() | |
13 | + | |
14 | +def send_email_text(): | |
15 | + # 1. 编写邮件内容(Email邮件需要专门的MIME格式) | |
16 | + msg = MIMEText('this is a test email', 'plain', 'utf-8') | |
17 | + | |
18 | + # 2. 组装Email头(发件人,收件人,主题) | |
19 | + msg['From'] = '328351418@qq.com' # 发件人 | |
20 | + msg['To'] = '328351418@qq.com' # 收件人 | |
21 | + msg['Subject'] = 'Api Test Report' # 邮件主题 | |
22 | + | |
23 | + # 3. 连接smtp服务器并发送邮件 | |
24 | + smtp = smtplib.SMTP_SSL('smtp.qq.com') | |
25 | + smtp.login('328351418@qq.com', 'apebatdwkggkbiee') | |
26 | + smtp.sendmail("328351418@qq.com", "328351418@qq.com", msg.as_string()) | |
27 | + smtp.quit() | |
28 | + | |
29 | + | |
30 | +def send_email(send_file,send_to=["lixi@diligrp.com","328351418@qq.com"]): | |
31 | + | |
32 | + log_path=os.path.dirname(os.path.dirname(__file__)) | |
33 | + log_path=log_path+"/report/test.log" | |
34 | + msg = MIMEMultipart() # 混合MIME格式 | |
35 | + msg['From'] = '328351418@qq.com' # 发件人 | |
36 | + msg['To'] = '175930106@qq.com' # 收件人 | |
37 | + msg['Subject'] = Header('接口测试报告', 'utf-8') # 中文邮件主题,指定utf-8编码 | |
38 | + | |
39 | + text = MIMEText('this is a test email', 'plain', 'utf-8') | |
40 | + msg.attach(MIMEText(open(send_file,'rb' ).read(), 'html', 'utf-8')) | |
41 | + | |
42 | + att1 = MIMEText(open(send_file, 'rb').read(), 'base64', 'utf-8') | |
43 | + att1["Content-Disposition"] = 'attachment; filename="report.html"' | |
44 | + | |
45 | + att2 = MIMEText(open(log_path, 'rb').read(), 'base64', 'utf-8') | |
46 | + att2["Content-Type"] = 'application/octet-stream' | |
47 | + att2["Content-Disposition"] = 'attachment; filename="test.log"' | |
48 | + msg.attach(text) | |
49 | + msg.attach(att1) | |
50 | + msg.attach(att2) | |
51 | + | |
52 | + #一下发送日志不会在test.log上,因为提前msg.attach了 | |
53 | + log.info("发送邮件") | |
54 | + try: | |
55 | + smtp = smtplib.SMTP_SSL('smtp.qq.com') # smtp服务器地址 使用SSL模式 | |
56 | + re=smtp.login('328351418@qq.com', 'wveicahctcizbghh') # 用户名和密码 | |
57 | + smtp.sendmail("328351418@qq.com", send_to, msg.as_string()) | |
58 | + print(re) | |
59 | + except Exception as e: | |
60 | + log.error(str(e)) | |
61 | + print(e) | |
62 | + finally: | |
63 | + smtp.quit() | |
64 | + log.info("邮件发送完毕") | ... | ... |
src/commons/common.py
1 | -#!/usr/bin/python | |
2 | -# -*- coding: UTF-8 -*- | |
3 | -import os | |
4 | -import operator | |
5 | -import configparser | |
6 | -import requests | |
7 | -import json | |
8 | -from commons.Logging import Logger | |
9 | -import urllib3 | |
10 | -urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) | |
11 | -log=Logger() | |
12 | - | |
13 | - | |
14 | -def get_global_config(file,section, key): | |
15 | - | |
16 | - current_path=os.path.dirname(__file__) | |
17 | - src_path=os.path.dirname(current_path) | |
18 | -# global_setting_path=src_path+'/config/global_data.conf' | |
19 | - global_setting_path=src_path+'/config/'+file+".conf" | |
20 | - #验证文件是否存在 | |
21 | - file_path = os.path.exists(global_setting_path) | |
22 | - if file_path: | |
23 | - #获取文件的数据 | |
24 | - if isinstance(key,int): | |
25 | - log.error("key of section cannot be int Type :<%r> "%str(key)) | |
26 | - raise Exception("key of section cannot be int Type :<%r> "%str(key)) | |
27 | - else: | |
28 | - config = configparser.ConfigParser() | |
29 | - config.read(global_setting_path,encoding="utf-8") | |
30 | - return config.get(section, key) | |
31 | - else: | |
32 | - log.error("File Not Exist :<%r> "%str(global_setting_path)) | |
33 | - raise Exception("File Not Exist :<%r> "%str(global_setting_path)) | |
34 | - | |
35 | - | |
36 | -def get_api_config(api,section,key): | |
37 | - current_path=os.path.dirname(__file__) | |
38 | - src_path=os.path.dirname(current_path) | |
39 | - api_path=src_path+"/config/api/" | |
40 | - api_config_path=api_path+api+".conf" | |
41 | - #验证文件是否存在 | |
42 | - file_path = os.path.exists(api_config_path) | |
43 | - if file_path: | |
44 | - #获取文件的数据 | |
45 | - if isinstance(key,int): | |
46 | - log.error("key of section cannot be int Type :<%r> "%str(key)) | |
47 | - raise Exception("key of section cannot be int Type :<%r> "%str(key)) | |
48 | - else: | |
49 | - config = configparser.ConfigParser() | |
50 | - config.read(api_config_path,encoding="utf-8") | |
51 | - return config.get(section, key) | |
52 | - else: | |
53 | - log.error("File Not Exist :<%r> "%str(api_config_path)) | |
54 | - raise Exception("File Not Exist :<%r> "%str(api_config_path)) | |
55 | - | |
56 | -def set_global_config(file,section, key,value): | |
57 | - current_path=os.path.dirname(__file__) | |
58 | - src_path=os.path.dirname(current_path) | |
59 | -# global_setting_path=src_path+'/config/global_data.conf' | |
60 | - global_setting_path=src_path+'/config/'+file+".conf" | |
61 | - #验证文件是否存在 | |
62 | - file_path = os.path.exists(global_setting_path) | |
63 | - if file_path: | |
64 | - #获取文件的数据 | |
65 | - if isinstance(key,int): | |
66 | - log.error("key of section cannot be int Type :<%r> "%str(key)) | |
67 | - raise Exception("key of section cannot be int Type :<%r> "%str(key)) | |
68 | - else: | |
69 | - config = configparser.ConfigParser() | |
70 | - config.read(global_setting_path,encoding="utf-8") | |
71 | - config.set(section, key, value) | |
72 | - config.write(open(global_setting_path, "w")) | |
73 | - | |
74 | - return config.get(section, key) | |
75 | - else: | |
76 | - log.error("File Not Exist :<%r> "%str(global_setting_path)) | |
77 | - raise Exception("File Not Exist :<%r> "%str(global_setting_path)) | |
78 | - | |
79 | -def set_priority(priority_list): | |
80 | - #用户自定义优先级方法,设定有需要运行的用例优先级 | |
81 | - #方法内定义global全局变量可以真正通过这个方法设置一个全局的值,如果global放在外面,方法内的变量都是临时的, | |
82 | - #接上面:即使名称和外面的全局变量相同,方法内的变量和外面的全局变量完全是两码事,外面的全局变量不会受干扰 | |
83 | - global _global_priority | |
84 | - if priority_list: | |
85 | - _global_priority=priority_list | |
86 | - return _global_priority | |
87 | - else: | |
88 | - _global_priority=[1,2,3] | |
89 | - return _global_priority | |
90 | - | |
91 | -def set_mark(case_mark): | |
92 | - #用户自定义优先级方法,设定有需要运行的用例优先级 | |
93 | - global _global_mark | |
94 | - if case_mark: | |
95 | - _global_mark=case_mark | |
96 | - return _global_mark | |
97 | - else: | |
98 | - _global_mark=False | |
99 | - return _global_mark | |
100 | - | |
101 | -def read_priority_list(): | |
102 | - #需要重新设定一个方法来读取配置的全局优先级变量,且必须在全局变量初始化后使用,不然会报错 | |
103 | - #如果直接再py文件中加入类似p=set_priority_list()的代码,之前用户自定义的优先级配置将会失效 | |
104 | - priority_list=[1,2,3] | |
105 | - try: | |
106 | - return _global_priority | |
107 | - except Exception as e: | |
108 | - return priority_list | |
109 | - | |
110 | -def read_case_mark(): | |
111 | - #需要重新设定一个方法来读取配置的全局优先级变量,且必须在全局变量初始化后使用,不然会报错 | |
112 | - #如果直接再py文件中加入类似p=set_priority_list()的代码,之前用户自定义的优先级配置将会失效 | |
113 | - casemark=False | |
114 | - try: | |
115 | - return _global_mark | |
116 | - except Exception as e: | |
117 | - return casemark | |
118 | - | |
119 | -def mark(tag=None,p=None): | |
120 | - #此处的try主要用于,当用户需要直接运行单个用例文件时,没提前_global_priority和_global_mark初始化 | |
121 | - #如果不加try处理,那么_global_priority和_global_mark没有初始化时,单独运行一个引用了mark方法的用例文件会报错 | |
122 | - try: | |
123 | - #用户没有输入任何值 | |
124 | - if _global_priority == [1,2,3] and _global_mark == False : | |
125 | - return True | |
126 | - #只指定用例标签 | |
127 | - elif _global_priority == [1,2,3] and _global_mark != False: | |
128 | - if tag == _global_mark: | |
129 | - return True | |
130 | - else: | |
131 | - return False | |
132 | - #只指定用例优先级 | |
133 | - elif _global_priority != [1,2,3] and _global_mark == False: | |
134 | - if p in _global_priority: | |
135 | - return True | |
136 | - else: | |
137 | - return False | |
138 | - #同时指定优先级和标签 | |
139 | - elif _global_priority != [1,2,3] and _global_mark != False: | |
140 | - if p in _global_priority and tag == _global_mark: | |
141 | - return True | |
142 | - else: | |
143 | - return False | |
144 | - #若直接在用例文件中运行那么_global_mark和_global_priority都不会被定义,会导致异常 | |
145 | - #这里的try用来当上述两个变量未定义时,默认跑当前文件的用例 | |
146 | - except Exception as e: | |
147 | - return True | |
148 | - | |
149 | - | |
150 | -def get_session(name,password): | |
151 | - pass | |
152 | - return "header" | |
153 | - | |
154 | -def get_token(name,password): | |
155 | - pass | |
156 | - return "token" | |
157 | - | |
158 | -def get_request_Url(api): | |
159 | - return get_api_config(api,'RequestUrl', 'url') | |
160 | - | |
161 | -def get_request_Json(api): | |
162 | - return get_api_config(api,'JsonStructrue', 'requestJson') | |
163 | - | |
164 | -# def post_request(api_url, argu, headers): | |
165 | -# #传值前最好要进行一个类型判断,以免数据类型没有转换正确,或者重复转换,导致调用接口时失败 | |
166 | -# test_headers=json.loads(headers) | |
167 | -# r = requests.post(api_url, data=argu, headers=test_headers) | |
168 | -# return r | |
169 | - | |
170 | -def dict_diff(a1,b1): | |
171 | - #提取出dict与str或list的异常对比场景 | |
172 | - if type(a1)!= type(b1): | |
173 | - print("实际响应json的元素{}的类型{}和期望响应json元素{}的类型{}不一致".format(a1,type(a1),b1,type(b1))) | |
174 | - return False | |
175 | - d1=list(set(a1.keys()).difference(set(b1.keys()))) | |
176 | - d2=list(set(b1.keys()).difference(set(a1.keys()))) | |
177 | - if len(d1)==0 and len(d2)==0: | |
178 | - return True | |
179 | - else: | |
180 | - print("实际json比期望json多了键值",d1) | |
181 | - print("实际json比期望json少了键值",d2) | |
182 | - return False | |
183 | - | |
184 | -def list_diff(a1,b1): | |
185 | - #提取出list与str或dict的异常对比场景 | |
186 | - if type(a1)!= type(b1): | |
187 | - print("实际响应json的元素{}的类型{}和期望响应json元素{}的类型{}不一致".format(a1,type(a1),b1,type(b1))) | |
188 | - return False | |
189 | - elif len(a1)!=len(b1): | |
190 | - print("实际响应json列表长度{}和期望响应json列表长度{}不一致".format(a1,b1)) | |
191 | - return False | |
192 | - else: | |
193 | - return True | |
194 | - | |
195 | -#无法判断[[1],[2]]和[[1],[1]]的区别,只能判断列表长度和字典键值是否一致 | |
196 | -#a为实际对比的json数据,b为期望的json数据 | |
197 | -def compare_json(a,b): | |
198 | - #判断检查数据是否为列表格式的数据 | |
199 | - if isinstance(a,list): | |
200 | - if list_diff(a,b)==True: | |
201 | - #为列表时必须进行排序,否则可能出现列表对比的位置不一致 | |
202 | - a.sort() | |
203 | - b.sort() | |
204 | - for i in range(len(a)): | |
205 | - #判断列表中的指定的元素是否为字典格式 | |
206 | - if compare_json(a[i],b[i]) == False: | |
207 | - return False | |
208 | - else: | |
209 | - return False | |
210 | - #判断检查数据是否为字典格式的数据 | |
211 | - elif isinstance(a,dict): | |
212 | - if dict_diff(a,b)==True: | |
213 | - #如果第一层键值相同时,遍历检查内层所有键值 | |
214 | - for key in a.keys(): | |
215 | - #内层键值为列表数据类型时 | |
216 | - if compare_json(a[key],b[key]) == False: | |
217 | - return False | |
218 | - else: | |
219 | - return False | |
220 | - #期望数据非dict和list类型时,直接进行对比,可能会导致{"code":"200"},{"code":"201"}出现不同的情况,所以注释下面的结果 | |
221 | -# elif operator.eq(a, b)==False: | |
222 | -# print("实际数据的{}和期望数据的{}不一致".format(a,b)) | |
223 | -# return False | |
224 | - | |
225 | -#接口返回值是可控的情况可以用下面这个方法 | |
226 | -def cmp_json(actual_data,expect_data): | |
227 | - log.info("======对比期望和实际响应Json格式======") | |
228 | - try: | |
229 | - if len(expect_data)!=0 and len(actual_data)!=0: | |
230 | - expect_data=json.loads(expect_data) | |
231 | - result=compare_json(actual_data,expect_data) | |
232 | - if result==None: | |
233 | - log.info("响应数据和期望数据的Json格式一致") | |
234 | - return True | |
235 | - else: | |
236 | - log.error("66响应数据和期望数据的Json格式不一致") | |
237 | - return False | |
238 | - elif len(expect_data)!=0 and len(actual_data)==0: | |
239 | - log.error("对比数据中,实际响应数据为空") | |
240 | - assert False | |
241 | - elif len(expect_data)==0 and len(actual_data)!=0: | |
242 | - log.error("对比数据中,期望响应数据为空,请检查配置文件") | |
243 | - assert False | |
244 | - elif len(expect_data)==0 and len(actual_data)==0: | |
245 | - log.error("对比数据都为空") | |
246 | - assert False | |
247 | - except Exception as e: | |
248 | - log.error("对比响应数据和期望数据的Json格式 ERROR == %s"%e) | |
249 | - return False | |
250 | - | |
251 | -def get_to_post(data): | |
252 | - #需要传入get格式的请求,如:id=638&driver=好司机&licensePlate=车辆信息,返回字典类型数据 | |
253 | - if isinstance(data, str): | |
254 | - test={i.split("=",1)[0]:i.split("=")[1] for i in data.split("&")} | |
255 | - return test | |
256 | - else: | |
257 | - raise Exception("transformation data must be str type") | |
258 | - | |
259 | -def post_to_get(data): | |
260 | - if isinstance(data, dict): | |
261 | - #字典类型,格式如{'id':'668','driver':'好司机'}或者{"id":"668","driver":"好司机"} | |
262 | - test=json.dumps(data) | |
263 | - test=test.replace(" ","").replace('":"', '=').replace('","', "&").replace('"', '').replace("{", "").replace("}", "") | |
264 | - return test.encode('utf_8').decode("unicode_escape") | |
265 | - elif isinstance(data, str): | |
266 | - if '"' in data: | |
267 | - #字符串类型,格式如str({'id':'668','driver':'好司机'}) | |
268 | - test=data.replace(" ","").replace('":"', '=').replace('","', "&").replace('"', '').replace("{", "").replace("}", "") | |
269 | - return test | |
270 | - elif "'" in data: | |
271 | - #json字符串类型,格式如str({"id":"668","driver":"好司机"}) | |
272 | - test=data.replace(" ","").replace("':'", "=").replace("','", "&").replace("'", "").replace("{", "").replace("}", "") | |
273 | - return test | |
274 | - else: | |
275 | - raise Exception("pls check your transformation data") | |
276 | - | |
277 | -def get_request(api,caseNum): | |
278 | - #传值前最好要进行一个类型判断,以免数据类型没有转换正确,或者重复转换,导致调用接口时失败 | |
279 | - if 'http' in api.replace(' ',''): | |
280 | - log.info(u"======直接调用GET请求%s======"%api) | |
281 | - r = requests.post(api, headers=caseNum,verify=False) | |
282 | - else: | |
283 | - URL=get_api_config(api,'RequstURL', 'url') | |
284 | - #获取header | |
285 | - headers=get_api_config(api,'RequstHeader', 'header') | |
286 | - if 'none' == headers: | |
287 | - #header=str(获取有session和token的header) | |
288 | - pass | |
289 | - headers=json.loads(headers) | |
290 | - #获取URI | |
291 | - params=get_api_config(api,caseNum, 'URL_params') | |
292 | - params=params.replace("[","").replace("]","") | |
293 | - URI=URL+params | |
294 | - #进行get请求 | |
295 | - r = requests.get(URI,headers=headers) | |
296 | - if r.status_code == 200: | |
297 | - # 关闭请求 释放内存 | |
298 | - r.close() | |
299 | - return r | |
300 | - else: | |
301 | - r.close() | |
302 | - log.error(u"Request code==%s ! Response Code is not 200,Pls Check Your Request Datas"%(r.status_code)) | |
303 | - raise Exception(u"Request Fail! Response Code is not 200,Pls Check Your Request Datas") | |
304 | - return r | |
305 | - | |
306 | - | |
307 | -def post_request(api,caseNum,requestBody): | |
308 | - #设置重连次数 | |
309 | - requests.adapters.DEFAULT_RETRIES = 5 | |
310 | - # 设置连接活跃状态为False | |
311 | - s = requests.session() | |
312 | - s.keep_alive = False | |
313 | - #判断post方法使用方式 | |
314 | - if 'http' in api.replace(' ',''): | |
315 | - log.info(u"======直接调用POST请求%s======"%api) | |
316 | - r = requests.post(api, headers=caseNum,data=requestBody,verify=False) | |
317 | - else: | |
318 | - log.info(u"======配置相关参数,调用POST请求%s======"%caseNum) | |
319 | - #传值前最好要进行一个类型判断,以免数据类型没有转换正确,或者重复转换,导致调用接口时失败 | |
320 | - #获取请求地址数据 | |
321 | - url=get_api_config(api,'RequstURL', 'url') | |
322 | - #获取请求header数据 | |
323 | - header=get_api_config(api,'RequstHeader', 'header') | |
324 | - if 'none' == header: | |
325 | - #header=str(获取有session和token的header) | |
326 | - pass | |
327 | - #获取请求body数据 | |
328 | - body=get_api_config(api,caseNum,requestBody) | |
329 | - #获取请求备注内容 | |
330 | - notes=get_api_config(api,caseNum,'notes') | |
331 | - #获取请求期望json格式 | |
332 | - expect_Response=get_api_config(api,caseNum,'expect_Response') | |
333 | - #把转换header类型 | |
334 | - test_headers=json.loads(header) | |
335 | - #避免日志中的中文乱码,进行编码转换 | |
336 | - test_body=json.dumps(json.loads(body)).decode('unicode_escape') | |
337 | - #调用post请求 | |
338 | - r = requests.post(url, data=body, headers=test_headers,verify=False) | |
339 | - #进行日志记录 | |
340 | - log.info(u"NUM:%s | 请求备注 ==%s"%(caseNum,notes)) | |
341 | - log.info(u"NUM:%s | 请求URL==%s"%(caseNum,url)) | |
342 | - log.info(u"NUM:%s | 请求body==%s"%(caseNum,test_body)) | |
343 | - log.info(u"NUM:%s | 请求实际响应格式 ==%s"%(caseNum,r.content)) | |
344 | - log.info(u"NUM:%s | 请求期望响应格式 ==%s"%(caseNum,expect_Response)) | |
345 | - #判断请求是否成功 | |
346 | - if r.status_code == 200: | |
347 | - # 关闭请求 释放内存 | |
348 | - r.close() | |
349 | - return r | |
350 | - else: | |
351 | - r.close() | |
352 | - log.error(u"Request code==%s ! Response Code is not 200,Pls Check Your Request Datas"%(r.status_code)) | |
353 | - raise Exception(u"Request Fail! Response Code is not 200,Pls Check Your Request Datas") | |
354 | - | |
355 | - | |
356 | - | |
357 | - | |
358 | -# def my | |
359 | - | |
360 | -# a='https://gateway.fresh.nong12.com/getCityByPosition?lat=30.661286&lng=104.067624' | |
361 | -# b={ | |
362 | -# "Host": "gateway.fresh.nong12.com", | |
363 | -# "Content-Type": "application/json", | |
364 | -# "referer": "https://servicewechat.com/wxd1405e5c40ff05db/0/page-frame.html", | |
365 | -# "apiusertoken": "dili-fresh-token", | |
366 | -# "charset": "utf-8", | |
367 | -# "Accept-Encoding": "gzip", | |
368 | -# "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; HUAWEI NXT-AL10 Build/HUAWEINXT-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/59.0.3071.125 Mobile Safari/537.36 MicroMessenger/6.7.3.1360(0x2607033D) NetType/WIFI Language/zh_CN Process/appbrand2" | |
369 | -# } | |
370 | -# print get_request('getCityByPosition','getCityByPosition01').json() | |
371 | -# a= get_api_config('submitOrder', 'RequstHeader', 'header') | |
372 | -# b= get_global_config('basic_data_prepare', 'instert_customer') | |
373 | -# print(a) | |
374 | -# print(b) | |
375 | -# print type(a) | |
376 | -# a=json.loads(a) | |
377 | -# print a | |
378 | -# a=json.dumps(a) | |
379 | -# print a | |
380 | -# print a | |
381 | -# a=post_request('nearBy', 'nearBy01', 'requestBody') | |
382 | -# # b=get_api_config('listCoupon', 'listCoupon01', 'expect_Response') | |
383 | -# print a.json() | |
384 | -# print json_compare(b, a.json()) | |
385 | -# a=['code', 'data', 'result', 'success'] | |
386 | -# b=['code', 'data', 'result', 'success'] | |
387 | -# print str(b) | |
388 | -# print json_compare(str(b), a) | |
389 | - | |
390 | -# print a.content | |
391 | -# a=post_request('www.baidu.com/',"" ,"" ) | |
392 | -# print a.headers | |
393 | -# print type(a) | |
394 | -# b=json.loads(a) | |
395 | -# c=json.dumps(json.loads(a)).decode('unicode_escape') | |
396 | -# print c | |
397 | -# a={"code":"200","data":{"code":"200","data":[],"result":"OK","success":1},"result":"OK","success":2} | |
398 | -# b={"code":"200","data":{"code":"200","data":[{"couponBizType":1,"couponCode":"004","couponConditionValue":0,"couponDescription":"auto","couponDiscount":1000,"couponDuration":10,"couponName":"成勇测试01","couponTimeEnd":"2025-01-26 23:59:59","couponTimeSt":"2019-01-17 00:00:00","couponType":2,"created":"2019-01-17 15:14:15","customerCode":"00010966","id":10000,"isUsable":2,"state":1,"version":1}],"result":"OK","success":2},"result":"OK","success":2} | |
399 | -# print type(a),type(b) | |
400 | -# prjson_cmp(a, b) | |
401 | 1 | \ No newline at end of file |
2 | +#!/usr/bin/python | |
3 | +# -*- coding: UTF-8 -*- | |
4 | +import os | |
5 | +import operator | |
6 | +import configparser | |
7 | +import requests | |
8 | +import json | |
9 | +from commons.Logging import Logger | |
10 | +import urllib3 | |
11 | +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) | |
12 | +log=Logger() | |
13 | + | |
14 | + | |
15 | +def get_global_config(file,section, key): | |
16 | + | |
17 | + current_path=os.path.dirname(__file__) | |
18 | + src_path=os.path.dirname(current_path) | |
19 | +# global_setting_path=src_path+'/config/global_data.conf' | |
20 | + global_setting_path=src_path+'/config/'+file+".conf" | |
21 | + #验证文件是否存在 | |
22 | + file_path = os.path.exists(global_setting_path) | |
23 | + if file_path: | |
24 | + #获取文件的数据 | |
25 | + if isinstance(key,int): | |
26 | + log.error("key of section cannot be int Type :<%r> "%str(key)) | |
27 | + raise Exception("key of section cannot be int Type :<%r> "%str(key)) | |
28 | + else: | |
29 | + config = configparser.ConfigParser() | |
30 | + config.read(global_setting_path,encoding="utf-8") | |
31 | + return config.get(section, key) | |
32 | + else: | |
33 | + log.error("File Not Exist :<%r> "%str(global_setting_path)) | |
34 | + raise Exception("File Not Exist :<%r> "%str(global_setting_path)) | |
35 | + | |
36 | + | |
37 | +def get_api_config(api,section,key): | |
38 | + current_path=os.path.dirname(__file__) | |
39 | + src_path=os.path.dirname(current_path) | |
40 | + api_path=src_path+"/config/api/" | |
41 | + api_config_path=api_path+api+".conf" | |
42 | + #验证文件是否存在 | |
43 | + file_path = os.path.exists(api_config_path) | |
44 | + if file_path: | |
45 | + #获取文件的数据 | |
46 | + if isinstance(key,int): | |
47 | + log.error("key of section cannot be int Type :<%r> "%str(key)) | |
48 | + raise Exception("key of section cannot be int Type :<%r> "%str(key)) | |
49 | + else: | |
50 | + config = configparser.ConfigParser() | |
51 | + config.read(api_config_path,encoding="utf-8") | |
52 | + return config.get(section, key) | |
53 | + else: | |
54 | + log.error("File Not Exist :<%r> "%str(api_config_path)) | |
55 | + raise Exception("File Not Exist :<%r> "%str(api_config_path)) | |
56 | + | |
57 | + | |
58 | +def set_priority(priority_list): | |
59 | + #用户自定义优先级方法,设定有需要运行的用例优先级 | |
60 | + global _global_priority | |
61 | + if priority_list: | |
62 | + _global_priority=priority_list | |
63 | + return _global_priority | |
64 | + else: | |
65 | + _global_priority=[1,2,3] | |
66 | + return _global_priority | |
67 | + | |
68 | +def set_mark(case_mark): | |
69 | + #用户自定义优先级方法,设定有需要运行的用例优先级 | |
70 | + global _global_mark | |
71 | + if case_mark: | |
72 | + _global_mark=case_mark | |
73 | + return _global_mark | |
74 | + else: | |
75 | + _global_mark=False | |
76 | + return _global_mark | |
77 | + | |
78 | +def read_priority_list(): | |
79 | + #需要重新设定一个方法来读取配置的全局优先级变量,且必须在全局变量初始化后使用,不然会报错 | |
80 | + priority_list=[1,2,3] | |
81 | + try: | |
82 | + return _global_priority | |
83 | + except Exception as e: | |
84 | + return priority_list | |
85 | + | |
86 | +def read_case_mark(): | |
87 | + #需要重新设定一个方法来读取配置的全局优先级变量,且必须在全局变量初始化后使用,不然会报错 | |
88 | + casemark=False | |
89 | + try: | |
90 | + return _global_mark | |
91 | + except Exception as e: | |
92 | + return casemark | |
93 | + | |
94 | +def mark(tag=None,p=None): | |
95 | + #此处的try主要用于,当用户需要直接运行单个用例文件时,没提前_global_priority和_global_mark初始化 | |
96 | + try: | |
97 | + #用户没有输入任何值 | |
98 | + if _global_priority == [1,2,3] and _global_mark == False : | |
99 | + return True | |
100 | + #只指定用例标签 | |
101 | + elif _global_priority == [1,2,3] and _global_mark != False: | |
102 | + if tag == _global_mark: | |
103 | + return True | |
104 | + else: | |
105 | + return False | |
106 | + #只指定用例优先级 | |
107 | + elif _global_priority != [1,2,3] and _global_mark == False: | |
108 | + if p in _global_priority: | |
109 | + return True | |
110 | + else: | |
111 | + return False | |
112 | + #同时指定优先级和标签 | |
113 | + elif _global_priority != [1,2,3] and _global_mark != False: | |
114 | + if p in _global_priority and tag == _global_mark: | |
115 | + return True | |
116 | + else: | |
117 | + return False | |
118 | + except Exception as e: | |
119 | + return True | |
120 | + | |
121 | + | |
122 | +def get_session(name,password): | |
123 | + pass | |
124 | + return "header" | |
125 | + | |
126 | +def get_token(name,password): | |
127 | + pass | |
128 | + return "token" | |
129 | + | |
130 | +def get_request_Url(api): | |
131 | + return get_api_config(api,'RequestUrl', 'url') | |
132 | + | |
133 | +def get_request_Json(api): | |
134 | + return get_api_config(api,'JsonStructrue', 'requestJson') | |
135 | + | |
136 | + | |
137 | +def dict_diff(a1,b1): | |
138 | + #提取出dict与str或list的异常对比场景 | |
139 | + if type(a1)!= type(b1): | |
140 | + print("实际响应json的元素{}的类型{}和期望响应json元素{}的类型{}不一致".format(a1,type(a1),b1,type(b1))) | |
141 | + return False | |
142 | + d1=list(set(a1.keys()).difference(set(b1.keys()))) | |
143 | + d2=list(set(b1.keys()).difference(set(a1.keys()))) | |
144 | + if len(d1)==0 and len(d2)==0: | |
145 | + return True | |
146 | + else: | |
147 | + print("实际json比期望json多了键值",d1) | |
148 | + print("实际json比期望json少了键值",d2) | |
149 | + return False | |
150 | + | |
151 | +def list_diff(a1,b1): | |
152 | + #提取出list与str或dict的异常对比场景 | |
153 | + if type(a1)!= type(b1): | |
154 | + print("实际响应json的元素{}的类型{}和期望响应json元素{}的类型{}不一致".format(a1,type(a1),b1,type(b1))) | |
155 | + return False | |
156 | + elif len(a1)!=len(b1): | |
157 | + print("实际响应json列表长度{}和期望响应json列表长度{}不一致".format(a1,b1)) | |
158 | + return False | |
159 | + else: | |
160 | + return True | |
161 | + | |
162 | +#无法判断[[1],[2]]和[[1],[1]]的区别,只能判断列表长度和字典键值是否一致 | |
163 | +#a为实际对比的json数据,b为期望的json数据 | |
164 | +def compare_json(a,b): | |
165 | + #判断检查数据是否为列表格式的数据 | |
166 | + if isinstance(a,list): | |
167 | + if list_diff(a,b)==True: | |
168 | + #为列表时必须进行排序,否则可能出现列表对比的位置不一致 | |
169 | + a.sort() | |
170 | + b.sort() | |
171 | + for i in range(len(a)): | |
172 | + #判断列表中的指定的元素是否为字典格式 | |
173 | + if compare_json(a[i],b[i]) == False: | |
174 | + return False | |
175 | + else: | |
176 | + return False | |
177 | + #判断检查数据是否为字典格式的数据 | |
178 | + elif isinstance(a,dict): | |
179 | + if dict_diff(a,b)==True: | |
180 | + #如果第一层键值相同时,遍历检查内层所有键值 | |
181 | + for key in a.keys(): | |
182 | + #内层键值为列表数据类型时 | |
183 | + if compare_json(a[key],b[key]) == False: | |
184 | + return False | |
185 | + else: | |
186 | + return False | |
187 | + #期望数据非dict和list类型时,直接进行对比,可能会导致{"code":"200"},{"code":"201"}出现不同的情况,所以注释下面的结果 | |
188 | +# elif operator.eq(a, b)==False: | |
189 | +# print("实际数据的{}和期望数据的{}不一致".format(a,b)) | |
190 | +# return False | |
191 | + | |
192 | +#接口返回值是可控的情况可以用下面这个方法 | |
193 | +def cmp_json(actual_data,expect_data): | |
194 | + log.info("======对比期望和实际响应Json格式======") | |
195 | + try: | |
196 | + if len(expect_data)!=0 and len(actual_data)!=0: | |
197 | + expect_data=json.loads(expect_data) | |
198 | + result=compare_json(actual_data,expect_data) | |
199 | + if result==None: | |
200 | + log.info("响应数据和期望数据的Json格式一致") | |
201 | + return True | |
202 | + else: | |
203 | + log.error("66响应数据和期望数据的Json格式不一致") | |
204 | + return False | |
205 | + elif len(expect_data)!=0 and len(actual_data)==0: | |
206 | + log.error("对比数据中,实际响应数据为空") | |
207 | + assert False | |
208 | + elif len(expect_data)==0 and len(actual_data)!=0: | |
209 | + log.error("对比数据中,期望响应数据为空,请检查配置文件") | |
210 | + assert False | |
211 | + elif len(expect_data)==0 and len(actual_data)==0: | |
212 | + log.error("对比数据都为空") | |
213 | + assert False | |
214 | + except Exception as e: | |
215 | + log.error("对比响应数据和期望数据的Json格式 ERROR == %s"%e) | |
216 | + return False | |
217 | + | |
218 | + | |
219 | + | ... | ... |