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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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