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 | db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' ) | 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 | cursor = db.cursor() | 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 | \ No newline at end of file | 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 | \ No newline at end of file | 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 | \ No newline at end of file | 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 | \ No newline at end of file | 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 | + |