def add_job(e_id, cron_time): # 添加定时任务 seconds, minutes, hour, day, month, year = cron_time.split(' ') job_id = str(e_id) # 任务ID如果已存在,先删除 EquipmentManagementList.remove_job(e_id) job_des = { 'id': job_id, # 任务的唯一ID,不要冲突 'func': __name__ + ':EquipmentManagementList.scheduler_job', # 执行任务的function名称 'args': [e_id], # 如果function需要参数,就在这里添加 'trigger': { 'type': 'cron', 'year': year, 'month': month, 'day': day, 'hour': hour, 'minute': minutes, 'second': seconds } } try: run_test_job.add_job(func=job_des['func'], id=job_des['id'], args=job_des['args'], trigger=job_des['trigger']) current_job = run_test_job.get_job(job_des['id']) log_main.info('添加定时任务{}'.format(current_job)) return current_job.next_run_time except Exception: log_main.error(traceback.format_exc())
def scheduler_job(e_id): log_main.info('运行定时任务: job-{}'.format(e_id)) with run_test_job.app.app_context(): # 更新下次运行时间 entity = EquipmentManagement.query.filter( EquipmentManagement.id == e_id).first() job = run_test_job.get_job(str(e_id)) entity.next_run_time = job.next_run_time db.session.commit() # 执行真正的任务 StartCasSuit.run_test_task(e_id)
def remove_job(e_id): # 移除定时任务 job = run_test_job.get_job(str(e_id)) if job: log_main.info('移除定时任务:{}'.format(job)) run_test_job.remove_job(str(e_id))
def run_test_task(e_id): entity = EquipmentManagement.query.filter( EquipmentManagement.id == e_id).first() start = datetime.now() log_main.info('正在运行的任务:{}'.format(e_id)) if entity.status == 1: raise Exception('此设备已经在运行') else: entity.status = 1 et_title = entity.title tl = TestLog(equipment_id=e_id, equipment_title=et_title, equipment_args=entity.setting_args, run_test_result=2) db.session.add(tl) db.session.commit() tl_id = tl.id status = 1 error_msg = '无' tl_result = 1 failed_suit = '' success_suit = '' log_run = Log('TestLog-{}'.format(tl_id)) log_run.info('第{}次运行,运行设备{}:{}, 参数设置:{}'.format( tl_id, e_id, et_title, entity.setting_args)) try: for item in entity.test_case_suit: # 循环设备用例集 driver = StartSession.start(e_id) suit_start = datetime.now() suit_title = item.test_case_suit.title shot_title = '{}-{}'.format(et_title, suit_title) log_run.info('-用例集开始: {}-'.format(shot_title)) suit_log = TestCaseSuitLog( test_log_id=tl_id, test_case_suit_id=item.test_case_suit_id, test_case_suit_title=suit_title, run_test_result=0) db.session.add(suit_log) db.session.commit() suit_log_entity = TestCaseSuitLog.query.filter( TestCaseSuitLog.id == suit_log.id).first() try: for suit_step in item.test_case_suit.suit_step: # 循环用例集下的用例 case_start = datetime.now() case_entity = suit_step.test_case if suit_step.skip == 1: log_run.info('-----用例{}-{},跳过'.format( case_entity.id, case_entity.title)) continue else: log_run.info( '---开始:-----用例{}-{},输入参数列表: {}-----'.format( case_entity.id, case_entity.title, suit_step.input_args)) case_log_entity = TestCaseLog( test_case_id=case_entity.id, test_case_title=case_entity.title, test_case_suit_log_id=suit_log.id) db.session.add(case_log_entity) db.session.commit() test_case_result = 0 try: case_step_list = analysis_case( case_entity.step, suit_step.input_args) ba = BaseAction(driver, shot_title, log_run, tl_id) ba.action(case_step_list, case_log_entity.id) test_case_result = 1 log_run.info( '---结束-----用例{}-{},输入参数列表: {}-----成功-------'. format(case_entity.id, case_entity.title, suit_step.input_args)) except Exception as t: test_case_result = 0 log_run.error( '---结束-----用例{}-{},输入参数列表: {}-----失败!!!!!!!!!'. format(case_entity.id, case_entity.title, suit_step.input_args)) # 单个用例失败 raise t finally: case_end = datetime.now() case_use_time = (case_end - case_start).seconds case_log_entity.run_test_case_times = case_use_time case_log_entity.run_test_case_result = test_case_result db.session.commit() suit_log_entity.run_test_result = 1 success_suit += suit_title + ',' except Exception as e: suit_log_entity.run_test_result = 0 failed_suit += suit_title + ',' status = 0 tl_result = 0 finally: suit_end = datetime.now() suit_use_time = (suit_end - suit_start).seconds suit_log_entity.run_test_suit_times = suit_use_time db.session.commit() # 一个用例集循环结束,重新获取driver driver.quit() log_run.info('-用例集结束: {}, 总用时 {} 秒-'.format( shot_title, suit_use_time)) except Exception as e: status = 0 tl_result = 0 error_msg = traceback.format_exc() log_main.error(error_msg) log_run.error(error_msg) raise e finally: end = datetime.now() run_task_use_time = (end - start).seconds log_entity = TestLog.query.filter(TestLog.id == tl.id).first() log_entity.run_test_result = tl_result log_entity.run_test_times = run_task_use_time entity.status = 0 db.session.commit() msg = '此次测试执行结束,总用时:{}秒 成功用例集: [{}], 失败用例集: [{}] 错误:{}'.format( run_task_use_time, success_suit, failed_suit, error_msg) log_main.info(msg) log_run.info(msg) return jsonify({'status': status, 'data': '', 'message': msg})
def run_test_task(name): log_main.info('正在运行的任务:%s,PID:(%s)' % (name, os.getpid())) start = time.time() time.sleep(random.random() * 10) end = time.time() log_main.info('任务:%s,用时:%0.2f 秒' % (name, (end - start)))
from multiprocessing import Pool import os, time, random from appium_base.public.log import log_main def run_test_task(name): log_main.info('正在运行的任务:%s,PID:(%s)' % (name, os.getpid())) start = time.time() time.sleep(random.random() * 10) end = time.time() log_main.info('任务:%s,用时:%0.2f 秒' % (name, (end - start))) if __name__ == '__main__': log_main.info('父进程ID:%s' % (os.getpid())) p = Pool(2) for i in range(2): p.apply_async(run_test_task, args=(i, )) log_main.info('等待所有添加的进程运行完毕。。。') p.close() # 在join之前要先关闭进程池,避免添加新的进程 p.join() log_main.info('End!!,PID:%s' % os.getpid())