需求背景
上个月推行了这个东西进击的开发自测,其中有一点是前置提供开发自测,提供的是xmind格式的文档,作为测试记录,现在提供xmind转为自测用例的脚本,格式如下:
模块 | 用例名称 | 执行步骤 | 预期结果 | 验证人 | 自测结果 | 测试验证结果 | 优先级 |
---|
使用
python3 xmind2devcase [目录] #解析给定的单个目录xmind文件
python3 xmind2devcase #解析当前目录下所有xmind文件
xmind的格式
iShot2020-07-0620.27.06.png
iShot2020-07-0620.27.57.png
- 用例名称前嵌入优先级1,2,3分别代表高中低级别
- 用例嵌入备注填入开发自测人,比较简单不做过多解释了
脚本
xmind:这个开源库其实就是XMind SDK for python项目(https://github.com/xmindltd/xmind-sdk-python.git)的封装,xlwt这个是写excel的第三方库。
思路很简单,直接解析,创建xls文件,所以直接上脚本
import xmind,xlwt,os,sys
'''
转换xmind文件到excel文档,作为开发自测用例
1.统一的xmind格式编写
目录,测试用例,执行步骤,预期结果
测试用例解析为一行,执行步骤可以多条,解析成一行
备注->填写指定验证人
优先级 ->指定1、2、3优先级
2.定义提取的自测用例
依赖:xmind、xlwt模块
3.使用:
python3 xmind2devcase [目录] #解析给定的单个目录xmind文件
python3 xmind2devcase #解析当前目录下所有xmind文件
'''
global parseAll
parseAll = True
def loadMind(path:str) -> dict:
workbook = xmind.load(path)
ret = workbook.getPrimarySheet().getData().get("topic")
return ret
def generExcel(xl_name:str,mind_dic:dict) -> None:
wb = xlwt.Workbook()
ws = wb.add_sheet("自测用例") #type: xlwt.Worksheet
style_title = xlwt.easyxf('font: bold on;align: wrap on, vert centre, horiz center')
style_title_content = xlwt.easyxf('align: wrap on, vert centre')
style_title_content2 = xlwt.easyxf('align: wrap on, vert centre,horiz center')
ws.write(0,0,"模块",style=style_title)
ws.write(0, 1, "用例名称",style=style_title)
ws.write(0, 2, "执行步骤",style=style_title)
ws.write(0, 3, "预期结果",style=style_title)
ws.write(0, 4, "验证人",style=style_title)
ws.write(0, 5, "自测结果",style=style_title)
ws.write(0, 6, "测试验证结果", style=style_title)
ws.write(0,7,"优先级",style=style_title)
ws.col(0).width = 256 * 20
ws.col(1).width = 256 * 20
ws.col(2).width = 256 * 40
ws.col(3).width = 256 * 40
ws.col(4).width = 256 * 20
ws.col(5).width = 256 * 20
ws.col(6).width = 256 * 20
ws.col(7).width = 256 * 20
row = 1
#解析开始
dirs = mind_dic.get("topics")
for dir in dirs:
dir_title = dir.get("title") #目录名字
try:
ws.write(row,0,dir_title,style_title_content2)
except:
ws.write(row+1, 0, dir_title, style_title_content2)
row += 1
cases = dir.get("topics")
if not cases:
continue
for case in cases:
case_title = case.get("title") #用例名称
case_note = case.get("note") #用例执行人
case_markers = case.get("markers")
if not parseAll:
if not case_markers:
continue
case_priority = "高" if "priority-1" in case_markers else "中" if "priority-2" in case_markers else "低" #用例优先级
steps = case.get("topics")
ws.write(row,1,case_title,style_title_content)
ws.write(row,4, case_note,style_title_content2)
ws.write(row, 7, case_priority,style_title_content2)
#下面都是跟随一行
step_title_real = ""
result_title_real = ""
index = 1
if not steps:
row += 1
continue
for step in steps:
step_title = step.get("title") #步骤
step_title_real += str(index) + "." +step_title+"\n"
results = step.get("topics")
if not results:
index += 1
continue
is_first_time = True
for result in results:
result_title = result.get("title") #预期结果
if is_first_time:
result_title_real += str(index) + "." + result_title + "\n"
else:
result_title_real += " " + result_title + "\n"
is_first_time = False
index += 1
ws.write(row,2,step_title_real,style_title_content)
ws.write(row,3,result_title_real,style_title_content)
row += 1
wb.save(xl_name)
def init_args():
args = sys.argv
args_len = args.__len__()
return args,args_len
def x_main():
if args_len < 2:
# 解析当前目录
cur_dir = os.path.dirname(os.path.abspath(args[0]))
ret = os.listdir(cur_dir)
ret = list(filter(lambda x:str(x).lower().strip().endswith("xmind"),ret))
ret = list(map(lambda x:os.path.join(cur_dir,x),ret))
for i in ret:
d = loadMind(i)
generExcel(i.replace("xmind", "xls"), d)
else:
# 解析传入目录
d = loadMind(args[1])
generExcel(str(args[1]).replace("xmind","xls"),d)
if __name__ == "__main__":
global args,args_len
args,args_len = init_args()
x_main()