Skip to content

Commit

Permalink
params json
Browse files Browse the repository at this point in the history
  • Loading branch information
qiangzhouf committed Jul 7, 2018
1 parent f0f6489 commit 4f3467e
Show file tree
Hide file tree
Showing 12 changed files with 201 additions and 293 deletions.
5 changes: 3 additions & 2 deletions web/lib/case.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding:utf-8
import uuid
import time
import json
Expand Down Expand Up @@ -63,5 +64,5 @@ def run(self):
print(traceback.format_exc())
pass

return self.name, self.status, self.interface.log_file

return self.name, self.status, self.interface.log_file, self.del_data

137 changes: 92 additions & 45 deletions web/lib/interface.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding:utf-8
'''
接口类:实现接口参数化操作
支持:
Expand Down Expand Up @@ -70,9 +71,12 @@ def log(self, msg, content):

# 参数修改
def modify_params(self,k_v):
if k_v == '' or k_v == None:
k_v = {}
return
try:
Interface.dynamic_params(k_v)
k_v = self.g_replace(k_v)
self.g_replace(k_v)

except:
print(traceback.format_exc())
Expand All @@ -81,12 +85,23 @@ def modify_params(self,k_v):
# 下发接口
def request(self):
try:
# url中{}的参数替换
if '{' in self.url:
tmp = self.url.split('{')
for i in range(1, len(tmp)):
tmp_key = tmp[i].split('}')[0]
self.url = self.url.replace('{%s}' % tmp_key, self.params[tmp_key])
del self.params[tmp_key]

if Interface.cookie:
self.headers['Cookie'] = Interface.cookie
if self.method == 'GET':
r = requests.get(Interface.protocol+Interface.host+self.url,
r = requests.request(self.method, Interface.protocol+Interface.host+self.url,
params=self.params, headers=self.headers)
elif self.method == 'POST':
elif self.method == 'DELETE':

r = requests.request(self.method, Interface.protocol+Interface.host+self.url, headers=self.headers)
elif self.method == 'POST' or self.method == 'PUT':
files = {}
for key in self.params:
if isinstance(self.params[key], str):
Expand All @@ -96,13 +111,12 @@ def request(self):
for key in files:
del self.params[key]
if files:
r = requests.post(Interface.protocol+Interface.host+self.url,
r = requests.request(self.method, Interface.protocol+Interface.host+self.url,
params=self.params, files=files, headers=self.headers)
else:
r = requests.post(Interface.protocol+Interface.host+self.url,
r = requests.request(self.method, Interface.protocol+Interface.host+self.url,
json=self.params, headers=self.headers)
self.result = r
assert(self.result.status_code == 200)
self.log('info','Interface %s requested success!' % self.url)
self.log('info','Interface %s request and response info:' % self.url+'\n'+
'请求:'+'\n'+'*'*60+'\n'+self.method+' '+Interface.host+' '+self.url+'\n'+
Expand All @@ -123,7 +137,8 @@ def assert_response(self, k_v):
if self.result == None:
self.log('info','Request failed. Assert operation is invailed!')
return False
k_v = self.g_replace(k_v)

self.g_replace(k_v)
for k in k_v:
try:
if k == 'status_code':
Expand All @@ -133,11 +148,12 @@ def assert_response(self, k_v):
obj = self.result.headers[k.split('.')[1]]
o_obj = k_v[k]
else:

obj = self.get_json(k)
o_obj = k_v[k]
assert(str(obj) == str(o_obj))
self.log('info','Assert success! '
+k+': '+str(o_obj)+' | '+str(o_obj))
+k+': '+str(o_obj)+' | '+str(obj))
except:
#print(traceback.format_exc())
self.log('error','Assert failed! '
Expand All @@ -163,66 +179,95 @@ def get_json(self, key):
tmp = tmp[elem]
return tmp
except:
#print(traceback.format_exc())
print(traceback.format_exc())
return None


# 保存过程值
def g_push(self, key_list):
# print(self.g)
try:
for k in key_list:
if k in self.g:
if not isinstance(self.g[k], list):
self.g[k] = [self.g[k], 1]
self.g[k+'1'] = self.g[k][0]
self.g[k+str(self.g[k][1]+1)] = self.get_json(k)
self.log('info','G push values: ' + str(k)+':' + str(self.g[k+str(self.g[k][1]+1)]))
self.g[k][1] = self.g[k][1] + 1
if k+'0' not in self.g:
self.g[k+'0'] = 1
self.g[k+'1'] = self.g[k]
if isinstance(self.get_json(k), dict) or isinstance(self.get_json(k), list):
self.g[k+str(self.g[k+'0']+1)] = json.dumps(self.get_json(k))
else:
self.g[k+str(self.g[k+'0']+1)] = self.get_json(k)
self.log('info','G push values: ' + str(k)+':' + str(self.g[k+str(self.g[k+'0']+1)]))
self.g[k+'0'] = self.g[k+'0'] + 1
else:
self.g[k] = self.get_json(k)
if isinstance(self.get_json(k), dict) or isinstance(self.get_json(k), list):
self.g[k] = json.dumps(self.get_json(k))
else:
self.g[k] = self.get_json(k)
self.log('info','G push values: ' + str(k)+':'+str(self.g[k]))
# self.log('info',str(self.g))
except:
#print(traceback.format_exc())
self.log('error','G_push failed! '+ str(key_list) + str(self.g))
print(traceback.format_exc())
self.log('error','G_push failed! '+ str(key_list) + ' ' + str(self.g))


# 全局参数替换
def g_replace(self, k_v):
c_ = k_v.copy()
try:
for k in k_v:
if not isinstance(k_v[k], str):
continue
if '*g.' in k_v[k]:
#print(k, k_v[k])
tmp_v = []
for elem in k_v[k].split(','):
if '..' in elem:
tmp = self.g[elem.split('..')[0].replace('*g.', '')]
for child in elem.split('..')[1].split('.'):
if isinstance(k_v[k], list):
for i in range(len(k_v[k])):
if isinstance(k_v[k][i],dict):
self.g_replace(k_v[k][i])
elif isinstance(k_v[k], dict):
self.g_replace(k_v[k])
elif isinstance(k_v[k], str):
if '*g.' in k_v[k]:
# print(k, k_v[k], '*'*10,'\n')
tmp_v = []
for elem in k_v[k].split(','):
if '..' in elem:
tmp = self.g[elem.split('..')[0].replace('*g.', '')]
for child in elem.split('..')[1].split('.'):
try:
tmp = tmp[int(child)]
except:
print(traceback.format_exc())
tmp = tmp[child]
try:
tmp_v.append(json.loads(tmp))
except:
tmp_v.append(tmp)
else:
try:
tmp = tmp[int(child)]
tmp_v.append(json.loads(self.g[elem.replace('*g.', '')]))
except:
print(traceback.format_exc())
tmp = tmp[child]
tmp_v.append(tmp)
tmp_v.append(self.g[elem.replace('*g.', '')])
if len(tmp_v) > 1:
k_v[k] = ','.join([str(elem) for elem in tmp_v])
else:
tmp_v.append(self.g[elem.replace('*g.', '')])
#print(k, tmp_v)
k_v[k] = ','.join([str(elem) for elem in tmp_v])
#print(k_v,'\n')
return k_v
try:
k_v[k] = json.loads(tmp_v[0])
except:
k_v[k] = tmp_v[0]

except:
#print(traceback.format_exc())
return c_
self.log('error','G_replace failed! '+ str(c_) + str(k_v))
print(traceback.format_exc())
self.log('error','G_replace failed! '+ str(k_v))

# 特殊参数动态生成(主要是时间类)
@staticmethod
def dynamic_params(params):
for key in params:
#print(key)
if not isinstance(params[key], str):
continue
if isinstance(params[key], list):
for i in range(len(params[key])):
if isinstance(params[key][i],dict):
Interface.dynamic_params(params[key][i])
elif isinstance(params[key], dict):
Interface.dynamic_params(params[key])
else:
continue

if params[key] == '*now':
params[key] = int(time.time()*1000)
Expand All @@ -241,7 +286,11 @@ def dynamic_params(params):
interval = int(float(params[key].split('-')[1])*3600*1000)
params[key] = int(time.time()*1000) - interval
elif '*base64.' in params[key]:
params[key] = img_b64(os.getcwd() + '/image/'+ params[key].replace('*base64.', ''))
params[key] = img_b64(os.getcwd() + '/image/'+ params[key].replace('*base64.', ''))
elif params[key] == 'true':
params[key] = True
elif params[key] == 'false':
params[key] = False


# 登陆获取cookie,并保存到Interfa的类变量中
Expand All @@ -262,8 +311,6 @@ def interf(interface_name, project, g={}, log=True):
% (project, interface_name))
tmp = list(result.fetchall()[0])
tmp[2] = json.loads(tmp[2])
for key in tmp[2]:
tmp[2][key] = tmp[2][key]['value']
return Interface(*tmp, g=g, log=log)


Expand All @@ -274,4 +321,4 @@ def img_b64(img_path):
return base64.b64encode(f.read()).decode('utf-8')
except:
return img_path+'未找到图片'


9 changes: 5 additions & 4 deletions web/lib/scene.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding:utf-8
import sqlite3
from case import *
from interface import *
Expand Down Expand Up @@ -38,8 +39,8 @@ def get_case_data(self, case_name):
try:
s = sqlite3.connect(Interface.db_path)
tmp = []
for k,v in enumerate(case_name):
r = s.execute('select name,data,assert_data,save_data,del_data,pre_time from "case" where name="%s" and s_key=%d' % (v, self.s_key)).fetchall()[case_name[:k].count(v)]
for i,v in enumerate(case_name):
r = s.execute('select name,data,assert_data,save_data,del_data,pre_time from "case" where name="%s" and s_key=%d' % (v, self.s_key)).fetchall()[case_name[:i].count(v)]
r = list(r)
r.insert(0, self.project)
tmp.append(r)
Expand All @@ -58,7 +59,7 @@ def run(self):
result.append(c.run())
except Exception as e:
print(traceback.format_exc())
result.append((elem[1], 0, ''))
result.append((elem[1], 0, '', c.del_data))
self.status.append(result[-1][1][0] and result[-1][1][1])
return self.name, result, 1 if all(self.status) else 0

Expand Down Expand Up @@ -86,4 +87,4 @@ def modify(cls, scene_params, case_params):
set_cookie('公共-用户-用户登录', project_name)
s = Scene(scene_name, project_name)
print(s.run())


15 changes: 10 additions & 5 deletions web/lib/task.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding:utf-8
from scene import *
import sqlite3
import threading
Expand Down Expand Up @@ -37,6 +38,7 @@ def task(self):
user_passwd = self.db('select user_passwd from project where name="%s"' % (self.project))[0][0]
if user_passwd:
user_passwd = json.loads(user_passwd)

set_cookie('公共-用户-用户登录', self.project, user_passwd)

count=0
Expand Down Expand Up @@ -86,10 +88,13 @@ def single_task(self, single_scene):
# 并发执行
def mutil_pro(self):
# 环境准备
user_passwd = self.db('select user_passwd from project where name="%s"' % (self.project))[0][0]
if user_passwd:
user_passwd = json.loads(user_passwd)
set_cookie('公共-用户-用户登录', self.project, user_passwd)
try:
user_passwd = self.db('select user_passwd from project where name="%s"' % (self.project))[0][0]
if user_passwd:
user_passwd = json.loads(user_passwd)
set_cookie('公共-用户-用户登录', self.project, user_passwd)
except:
pass

# 线程池任务映射
with concurrent.futures.ThreadPoolExecutor(max_workers=50) as e:
Expand All @@ -104,4 +109,4 @@ def db(self, cmd):
s.commit()
s.close()
return r


Loading

0 comments on commit 4f3467e

Please sign in to comment.