class AllResult(object): """所有执行结果""" def __init__(self): redis.remove_redis([ 'all_module', 'case_data', 'case_failures', 'case_errors', #删除数据 'case_skipped', ]) self.timeout = MyYaml().config('timeout') self.projectName = MyYaml().config('projectName') self.EnvName = MyYaml().config('EnvName') #生产环境 self.moudleName = MyYaml().config('moudleName') # all if self.moudleName is None: self.moudleName = '' self.matching = MyYaml().config('matching') #正则 self.ip = MyYaml().config('ip') self.matching = MyYaml().config('matching') #正则表达式匹配*_st.py self.ip = MyYaml().config('ip') # ip: 192.168.8.1 self.domain = MyYaml().config('domain') #本地测试环境 self.app_config = MyYaml().interface_data #获取接口数据 if self.domain is None: self.get_url = 'http://{}/polls/get_report/'.format(self.ip) else: self.get_url = 'http://{}/polls/get_report/'.format(self.domain) self.message = MyYaml().config('message') def moudle_name(): """ 获取可运行模块 :return: moudle list """ moudleName = MyYaml().config('moudleName') project_names = os.path.join(path, '{}'.format(self.projectName)) dir_list = os.listdir( project_names ) #os.listdir(project_names):列出paoject_names下的目录和文件 moudle_list = [] #一级目录, XY all_import_class = [] #所有要导入的测试类 all_moudle = [] #所有的类名 if moudleName is None: #运行所有模块 for i in dir_list: if '.' not in i and '__' not in i: if os.path.exists( project_names + '/{}/__init__.py'.format(i)): #判断路径是否存在 moudle_list.append(i) else: if os.path.exists( project_names + '/{}/__init__.py'.format(moudleName)): #运行指定模块 moudle_list.append(moudleName) for a in moudle_list: #模块 dir_name = project_names + '\\' + a dir_list = os.listdir( dir_name) #os.listdir()用于返回指定文件夹中包含的文件或文件夹列表 for b in dir_list: if self.matching.split('_')[1] in b: #筛选出测试用例 import_name = '{}_{}'.format(b.split('_')[0], a) #类名 all_import_class.append('from.{}.{} import {}'.format( a, b.split('.')[0], import_name)) #所有要导入的测试类 all_import_class.append('\n') all_moudle.append(import_name) init_file_py = project_names + '/__init__.py' if os.path.exists( init_file_py ): #os.path.exists(init_file_py):判断是否存在文件或目录init_file_py os.remove(init_file_py) #os.remove(file):删除一个文件 all_moudle = str(all_moudle) #类名 import re all_moudle = re.sub("'", '', all_moudle) #sub():替换 with open(init_file_py, 'w') as f: #测试类写入__init__.py文件 f.writelines(all_import_class) f.write('moudle_list = {}'.format(all_moudle)) f.write('\n') f.close() return all_moudle, moudle_list #all_moudle=所有类名(模块),moudle_list=ZY包下的所有包 self.all_moudle, self.moudle_list = moudle_name() #调用并赋值 def run_class(self): from Case import moudle_list redis.all_module(moudle_list) #存进redis #创建新线程 count = 0 numbers = 0 if len(redis.read_moudle('all_module')) != 0: #计算长度,len长度,所有的测试用例多少个 while True: #循环 log.info('共计{}个测试类'.format(len( redis.read_moudle('all_module')))) if len(redis.read_moudle('all_module')) != 0: threads = [] log.info('添加线程') try: moudle = redis.rpop('all_module', MyYaml().config('thread_count')) moudle_per = ReadYaml().return_module( moudle_list, moudle) for i in moudle_per: threads.append( myThread(count, "Thread-{}".format(count), i, 0)) #一次性开启的线程数量 count += 1 except Exception: pass #开启新线程 for i in threads: try: i.start() #start开启线程 except Exception: pass #等待所有线程完成 for t in threads: try: t.join() #等待线程、子线程完毕后关闭主线程 except Exception: pass log.info('主进程{}结束'.format(numbers)) numbers += 1 #主进程 else: log.info('所有主进程结束!') break else: log.info('测试集为空') def results_collected(self): """ 结果收集 :return: """ all_cases = [] all_times = [] timeout_cases = [] right_cases = [] fail_cases = [] fail_error_cases = [] right_fail_cases = [] error_cases = [] skip_cases = [] case_infos_list = redis.rpop( 'case_data') #移除返回右边最后一个元素,lpop删除返回左边列表第一个,(测试用例数据) case_errors_list = redis.rpop('case_errors') case_failures_list = redis.rpop('case_failures') case_skipped_list = redis.rpop('case_skipped') all_test_fun = ReadYaml().case_info_data(self.all_moudle) for case_ins in all_test_fun: case_info = { 'case_name': case_ins[1]['case_name'], 'mode': case_ins[1]['mode'], 'api_url': case_ins[1]['url'], 'time': 0, 'statues': '', 'info': '' } for e in case_failures_list: e = list(eval(e)) #列表转换 , eval if case_ins[0] == e[0]: case_info['statues'] = 'fail' break for f in case_errors_list: f = list(eval(f)) if case_ins[0] == f[0]: case_info['statues'] = 'error' case_info['info'] = f[1] break for h in case_skipped_list: if case_ins[0] == h[0]: case_info['statues'] = 'skip' case_info['info'] = h[1] # 'No Response' break if case_info['statues'] == '': case_info['statues'] = 'pass' for i in case_infos_list: i = list(eval(i)) if i[0] == case_ins[0]: if case_info['statues'] == 'pass': case_info['info'] = i[1] try: json_data = float(json.loads(i[1])['time_count']) except Exception: json_data = 0 case_info['time'] = float('%.2f' % json_data) all_times.append(json_data) elif case_info['statues'] == 'fail': case_info['info'] = i[1] try: json_data = float(json.loads(i[1])['time_count']) except Exception: json_data = 0 case_info['time'] = float('%.2f' % json_data) all_times.append(json_data) else: break case_infos = [ self.projectName, case_ins[0], case_info['case_name'], case_info['api_url'], case_info['mode'], case_info['time'], # 11-23 case_info['statues'], '详细', case_info['info'], ] all_cases.append(case_infos) for g in all_cases: if g[-3] == 'pass': right_cases.append(g) right_fail_cases.append(g) elif g[-3] == 'fail': fail_cases.append(g) fail_error_cases.append(g) right_fail_cases.append(g) elif g[-3] == 'error': error_cases.append(g) fail_error_cases.append(g) else: skip_cases.append(g) for timeout in right_fail_cases: if timeout[-4] > self.timeout: timeout_cases.append(timeout) dmps = MyYaml().baseData('report_cases') dmps['all_cases'] = all_cases dmps['right_cases'] = right_cases dmps['fail_cases'] = fail_cases dmps['error_cases'] = error_cases dmps['untreaded_cases'] = skip_cases fail_error_cases.sort(key=lambda x: (x[5]), reverse=True) dmps['fail_error_cases'] = fail_error_cases timeout_cases.sort(key=lambda x: (x[5]), reverse=True) dmps['timeout_cases'] = timeout_cases return dmps, all_times def run_all_case(self): now_time = time.strftime( '%Y-%m-%d %H:%M:%S') #获取时间并转换为易读格式time.strftime log.debug('now_time:{}'.format(now_time)) startTime = time.time() self.run_class() # 运行所有模块 stopTime = time.time() timeTaken = '%d秒' % (stopTime - startTime) end_time = time.strftime('%Y-%m-%d %H:%M:%S') dmps, all_times = self.results_collected() # 收集结果 try: max_times = '%.2f' % max(all_times) except Exception as msg: max_times = '0' log.debug(msg) try: aver_time = '%.2f' % (sum(all_times) / len(all_times)) except Exception as msg: aver_time = '0' log.debug(msg) try: min_time = '%.2f' % min(all_times) except Exception as msg: min_time = '0' log.debug(msg) test_info = [ now_time, end_time, timeTaken, max_times, aver_time, min_time, ] dmps['test_info'] = test_info dmps['env_sign'] = self.EnvName
class AllResult(object): """所有执行结果""" def __init__(self): redis.remove_redis([ #新一轮测试前删除redis缓存数据 'all_module', 'case_data', 'case_failures', 'case_errors', #删除数据 'case_skipped', ]) self.timeout = MyYaml().config('timeout') self.projectName = MyYaml().config('projectName') self.EnvName = MyYaml().config('EnvName') #测试环境 self.moudleName = MyYaml().config('moudleName') # all if self.moudleName is None: self.moudleName = '' self.matching = MyYaml().config('matching') #正则 # self.ip = MyYaml().config('ip') # self.domain = MyYaml().config('domain') #本地测试环境 # self.app_config = MyYaml().interface_data # if self.domain is None: # self.get_url = 'http://{}/polls/get_report/'.format(self.ip) # else: # self.get_url = 'http://{}/polls/get_report/'.format(self.domain) # self.message = MyYaml().config('message') def moudle_name(): """ 获取可运行模块 :return: moudle list """ moudleName = MyYaml().config('moudleName') project_names = os.path.join(path, '{}'.format(self.projectName)) dir_list = os.listdir(project_names) #os.listdir(project_names):列出paoject_names下的目录和文件 moudle_list = [] #一级目录 all_import_class = [] #所有要导入的测试类 all_moudle = [] if moudleName is None: for i in dir_list: if '.' not in i and '__' not in i: if os.path.exists(project_names + '/{}/__init__.py'.format(i)): moudle_list.append(i) else: if os.path.exists(project_names + '/{}/__init__.py'.format(moudleName)): moudle_list.append(moudleName) for a in moudle_list: dir_name = project_names + '\\' + a dir_list = os.listdir(dir_name) for b in dir_list: if self.matching.split('_')[1] in b: import_name = '{}_{}'.format(b.split('_')[0], a) all_import_class.append('from.{}.{} import {}'.format(a, b.split('.')[0], import_name)) all_import_class.append('\n') all_moudle.append(import_name) init_file_py = project_names + '/__init__.py' if os.path.exists(init_file_py): #os.path.exists(init_file_py):判断是否存在文件或目录init_file_py os.remove(init_file_py) #os.remove(file):删除一个文件 all_moudle = str(all_moudle) import re all_moudle = re.sub("'", '', all_moudle) #sub():替换 with open(init_file_py, 'w') as f: f.writelines(all_import_class) f.write('moudle_list = {}'.format(all_moudle)) f.write('\n') f.close() return all_moudle, moudle_list #all_moudle=所有类名(模块),moudle_list=case包下的所有包 self.all_moudle, self.moudle_list = moudle_name() def run_class(self): from case import moudle_list redis.all_module(moudle_list) #存进redis #创建新线程 count = 0 numbers = 0 if len(redis.read_moudle('all_module')) != 0: #计算长度,len长度 while True: #循环 log.info('共计{}个测试类'.format(len(redis.read_moudle('all_module')))) if len(redis.read_moudle('all_module')) != 0: threads = [] log.info('添加线程') try: moudle = redis.rpop('all_module', MyYaml().config('thread_count')) moudle_per = ReadYaml().return_module(moudle_list, moudle) for i in moudle_per: threads.append(myThread(count, "Thread-{}".format(count), i, 0)) count += 1 except Exception: pass #开启新线程 for i in threads: try: i.start() #start开启线程 except Exception: pass #等待所有线程完成 for t in threads: try: t.join() #等待线程、子线程完毕后关闭主线程 except Exception: pass log.info('主进行{}结束'.format(numbers)) numbers += 1 else: log.info('所有主进程结束!') break else: log.info('测试集为空') def run_all_case(self): now_time = time.strftime('%Y-%m-%d %H:%M:%S') log.debug('now_time:{}'.format(now_time)) self.run_class() # 运行所有模块