# -*- coding: UTF-8 -*- """ parse procedure_file """ import os,xlrd,json,types,re from test.log_info import DCSLog, DCSLogType from utils import core from collections import Counter # Formula_Regular = r'^([\w]+)=([-+]?[0-9]+\.[0-9]+[eE][-+]?[0-9]+)|^([\w]+)=([-+]?[0-9]+\.[0-9]+)|^([\w]+)=([-+]?[0-9]+)' Formula_Regular = r'^([\w]+)=([\+\-]?[\d]+([\.][\d]*)?([Ee][+-]?[\d]+)?)' def list_procedure(): rootdir = ur"E:\pycharmWork\zhong\procedure_file" list_p = [] for parent, dirnames, filenames in os.walk(rootdir): for filename in filenames: # 输出文件信息 list_p.append(os.path.join(parent, filename)) return list_p def select_p(): list_p = list_procedure() if os.path.exists(list_p[0]): parse_procedure(list_p[0]) else: print "解析的规程不存在" def open_excel(pstr): try: procedure = xlrd.open_workbook(pstr) return procedure except Exception, e: print str(e) from models import Procedure, Usecase def parse_procedure(pstr): global all_formula_val # 全局变量用来保存规程的变量名 all_formula_val = [] data = open_excel(pstr) excel = data.sheets()[0] procedure = Procedure() procedure.name = excel.row_values(0)[1] procedure.number = excel.row_values(0)[3] procedure.usecase = [] check_excel = check_excel_line(excel) if check_excel: for check_log in check_excel: dcs_log_info(check_log, DCSLogType.ERROR) else: dcs_log_info(u'正在导入规程:' + procedure.name + u'规程编号为:' + procedure.number, DCSLogType.DEFAULT) usecase_save = parse_usecase(excel, procedure) procedure.usecase = json.dumps(procedure.usecase) if usecase_save: procedure.save_obj() dcs_log_info(u'规程导入成功', DCSLogType.RIGHT) core.Client.StatusBar.clear() def parse_usecase(excel, procedure): usercase_pass = True for rownum in range(1, excel.nrows): row = excel.row_values(rownum) if row[0] == u"测试用例": usecase = Usecase() usecase.name = row[1] usecase.number = row[3] procedure.usecase.append(usecase.number) usecase.IC = row[8] usecase.description = row[5] usecase.operation = json.dumps(parse_operation(excel, rownum)) # TODO 检查 all_formula_val 变量是否存在于点表 if usecase.operation != "false": usecase.save_obj() else: usercase_pass = False return usercase_pass def parse_operation(excel, rownum): oper = [] k = 0 subrownum = rownum + 3 total_lines = excel.nrows while subrownum < excel.nrows: subrow = excel.row_values(subrownum) if subrow[0] == ur"测试用例": break elif type(subrow[0]) != types.FloatType: oper.append([subrow[0]]) subrownum += 1 j = 1 k += 1 elif ur"设置" in subrow[1]: write_formula = parse_write(subrow[1]) if not write_formula: dcs_log_info(u'规程第' + str(subrownum + 1) + u'行公式解析错误\n' + subrow[1], DCSLogType.ERROR) return False oper[k - 1].append(["WRITE", {"sort": str(int(subrow[0])), "name": subrow[1], "remark": subrow[8], "startdelay": parse_startdelay(subrow[1]), "delay": parse_delay(subrow[1]), "location": subrow[2], "formula": write_formula}]) j = j + 1 subrownum += 1 elif ur"检查" in subrow[1]: first_read = True while subrownum < excel.nrows: rsubrow = excel.row_values(subrownum) if ur'检查' not in rsubrow[1]: break if first_read: read_formula = parse_read(rsubrow[3]) if not read_formula: dcs_log_info(u'规程第' + str(subrownum + 1) + u'行公式解析错误\n' + rsubrow[1] + u"\n预期:" + rsubrow[3], DCSLogType.ERROR) return False oper[k - 1].append( ["READ", {"sort": str(int(rsubrow[0])), "name": rsubrow[1], "remark": rsubrow[8], "delay": parse_delay(rsubrow[1]), "except": rsubrow[3], "location": rsubrow[2], "formula": read_formula} ]) first_read = False elif not first_read: read_formula = parse_read(rsubrow[3]) if not read_formula: dcs_log_info(u'规程第' + str(subrownum + 1) + u'行公式解析错误\n' + rsubrow[1] + u"\n预期:" + rsubrow[3], DCSLogType.ERROR) return False oper[k - 1][j].append({"sort": str(int(rsubrow[0])), "name": rsubrow[1], "remark": rsubrow[8], "delay": parse_delay(rsubrow[1]), "except": rsubrow[3], "location": rsubrow[2], "formula": read_formula}) subrownum += 1 j = j + 1 elif ur"初始化" in subrow[1]: oper[k - 1].append(["INIT", {"sort": str(int(subrow[0])), "name": subrow[1], "remark": subrow[8], "location": subrow[2], "except": subrow[3]} ]) j = j + 1 subrownum += 1 else: # 以上几种都不存在的时候返回False dcs_log_info(u'规程第' + str(subrownum + 1) + u'暂不支持该操作', DCSLogType.ERROR) return False complete_progress = 100 * float(subrownum) / float(total_lines) if total_lines else 0 # dcs_log_info(complete_progress, DCSLogType.DEFAULT) core.Client.StatusBar.updateProcess(int(complete_progress)) return oper # 解析设置值的公式,匹配顺序是科学计数法-》小数-》整数 def parse_write(name): formula = [] for subline in name.replace(" ", "").split("\n"): if subline != "" and "DELAY" not in subline: match_result = re.match(Formula_Regular, subline) if match_result: formula.append(match_result.group()) # 保存全部的变量名 供后续检查变量是否存在 all_formula_val.append(match_result.group().split("=")[0]) # 如果设置公式匹配数为0 ,返回fasle if len(formula) == 0: return False return ",".join(formula) # 解析检查值的公式,匹配顺序是科学计数发 -》小数-》整数 def parse_read(name): assert_line = name.split("\n") formula = [] if len(assert_line) > 0: formula.append(re.match(r'^\w+', assert_line[0]).group()) for i in range(1, len(assert_line)): match_result = re.match(Formula_Regular, assert_line[i]) if match_result: formula.append(match_result.group()) # 保存全部的变量名 供后续检查变量是否存在 all_formula_val.append(match_result.group().split("=")[0]) if len(formula) < 2: # 预期结果的公式匹配错误 return False else: return ",".join(formula) # 解析公式中的delaytime,比如DELAY4=4s 则返回 "DELAY4,4" def parse_delay(name): line = name.split("\n") delay_time = "" for subline in line: if "DELAY" in subline: if re.match(r'^(DELAY\d+)', subline): delay_time = ["START" + subline.split("=")[0], re.match(r'\d+', subline.split("=")[1]).group()] return ",".join(delay_time) # 解析公式中的startdelay,比如是STARTDELAY4=0 ,则返回STARTDELAY4 def parse_startdelay(name): line = name.split("\n") startdelay = "" for subline in line: if "STARTDELAY" in subline: startdelay = subline.split("=")[0].replace(" ", "") return startdelay def dcs_log_info(infomation, dcs_log_type): log = DCSLog(infomation, dcs_log_type) core.Client.Project.AddLog(log) def check_excel_line(excel): excel_error = [] if (excel.row_values(0)[0] != u'规程名称') or (excel.row_values(0)[2] != u'规程编号'): excel_error.append(u"不是规程文件") return excel_error for i in range(0, excel.nrows): if (not excel.row_values(i)[0]) and (not excel.row_values(i)[1]): excel_error.append(u'表格第' + str(i + 1) + u"行,规程可能有空行") if type(excel.row_values(i)[0]) == types.FloatType: if ur"检查" in excel.row_values(i)[1]: if not parse_read(excel.row_values(i)[3]): excel_error.append(u'表格第' + str(i + 1) + u"行,公式错误") elif ur"设置" in excel.row_values(i)[1]: if not parse_write(excel.row_values(i)[1]): excel_error.append(u'表格第' + str(i + 1) + u"行,公式错误") elif ur"初始化" in excel.row_values(i)[1]: pass else: excel_error.append(u'表格第' + str(i + 1) + u"行,无法解析该语义") # col_num = [int(i) for i in excel.col_values(0)[5:] if type(i)==float] # for k,v in Counter(col_num).iteritems(): # if v >1: # excel_error.append(u'表格第' + str(k+5) + u'行,操作编号有重复') return excel_error