后续更新:
这篇文章是好几年前写的,其实写得很死,不是很好在项目使用,后续发现了个开源项目,挺好的,有兴趣可以看下: Xmind用例导入到TAPD的方案(附代码)_测试超有范的博客-CSDN博客
-------------------------
纯个人初学学习分享记录,请大佬们手下留情 ~
分解一下必要的步骤(最后附上代码):
- 确定好自己的xmind的用例格式;
- mindparser库将xmind的文件内容转成字典格式的数据;
- xlwt库写成入xls文件;
- Python自带的gui库 tkinter来写 gui界面;
- 最后用pyinstaller来打包;
1、确定好自己的xmind的用例格式
自己的公司也没有一个固定格式,纯靠测试测试一条一条的复制粘贴进Excel,受不了!!!然后网上找了这么一个模板,这个模板也可以导进禅道(虽然我们公司也没有用),那就按这个看上去比较成熟模板把。
2、xmindparser库将xmind的文件内容转成字典格式的数据
在转库的选择上,有好几个,以下是其中两个:
- xmind https://testerhome.com/opensource_projects/xmind
- xmindparser 将xmind文件转成可编程数据类型 - SegmentFault 思否
xmind库转换很齐全,但xmindparser对我来说够用了,轻便;
xmindparser转换也很简单:
#xmind to dict
from xmindparser import xmind_to_dict
dict_out = xmind_to_dict(xmind_file)
#xmind to json
from xmindpraser import xmind_to_json
out_file = xmind_to_json(xmind_file)
dict_out格式如下:
print(dict_out)
[{'title': '画布 1', 'topic': {'title': '产品名称', 'topics': [{'title': 'A模块', 'topics': [{'title': '测试用例1', 'topics': [{'title': '测试步骤1', 'topics': [{'title': '预期结果1.1'}]}, {'title': '测试步骤1.2', 'topics': [{'title': '预期结果1.2'}]}]}, {'title': '用例标题2', 'topics': [{'title': '执行步骤2.2', 'topics': [{'title': '预期结果2.2'}]}, {'title': '测试步骤2.3', 'topics': [{'title': '预期结果2.3'}]}, {'title': '测试步骤2.4', 'topics': [{'title': '预期结果2.4'}]}]}, {'title': '用例标题3(步骤和预期结果可以为空)'}]}, {'title': 'C模块', 'topics': [{'title': '#异常(忽略)', 'topics': [{'title': '测试步骤', 'topics': [{'title': '预期结果'}]}, {'title': '测试步骤', 'topics': [{'title': '预期结果'}]}]}, {'title': '测试步骤2', 'topics': [{'title': '执行步骤1111\r\n测试步骤100000', 'topics': [{'title': '预期结果1.1'}]}, {'title': '#测试步骤42', 'topics': [{'title': '预期结果1.2'}]}, {'title': '测试步骤4.3', 'topics': [{'title': '预期结果1.3'}]}]}]}, {'title': '#B模块(整个模块忽略)', 'topics': [{'title': '测试步骤1', 'topics': [{'title': '执行步骤1\r\n测试步骤1', 'topics': [{'title': '预期结果1.1'}]}, {'title': '#测试步骤42', 'topics': [{'title': '预期结果1.2'}]}, {'title': '测试步骤4.3(没有预期结果会提示)', 'topics': [{'title': '11'}]}]}, {'title': '用例标题2'}]}]}, 'structure': 'org.xmind.ui.map.unbalanced'}]
3、xlwt库写成入xls文件
关于这个库的用法可以参考这个链接
xlwt:https://www.jb51.net/article/154535.htm
4、tkinter库学习
哈,我是新手,也没打算深入学太多,就没花太多时间去整理,可以根据下面链接去学习,如果也有像我这样小白的,可以去B站(哔哩哔哩)搜索tkinter,看IT兄弟连的,讲得也比较基础。
tkinter库 http://c.biancheng.net/python/tkinter/
5、打包
打包用的是pyinstaller库,先在cmd下pip安装,然后进入相应的Python文件所在的文件夹下,输入命令 ():
pyinstaller -F xmindToExe.py -p my_xmind_csv_002.py
就可以生成exe可执行文件了,这样这个xmind转xls的打包工具就完成了。注意电脑管家可能会把exe文件删除掉,设置为安全就可以了。
PS:小白可能遇到的坑(如我 - -):
window下cmd 切换目录
cd 是用于同一个磁盘的文件夹的切换但是要从C盘切换到D盘不能直接用cd,要加参数 /D,才能实现从C盘调到D盘
cd /D 可以连盘符一起切换> cd /D D:\Python_Pro\LZQ_Tester\D02_WYY_WuYa\working
或者先 d: 切换磁盘到D,再cd D:\Python_Pro\LZQ_Tester\D02_WYY_WuYa\working
my_xmind_csv_002.py
from xmindparser import xmind_to_dict
import os,xlwt
from tkinter.messagebox import showinfo
import tkinter.messagebox
class xmind_to_csv():
def __init__(self):
self.workbook = xlwt.Workbook(encoding='utf-8')
self.worksheet = self.workbook.add_sheet('sheet1')
def numberLen(self,value,errornum=None):
try:
return len(value['topics'])
except KeyError:
if errornum==2:
#tkinter.messagebox.askokcancel('提示', '案例 "{0}",没有测试步骤和预期结果喔! 请确认是否如此!'.format(value['title']))
print('案例 "{0}",没有测试步骤和预期结果喔! 请确认是否如此!'.format(value['title']))
if errornum == 3:
#messagebox.showinfo(title='提示', message='案例 "{0}",没有预期结果喔! 请填写后重新执行!'.format(value['title']))
print('案例 "{0}",没有预期结果喔! 请填写后重新执行!'.format(value['title']))
return 0
def xmind_title(self,value):
"""获取xmind标题内容"""
return value['title']
def writeExcel(self,row,case,excelName):
sort=0
for key,value in case.items():
self.worksheet.write(row, sort, value)
sort=sort+1
self.workbook.save(excelName+'.xls')
def readXmind(self,FileName):
self.rowNum = 0 #计算测试用例的条数
self.caseDict={}
self.XmindContent = xmind_to_dict(FileName)[0]['topic'] # xmind内容
self.XmindTitle=self.xmind_title(self.XmindContent)
TestSiutMunFlag=self.numberLen(self.XmindContent,0)
for TestSiutMun in range(TestSiutMunFlag):
TestCaseMunFlag=self.numberLen(self.XmindContent['topics'][TestSiutMun],1)
for TestCaseMun in range(TestCaseMunFlag):
TestStepMunFlag=self.numberLen(self.XmindContent['topics'][TestSiutMun]['topics'][TestCaseMun],2)
#执行步骤跟预期结果为空的时候
if TestStepMunFlag==0:
self.caseDict['TestSiut'] = self.XmindContent['topics'][TestSiutMun]['title']
self.caseDict['TestCase'] = self.XmindContent['topics'][TestSiutMun]['topics'][TestCaseMun]['title']
self.caseDict['TestStep'] = '空'
self.caseDict['TestResult'] = '空'
self.caseDict['myTestCase'] = self.caseDict['TestSiut'] + '/' + self.caseDict['TestCase']
print(self.rowNum,self.caseDict['myTestCase'])
self.rowNum = self.rowNum + 1
self.writeExcel(self.rowNum,self.caseDict,self.XmindTitle)
for TestStepMun in range(TestStepMunFlag):
TestResultFlag = self.numberLen(self.XmindContent['topics'][TestSiutMun]['topics'][TestCaseMun]['topics'][TestStepMun],3)
#预期结果不能为空
if TestResultFlag != 0:
self.caseDict['TestSiut']=self.XmindContent['topics'][TestSiutMun]['title']
self.caseDict['TestCase']=self.XmindContent['topics'][TestSiutMun]['topics'][TestCaseMun]['title']
self.caseDict['TestStep']=self.XmindContent['topics'][TestSiutMun]['topics'][TestCaseMun]['topics'][TestStepMun]['title']
self.caseDict['TestResult'] = self.XmindContent['topics'][TestSiutMun]['topics'][TestCaseMun]['topics'][TestStepMun]['topics'][0]['title']
self.caseDict['myTestCase']=self.caseDict['TestSiut']+'/'+self.caseDict['TestCase']+'-'+self.caseDict['TestStep']+'-'+self.caseDict['TestResult']
print(self.rowNum,len(self.caseDict['myTestCase']),self.caseDict['myTestCase'])
self.rowNum=self.rowNum+1
self.writeExcel(self.rowNum,self.caseDict,self.XmindTitle)
#showinfo(title='转换结束', message='生成{0}条案例,请检查是否有误。'.format(self.rowNum))
if __name__ == '__main__':
XmindFile = os.path.join(os.path.dirname(__file__),'xmind_excel.xmind') # xmind文件
xmind_to_csv().readXmind(XmindFile)
xmind_excel.py
import tkinter as tk
from tkinter.filedialog import askopenfilename
from tkinter.messagebox import showinfo
from D02_WYY_WuYa.working.my_xmind_csv_003 import xmind_to_csv
import re
# 定义MainUI类表示应用/窗口,继承Frame类
class MainUI(tk.Frame):
# Application构造函数,master为窗口的父控件
def __init__(self, master=None):
# 初始化Application的Frame部分
tk.Frame.__init__(self, master)
# 显示窗口,并使用grid布局
self.grid()
self.path = tk.StringVar()
# 创建控件
self.createWidgets()
def selectPath(self):
'''选择要转换成excel的xmind地址'''
self.path_ = askopenfilename()
self.path.set(self.path_)
# 创建控件
def createWidgets(self):
'''生成gui界面'''
# 创建一个标签,输出要显示的内容
self.firstLabel = tk.Label(self, text="目标路径")
# 设定使用grid布局
self.firstLabel.grid(row = 0, column = 0)
self.firstEntry = tk.Entry(self,textvariable = self.path)
self.firstEntry.grid(row=0, column=1)
# 创建一个按钮,用来触发answer方法
self.clickButton = tk.Button(self, text="路径选择", command=self.selectPath)
# 设定使用grid布局
self.clickButton.grid(row = 0, column = 2)
self.clickButton = tk.Button(self, text="提交",command=self.getvalue)
# 设定使用grid布局
self.clickButton.grid(row=4, column=1)
def getvalue(self):
'''执行转换excel函数'''
xmindPath = self.path.get()
self.regvalue = '.*\.xmind$'
self.xmind_reg = re.match(self.regvalue,xmindPath )
if self.xmind_reg:
# xmind转换成xls
self.xmind_to_xls = xmind_to_csv()
self.xmind_to_xls.readXmind(xmindPath)
else:
showinfo(title='提示',message='请选择正确的xmind文件,谢谢!')
# 创建一个MainUI对象
app = MainUI()
# 设置窗口标题
app.master.title('Xmind 转 xls ')
# 设置窗体大小
app.master.geometry('290x90')
app.master.resizable(False, False)
# 主循环开始
app.mainloop()
本文参考: