def get_options(task_id): # 获取pytest运行参数、记录报告入库、报告复制到templates用于报告访问 # 报告参数声明 sp = ScriptPara(task_id) project_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) report_file = 'report_task%s.html' % task_id # 报告名称 report = os.path.join(project_path, 'report', report_file) # 报告路径 # 记录入库 import time report_json = { "report_name": report_file, "task_id": str(task_id), "create_date": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "file_path": report } from api.controller import report_new_record # 当存在task_id相同记录,则更新;否则插入记录 report_new_record(task_id, report_json) # pytest运行参数(含默认指定html报告参数) if sp.data_type() == 'json': folder = 'json_script' else: folder = 'protobuf_script' test_dir = os.path.join(project_path, 'script', folder) options = [ '--html=%s' % report, '--self-contained-html', '--rootdir=%s' % test_dir ] # 生成报告位置,脚本的存放目录 # 将报告html复制到templates return options + sp.pytest_option # 附加配置的参数
def start(task_id): script_para = ScriptPara(task_id) # 脚本参数 script_name = 'case_' + script_para.case_id[0] + '.py' # 脚本名称 script_file = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'proto_script', script_name) # 脚本文件 locust_option = script_para.locust_option() # 运行参数 ls_command = ["locust", "-f"] ls_command.append(script_file) ls_command += locust_option.split() # 因为这边得到字符串,如"--host=127.0.0.1 --web-host=192.168.1.56 --web-port=8188",为subprocess的列表取值方式用split进行切割 lo_process = subprocess.Popen(ls_command, stdout=subprocess.PIPE) print(lo_process.stdout.readlines())
def pytest_option(task_id): """ pytest的运行参数 """ from script.run_parameters import ScriptPara sp = ScriptPara(task_id) if sp.data_type() == 'json': folder = 'json_script' else: folder = 'protobuf_script' test_dir = os.path.join(project_path, 'script', folder) report = os.path.join(project_path, 'report', 'report_task%s.html' % task_id) options = ['--html=%s' % report, '--self-contained-html', '--rootdir=%s' % test_dir] # 默认参数:html报告生成、指明脚本运行目录 return options + sp.pytest_option
def data_type(self): # 判断body的数据类型 content_type = ScriptPara( self.task_id).para[0]['header']['content-type'] if 'octet-stream' in content_type: return 'protobuf' else: return 'json'
def __init__(self, task_id): self.task_id = task_id self.data_type = self.data_type() self.sp = ScriptPara(task_id) self.classname = 'case_' + self.sp.case_id[0] # 脚本的类名 self.funcname = [i['url'].split('/')[-1].lower() for i in self.sp.para] # script 函数名 self.weight = [int(i['weight']) for i in self.sp.weight] # 执行权重 self.method = [i['method'].upper() for i in self.sp.para] # http方法 self.url = [i + j['url'] for i, j in zip(self.sp.host, self.sp.para)] # api的请求地址 self.token = self.sp.token # 获取token for i in self.sp.para: # 根据是否需要token,将token加入headers if i['has_token']: i['header']['Authorization'] = self.token self.headers = [i['header'] for i in self.sp.para] # 请求头信息 self.body = [i['body'] for i in self.sp.para] # 请求主体 self.title = [i['api_name']for i in self.sp.para] # api测试名称 self.values = [i['values'] for i in self.sp.para] # 当http为get方法时的值 self.min = self.sp.min_wait # locust等待最小值 self.max = self.sp.max_wait # locust等待最大值 self.project_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) # 工程根目录
def __init__(self, task_id): """定义脚本生成需要用到的参数""" self.task_id = task_id self.script_para = ScriptPara(task_id) # 脚本参数源 self.api_url = [ i + j['url'] for i, j in zip(self.script_para.host, self.script_para.para) ] self.api_method = [i['method'].upper() for i in self.script_para.para] self.api_token = self.script_para.token for i in self.script_para.para: # 根据是否需要token,将token加入headers if i['has_token']: i['header']['Authorization'] = self.api_token self.api_headers = [ self.dictvalue2str(i['header']) for i in self.script_para.para ] self.api_data = [i['body'] for i in self.script_para.para] self.api_values = [i['values'] for i in self.script_para.para] # 当http为get方法时的值 self.verify_expection = [ i['expection'] for i in self.script_para.api_expection ] # 期望结果,用于检验接口正确性json格式 # if not self.verify_expection: self.script_funcname = [ 'test_' + i['url'].split('/')[-1].lower() for i in self.script_para.para ] # script 函数名 self.script_funcname = list( self.rename_duplicates(self.script_funcname)) self.script_file = [ 'test_case_' + case_id for case_id in self.script_para.case_id ] # 根据case_id命名脚本名字 self.project_path = os.path.dirname( os.path.abspath(os.path.dirname(__file__))) # 工程根目录 self.generate_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) self.options = self.script_para.pytest_option # pytest运行参数
def __init__(self, task_id): # 声明生成脚本需要的数据 self.task_id = task_id self.data_type = self.data_type() self.sp = ScriptPara(task_id) self.script_classname = 'case_' + self.sp.case_id[0] # 脚本的类名 self.script_funcname = [ i['url'].split('/')[-1].lower() for i in self.sp.para ] # script 函数名 self.script_funcname = list( self.rename_duplicates(self.script_funcname)) self.api_method = [i['method'].upper() for i in self.sp.para] # http方法 self.api_url = [ i + j['url'] for i, j in zip(self.sp.host, self.sp.para) ] # api的请求地址 self.api_token = self.sp.token # 获取token for i in self.sp.para: # 根据是否需要token,将token加入headers if i['has_token']: i['header']['Authorization'] = self.api_token self.api_headers = [ self.dictvalue2str(i['header']) for i in self.sp.para ] # 请求头信息 self.api_body = [i['body'] for i in self.sp.para] # 请求主体 self.api_values = [i['values'] for i in self.sp.para] # 当http为get方法时的值 self.locust_title = [i['api_name'] for i in self.sp.para] # api测试名称 self.locust_min = self.sp.min_wait # locust等待最小值 self.locust_max = self.sp.max_wait # locust等待最大值 self.locust_weight = [int(i['weight']) for i in self.sp.weight] # 执行权重 self.proto_path = os.path.join( os.path.abspath(os.path.dirname(__file__)), 'proto_script') self.json_path = os.path.join( os.path.abspath(os.path.dirname(__file__)), 'json_script') self.project_path = os.path.dirname( os.path.abspath(os.path.dirname(__file__))) # 工程根目录