You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

378 lines
14 KiB
Python

2 years ago
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
import procedure_file
"""
import xlrd,json,re
from utils import core
from collections import Counter
import shutil
import os
import xlrd
from utils.ClientModels import Procedure, Usecase, Phrase
import openpyxl
import re
Formula_Regular = r'^([\w]+)=([\+\-]?[\d]+([\.][\d]*)?([Ee][+-]?[\d]+)?)'
zhmodel = re.compile(u'[\u4e00-\u9fa5]')
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:
print(str(e))
def parse_procedure(pstr, wordPath):
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 = []
procedure.path = pstr
procedure.wordPath = wordPath
usecase_save = parse_usecase(excel, procedure)
procedure.usecase = json.dumps(procedure.usecase)
procedure.type = excel.row_values(0)[5]
if not procedure.name:
procedure.name = os.path.basename(pstr)
procedure.save_obj()
return procedure.name
def parse_usecase(excel, procedure):
usercase_pass = True
for rownum in range(1, excel.nrows):
row = excel.row_values(rownum)
if row[0] == "测试用例":
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))
# print(json.loads(usecase.operation))
if not usecase.name:
usecase.name = usecase.number
usecase.save_obj()
return usercase_pass
def parse_operation(excel, rownum):
oper = []
k = 0
subrownum = rownum + 3
total_lines = excel.nrows
while subrownum < excel.nrows:
# print(subrownum)
subrow = excel.row_values(subrownum)
# print(subrow)
# print(type(subrow[1]), subrow[1])
# print(subrow[1])
if subrow[0] == "测试用例":
break
try:
# int(subrow[0])
float(subrow[0])
except Exception as e:
# print(e)
# print(subrow, 11111111111111111111111)
oper.append([[subrow[0],subrow[1]]])
j = 1
k += 1
subrownum += 1
# print(1, subrownum)
continue
if "等待" in subrow[1]:
print(subrow[1])
write_formula = parse_write(subrow[1])
oper[k - 1].append(["wait", {"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 "设置" in subrow[1] and re.compile('[a-zA-Z]').search(subrow[1]):
# print('okkk')
write_formula = parse_write(subrow[1])
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
# print(2, subrownum)
elif "收到" in subrow[1] and re.compile('[a-zA-Z]').search(subrow[1]):
# print('okkk')
write_formula = parse_write(subrow[1])
oper[k - 1].append(["wait", {"sort": str(int(subrow[0])), "name": subrow[1], "remark": subrow[8],
# "startdelay": parse_startdelay(subrow[1]),
# "delay": re.findall('\d+',subrow[1])[0],
"location": subrow[2], "formula": write_formula}])
j = j + 1
subrownum += 1
elif "接收" in subrow[1]:
# print('okkk')
write_formula = parse_write(subrow[1])
oper[k - 1].append(["wait", {"sort": str(int(subrow[0])), "name": subrow[1], "remark": subrow[8],
# "startdelay": parse_startdelay(subrow[1]),
# "delay": re.findall('\d+',subrow[1])[0],
"location": subrow[2], "formula": write_formula}])
j = j + 1
subrownum += 1
# print(3, subrownum)
elif "检查" in subrow[1] and re.compile('[a-zA-Z]').search(subrow[1]):
first_read = True
while subrownum < excel.nrows:
rsubrow = excel.row_values(subrownum)
if '检查' not in rsubrow[1]:
break
if first_read:
read_formula = parse_read(rsubrow[3])
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}
])
elif not first_read:
read_formula = parse_read(rsubrow[3])
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 "初始化" 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
# elif not zhmodel.search(subrow[1]):
# # print(subrow[1],'111')
# 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
else:
# print(subrow)
# # continue
# # oper[k - 1].append(["INIT", {"sort": str(int(subrow[0])), "name": subrow[1], "remark": subrow[8],
# # "location": subrow[2], "except": subrow[3]}])
# write_formula = parse_write(subrow[1])
# 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
print(4, subrownum)
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")
# print(assert_line)
if len(assert_line) > 0 and '' not in assert_line:
formula = []
formula.append(re.match('^\\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])
else:
return False
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 check_excel_line(excel):
excel_error = []
if (excel.row_values(0)[0] != '规程名称') or (excel.row_values(0)[2] != '规程编号'):
excel_error.append("不是规程文件")
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('表格第' + str(i + 1) + "行,规程可能有空行")
if type(excel.row_values(i)[0]) is int:
if "检查" in excel.row_values(i)[1]:
if not parse_read(excel.row_values(i)[3]):
excel_error.append('表格第' + str(i + 1) + "行,公式错误")
elif "设置" in excel.row_values(i)[1]:
if not parse_write(excel.row_values(i)[1]):
excel_error.append('表格第' + str(i + 1) + "行,公式错误")
elif "初始化" in excel.row_values(i)[1]:
pass
else:
excel_error.append('表格第' + str(i + 1) + "行,无法解析该语义")
return excel_error
class DCSLogType(object):
DEFAULT = 'default'
INFO = 'info'
WARNING = 'warning'
ERROR = 'error'
RIGHT = 'right'
@classmethod
def types(cls):
return [
cls.DEFAULT, cls.INFO, cls.WARNING, cls.ERROR, cls.RIGHT
]
def judgeCN(con):
# 判断字符串是否包含中文
if re.compile(u'[\u4e00-\u9fa5]').search(con):
return True
else:
return False
def getOprType(action):
for key, value in phraseDic.items():
if key in action:
if value == 'SET' or not judgeCN(action) and '=' in action:
return value
elif value in 'CHECK' and re.sub('[\u4e00-\u9fa5]', '', action):
return value
else:
return value
def parse_GS_procedure(excelpath):
titleDic = {}
pharses = Phrase.get_all()
for phrase in pharses:
phraseDic[phrase.name] = phrase.operation
wb = openpyxl.load_workbook(excelpath)
ws = wb.active
Program = {}
info = {}
order = []
procedure = Procedure()
procedure.name = ws[1][1].value
procedure.number = ws[1][3].value
procedure.usecase = []
procedure.path = excelpath
Program['sections'] = []
info['procedureName'] = ws[1][1].value
info['procedureNumber'] = ws[1][3].value
info['usecaseName'] = ws[2][1].value
info['usecaseNumber'] = ws[1][3].value
info['IC'] = ws[2][8].value
Program['info'] = info
for index, x in enumerate(list(ws.iter_rows())[2]):
if x.value:
titleDic[x.value] = index
titleDic['操作位置'] = titleDic['试验步骤'] + 1
for i, row in enumerate(list(ws.iter_rows())[4:]):
if row[0].value == "测试用例":
usecase = Usecase()
usecase.name = row[1].value
usecase.number = row[3].value
procedure.usecase.append(usecase.number)
usecase.IC = row[8].value
usecase.description = row[5].value
# try:
action = str(row[titleDic['试验步骤']].value)
index = row[titleDic['序号']].value
if 'STEP' in str(index) and judgeCN(str(action)):
try:
sectionDic['oprs'] = oprs
Program['sections'].append(sectionDic)
except:
pass
sectionDic = {}
oprs = []
sectionDic['STEP'] = re.findall('\d+',index)[0]
order.append(sectionDic['STEP'])
sectionDic['name'] = action
# print(sectionDic)
continue
oprDict = {}
oprDict['type'] = getOprType(action)
if oprDict['type'] == 'SET':
oprDict['opr'] = []
for write in action.split('\n')[1:]:
oprDict['opr'].append(write.split('='))
# 存储二维数组 [[变量名,设定值]...]
elif oprDict['type'] == 'CHECK':
oprDict['opr'] = re.sub('[\u4e00-\u9fa5]', '', action)
oprDict['expectResult'] = str(row[titleDic['预期结果']].value)
# elif oprDict['type'] == 'CALL':
# oprDict['opr'] =
elif not oprDict['type']:
continue
oprDict['lineNumber'] = i
oprDict['position'] = row[titleDic['操作位置']].value
oprDict['remark'] = row[titleDic['备注']].value
oprs.append(oprDict)
# except:
# print(filePath, [x.value for x in row])
sectionDic['oprs'] = oprs
Program['sections'].append(sectionDic)
# sectionDic = {}
# oprs = []
# sectionDic['STEP'] = re.findall('\d+',index)[0]
# order.append(sectionDic['STEP'])
# sectionDic['name'] = action
Program['order'] = order