|
|
import json
|
|
|
import re
|
|
|
from datetime import datetime
|
|
|
from PyQt5.QtCore import Qt, QTimer, QAbstractTableModel, QModelIndex, QPoint, QSize
|
|
|
from PyQt5.QtGui import QFont, QBrush, QColor
|
|
|
from openpyxl import load_workbook
|
|
|
|
|
|
class ExcelParser:
|
|
|
@staticmethod
|
|
|
def parseProcedure(filePath):
|
|
|
wb = load_workbook(filename=filePath)
|
|
|
|
|
|
if '测试脚本' in wb.sheetnames:
|
|
|
sheet = wb['测试脚本']
|
|
|
else:
|
|
|
sheet = wb.active
|
|
|
|
|
|
specInfo = {
|
|
|
"规程名称": sheet['B1'].value or "",
|
|
|
"规程编号": sheet['D1'].value or "",
|
|
|
"规程类型": sheet['F1'].value or ""
|
|
|
}
|
|
|
|
|
|
testCaseInfo = {
|
|
|
"测试用例": sheet['B2'].value or "",
|
|
|
"用例编号": sheet['D2'].value or "",
|
|
|
"工况描述": sheet['H2'].value or ""
|
|
|
}
|
|
|
|
|
|
testSteps = []
|
|
|
currentStep = None
|
|
|
stepCounter = 0
|
|
|
|
|
|
for rowIdx in range(5, sheet.max_row + 1):
|
|
|
cellA = sheet[f'A{rowIdx}'].value
|
|
|
cellB = sheet[f'B{rowIdx}'].value
|
|
|
cellC = sheet[f'C{rowIdx}'].value
|
|
|
|
|
|
if cellB is None and cellA is None:
|
|
|
continue
|
|
|
|
|
|
if cellA and re.match(r'STEP\d+[::]', str(cellA)):
|
|
|
if currentStep:
|
|
|
testSteps.append(currentStep)
|
|
|
stepCounter += 1
|
|
|
|
|
|
stepName = str(cellA).replace(':', ':').strip()
|
|
|
stepDesc = str(cellB) if cellB else ""
|
|
|
|
|
|
currentStep = {
|
|
|
"步骤ID": stepName,
|
|
|
"步骤描述": stepDesc,
|
|
|
"操作类型": cellC if cellC else "",
|
|
|
"预期结果": sheet[f'D{rowIdx}'].value,
|
|
|
"子步骤": []
|
|
|
}
|
|
|
elif currentStep and cellA and str(cellA).isdigit():
|
|
|
subStep = {
|
|
|
"序号": int(cellA),
|
|
|
"操作": str(cellB) if cellB else "",
|
|
|
"操作类型": cellC if cellC else "",
|
|
|
"预期结果": sheet[f'D{rowIdx}'].value,
|
|
|
"实际结果": sheet[f'E{rowIdx}'].value,
|
|
|
"一致性": sheet[f'F{rowIdx}'].value if sheet[f'F{rowIdx}'].value == "是" else "否",
|
|
|
"测试时间": sheet[f'H{rowIdx}'].value,
|
|
|
"备注": sheet[f'I{rowIdx}'].value
|
|
|
}
|
|
|
currentStep["子步骤"].append(subStep)
|
|
|
|
|
|
if currentStep:
|
|
|
testSteps.append(currentStep)
|
|
|
|
|
|
return {
|
|
|
"文件路径": filePath,
|
|
|
"规程信息": {
|
|
|
"规程名称": specInfo["规程名称"],
|
|
|
"规程编号": specInfo["规程编号"],
|
|
|
"规程类型": specInfo["规程类型"]
|
|
|
},
|
|
|
"测试用例信息": {
|
|
|
"测试用例": testCaseInfo["测试用例"],
|
|
|
"用例编号": testCaseInfo["用例编号"],
|
|
|
"工况描述": testCaseInfo["工况描述"]
|
|
|
},
|
|
|
"测试步骤": testSteps
|
|
|
}
|
|
|
|
|
|
|