Python 自动化测试用例执行框架 - 基于 Excel 配置的用例管理和策略执行
'def read_xlsx_by_sheet_name(xlsxfile,sheet_name):\n\t\t\twb = xlrd.open_workbook(xlsxfile)\n\t\t\tsh = wb.sheet_by_name(sheet_name)\n\t\t\tresult_detail={}\n\t\t\tfor i in range(1,sh.nrows):\n\t\t\t\t\tresult_detail[i]=dict(zip(sh.row_values(0), sh.row_values(i)))\n\t\t\treturn result_detail\n\n\t#生成用例执行策略,执行策略转换为int\n\t\t'''\n\t\t执行策略:\n\t\t包括:\n\t\t执行总轮数:命令字 1001 。第二列对应则是测试轮数配置,所有用例执行完成一次为1轮,配置为0,说明一直循环\n\t\t执行总时间:命令字 1002 。第二列对应则是时间配置,单位 秒,配置为0,说明一直循环\n\t\t执行间隔:每轮执行之间的时间间隔,单位为 秒\n\n\t\t失败后策略:\n\t\t本轮拨测有失败用例的处理侧率\n\t\t继续全部重跑,命令字 2001\n\t\t后续只运行当前测试成功用例,命令字 2002\n\t\t拨测暂停 ,命令字2003\n\t\t'''\n\t@uni_try_func\n\tdef mk_case_policy(xlsxfile,sheet_name):\n\t\tresult = read_xlsx_by_sheet_name(xlsxfile,sheet_name)\n\t\ttmpinfo = result['result_detail']\n\t\tcase_policy_info={}\n\t\tif len(tmpinfo)>=1:\n\t\t\tcase_policy_info = tmpinfo[1]\n\t\t\tfor key in case_policy_info:\n\t\t\t\t\tcase_policy_info[key] = int(case_policy_info[key])\n\t\tatgl.st_setvalue('case_policy_info',case_policy_info)\n\t\treturn case_policy_info\n\n\t#生成用例执行套件,1 执行,0 不执行\n\tdef mk_case_suite(xlsxfile,sheet_name):\n\t\tresult = read_xlsx_by_sheet_name(xlsxfile,sheet_name)\n\t\ttmpinfo = result['result_detail']\n\t\tcase_suite_info={}\n\t\tfor numkey in tmpinfo:\n\t\t\tonecase=tmpinfo[numkey]\n\t\t\tif int(onecase['是否执行'])==1:\n\t\t\t\t\tcase_suite_info[onecase['用例名称']]={}\n\t\t\t\t\tfor key in onecase:\n\t\t\t\t\t\tif onecase[key] != '':\n\t\t\t\t\t\t\tcase_suite_info[onecase['用例名称']][key] = onecase[key]\n\t\t\t\t\t#case_suite_info[onecase['用例名称']]={'运行主函数':onecase['运行主函数'],'是否执行':int(onecase['是否执行'])}\n\t\tatgl.st_setvalue('case_suite_info',case_suite_info)\n\t\treturn case_suite_info\n\n\t#生成用例参数函数,生成 atgl.st_setvalue('case_para_info',case_para_info) 全局数据,供用例函数调用\n\t@uni_try_func\n\tdef mk_case_paras(xlsxfile,sheet_name):\n\t\tresult = read_xlsx_by_sheet_name('云桌面拨测数据_TER.xlsx', '用例参数表')\n\t\tcases_para = result['result_detail']\n\t\tcase_para_info={}\n\t\tfor numkey in cases_para:\n\t\t\tonecase=cases_para[numkey]\n\t\t\tcase_name=onecase['用例名称']\n\t\t\tpara_num=int(onecase['参数个数'])\n\t\t\tcase_para_info[case_name]={}\n\t\t\tfor i in range(1,para_num+1):\n\t\t\t\t\tcase_para_info[case_name][onecase[f'参数{i}']] = onecase[f'参数{i}配置']\n\t\tatgl.st_setvalue('case_para_info',case_para_info)\n\t\treturn case_para_info\n\t#根据测试步骤调用测试方法主函数\n\tdef auto_stflow(func,*args,**kwargs):\n\t\tautost_mylog('auto_stflow:调用方法<%s>, 参数:args <%s>,kwargs <%s>'%(func.name,str(args),str(kwargs)))\n\t\ttmpstr=func.name+'('\n\t\ttmparg=''\n\t\ttmpkwarg=''\n\t\tfor i in range(0,len(args)):\n\t\t\tif i==0:\n\t\t\t\t\ttmparg=str(args[i])\n\t\t\telse:\n\t\t\t\t\ttmparg = tmparg+','+str(args[i])\n\t\ttmpstr = tmpstr + tmparg\n\t\tfor key in kwargs:\n\t\t\tif len(tmpkwarg)==0:\n\t\t\t\t\ttmpkwarg=str(key)+'='+str(kwargs[key])\n\t\t\telse:\n\t\t\t\t\ttmpkwarg =tmpkwarg+','+ str(key) + '=' + str(kwargs[key])\n\t\ttmpstr = tmpstr + tmpkwarg+')'\n\t\tautost_mylog('auto_stflow:开始执行调用 %s '%(tmpstr))\n\t\treturn func(*args,**kwargs)\n\t#适用角色:终端;终端侧按照策略执行用例集,采用独立工作线程\n\tdef run_according_to_policy():\n\t\tautost_mylog('工作线程 run_according_to_policy 启动。。。。')\n\t\tcase_policy_info = atgl.st_getvalue('case_policy_info', {})\n\t\tcase_suite_info = atgl.st_getvalue('case_suite_info', {})\n\t\trun_policy = case_policy_info['执行策略']\n\t\trun_interval = case_policy_info['执行间隔']\n\t\tfail_policy = case_policy_info['失败后策略']\n\t\tdef one_round_cases():\n\t\t\tautost_mylog(f'one_round_cases -->case_suite_info={case_suite_info}')\n\t\t\tfor case in case_suite_info:\n\t\t\t\t\tif case_suite_info[case]['是否执行'] == 0:\n\t\t\t\t\t\tcontinue\n\t\t\t\t\tresult = auto_stflow(eval(case_suite_info[case]['运行主函数']))\n\t\t\t\t\tautost_mylog(f'用例{case},主函数 {case_suite_info[case]['运行主函数']},执行结果result= {result}')\n\t\t\t\t\tif result['result'] == False:\n\t\t\t\t\t\t# 执行测试失败后暂停测试\n\t\t\t\t\t\tif fail_policy == 2003:\n\t\t\t\t\t\t\trun_status = False\n\t\t\t\t\t\t\treturn False\n\t\t\t\t\t\t# 执行失败的用例下次不执行\n\t\t\t\t\t\telif fail_policy == 2002:\n\t\t\t\t\t\t\tcase_suite_info[case]['是否执行'] = 0\n\t\t\t\t\t\t\t#atgl.st_setvalue('case_suite_info',case_suite_info)\n\t\t\t\t\t# 用例之间间隔5秒\n\t\t\t\t\ttime.sleep(5)\n\t\t\treturn True\n\t\tif run_policy == 1002:\n\t\t\trun_time_total = case_policy_info['执行轮次(时间)']\n\t\t\tstarttime = time.perf_counter()\n\t\t\tendtime = starttime\n\t\t\twhile endtime-starttime > run_time_total:\n\t\t\t\t\trun_status = one_round_cases()\n\t\t\t\t\tif run_status == False:\n\t\t\t\t\t\tautost_mylog(f'测试用例集执行{run_rounds}轮,用例<{case}>执行失败,依据测试策略,测试暂停,退出!')\n\t\t\t\t\t\tbreak\n\t\t\t\t\tautost_mylog(f'测试用例集执行{run_rounds}轮,目前已完成{i+1}轮')\n\t\t\t\t\t#每轮用例执行之间间隔按配置执行\n\t\t\t\t\ttime.sleep(run_interval)\n\t\t\t\t\tif run_time_total != 0:\n\t\t\t\t\t\tendtime = time.perf_counter()\n\t\telse:\n\t\t\trun_rounds = case_policy_info['执行轮次(时间)']\n\t\t\tfor i in range(0,run_rounds):\n\t\t\t\t\trun_status = one_round_cases()\n\t\t\t\t\tif run_status == False:\n\t\t\t\t\t\tautost_mylog(f'测试用例集执行{run_rounds}轮,用例<{case}>执行失败,依据测试策略,测试暂停,退出!')\n\t\t\t\t\t\tbreak\n\t\t\t\t\tautost_mylog(f'测试用例集执行{run_rounds}轮,目前已完成{i+1}轮')\n\t\t\t\t\t#每轮用例执行之间间隔按配置执行\n\t\t\t\t\tif i+1 < run_rounds:\n\t\t\t\t\t\ttime.sleep(run_interval)\n\t\tautost_mylog('工作线程 run_according_to_policy 结束。。。。')\n\tif name == 'main':\n\t\t#测试角色,ter为终端模式\n\t\trobot_role = 'ter'\n\t\tfor i in range(1, len(sys.argv)):\n\t\t\tif sys.argv[i][:len('robot_role=')].lower() == 'robot_role=':\n\t\t\t\t\trobot_role = sys.argv[i][len('robot_role='):]\n\t\tif robot_role not in ['ter','vm']:\n\t\t\trobot_role = 'ter'\n\t\tif robot_role == 'ter':\n\t\t\t#step01 初始化\n\t\t\tresult = mk_case_policy('云桌面拨测数据_TER.xlsx','执行策略')\n\t\t\tcase_policy_info = atgl.st_getvalue('case_policy_info',{})\n\t\t\tautost_mylog(f'用例执行策略,case_policy_info = {case_policy_info}')\n\t\t\tif case_policy_info=={}:\n\t\t\t\t\tsys.exit(f'用例执行策略配置异常,测试结束')\n\n\t\t\tresult = mk_case_suite('云桌面拨测数据_TER.xlsx','执行用例集')\n\t\t\tcase_suite_info = atgl.st_getvalue('case_suite_info',{})\n\t\t\tautost_mylog(f'执行用例集,case_suite_info = {case_suite_info}')\n\t\t\tif case_suite_info=={}:\n\t\t\t\t\tsys.exit(f'执行用例集中无执行用例,测试结束')\n\n\t\t\tresult = mk_case_paras('云桌面拨测数据_TER.xlsx','用例参数表')\n\t\t\tcase_para_info = atgl.st_getvalue('case_para_info',{})\n\t\t\tautost_mylog(f'用例参数配置,case_para_info = {case_para_info}')\n\t\t\tif case_para_info=={}:\n\t\t\t\t\tsys.exit(f'用例参数配置异常,测试结束')\n\n\t\t\t#step02 按策略执行函数\n\t\t\trun_case_thread = threading.Thread(target=run_according_to_policy)\n\t\t\trun_case_thread.start()\n\n\t\t\twhile run_case_thread.is_alive() == True:\n\t\t\t\t\ttime.sleep(5)\n\t\telif robot_role == 'vm':\n\t\t\twhile True:\n\t\t\t\t\tatgl.st_setvalue('case_in_runing', None)\n\t\t\t\t\tatgl.st_setvalue('caselist_run_in_vm', {})\n\t\t\t\t\tatgl.st_setvalue('case_suite_info', {})\n\t\t\t\t\tatgl.st_setvalue('caselist_run_in_vm', {})\n\t\t\t\t\tatgl.st_setvalue('case_para_info', {})\n\t\t\t\t\tatgl.st_setvalue('remote_robot_msg_processor_run_flag', True)\n\t\t\t\t\tRobotModeLock = threading.Lock()\n\t\t\t\t\tatgl.st_setvalue('RobotModeLock', RobotModeLock)\n\t\t\t\t\trun_case_thread = threading.Thread(target=run_vm_case_accord_to_order)\n\t\t\t\t\trun_case_thread.start()\n\t\t\t\t\t#工作线程正常启动时 remote_robot_msg_processor_run_flag 设置为True\n\t\t\t\t\tif atgl.st_getvalue('remote_robot_msg_processor_run_flag', False) == True:\n\t\t\t\t\t\t\tremote_robot_msg_processor('', 19998,20,'vm')\n\t\t\t\t\ttime.sleep(10)\n\t\t\t\t\tif run_case_thread.is_alive() == True:\n\t\t\t\t\t\t\tstop_thread(run_case_thread)\n\t\t\t\t\tautost_mylog('异常结束工作线程和主线程,准备重新初始化')\n\t\t\t\t\ttime.sleep(20)\n\tsys.exit('测试结束')\n
原文地址: https://www.cveoy.top/t/topic/pQc2 著作权归作者所有。请勿转载和采集!