xmind转xls工具实现tapd测试用例

800 阅读4分钟

我正在参与掘金创作者训练营第4期(带链接:juejin.cn/post/706419…

1、前言

本人是测试一枚,新公司新人一枚,新公司使用的tapd,测试用例需要按照tapd上默认xls文档格式,我用表格编写测试用例有点不顺手,所以就想着怎么把xmind转成tapd要求的xls表格格式。

2、使用说明

excel表格名:xmind转成xls表格的名字

用例目录:与tapd命名一致即可(也可不填,导入tapd时再指定目录)

星星图标:用例执行阶段 依次为 冒烟|迭代|回归|PL回归|生产回归

image.png

优先级图标:测试用例等级,p1,p2,p3...

image.png

image.png

2、小工具将xmind转xls

目标路径:xmind测试用例地址

需求ID:tapd中需求ID号

执行人:可不填,tapd默认导入者为执行人

提交:点击提交xmind测试用例目录下会生成xls测试用例

image.png

3、导出的xls如下图

image.png

4、代码

小工具使用python+xmindparser+xlwt实现,使用‘tkinter’实现布局,

from xmindparser import xmind_to_dict
import re
import xlwt
import os

class xmind_to_xls():

    def xmind_num(self, value):
        """获取xmind标题个数"""
        try:
            return len(value['topics'])
        except KeyError:
            return 0

    def xmind_title(self, value):
        """获取xmind标题内容"""
        try:
            return value['title']
        except KeyError:
            return ''

    ## 返回文件路径
    def xmind_path_dir(self, xmind_file):
        return os.path.dirname(xmind_file)

    #测试 用例执行阶段 冒烟|迭代|回归|PL回归|生产回归
    def xmind_makers(self, value):
        star_makers = {
            "star-red": "冒烟",
            "star-orange": "迭代",
            "star-dark-blue": "回归",
            "star-purple": "PL回归",
            "star-green": "生产回归"
        }

        try:
            star_list = value['makers']
            for i in star_list:
                if star_makers.get(i) != None :
                    return star_makers[i]
            return ""
        except KeyError:
            return ""

    #测试用例等级
    def xmind_p(self, value):
        p_makers = {
            "priority-1": "P1",
            "priority-2": "P2",
            "priority-3": "P3",
            "priority-4": "P4",
            "priority-5": "P5"
        }

        try:
            star_list = value['makers']
            for i in star_list:
                if p_makers.get(i) != None :
                    return p_makers[i]
            return ""
        except KeyError:
            return ""

    def  xmind_cat(self, filename):
        '''调试函数,打印内容用的'''
        self.out = xmind_to_dict(filename)
        self.story = self.out[0]['topic']['topics']
        self.num=len(self.story)
        print(self.out)
        print(self.out[0]['topic']['title'])
        return self.story, self.num

    #def write_excel(self, xmind_file, testcasetype='', testcasestatus='', testcaselevel='', performer=''):
    def write_excel(self, xmind_file, tapdID='', editionname='', testcasetype='', testcasestatus='', testcaselevel='', performer=''):
        '''生成excel文件函数'''
        self.f=xlwt.Workbook()
        self.sheet1 =self.f.add_sheet('sheet1', cell_overwrite_ok=True)
        # self.row0 = ['用例目录', '用例名称', '需求ID','前置条件', '用例步骤', '预期结果', '用例类型', '用例状态', '用例等级', '创建人', '用例执行阶段']
        #                 0         1         2      3          4         5        6         7
        self.row0 = ['用例目录','用例名称','需求ID','前置条件','用例步骤','预期结果','用例类型','用例状态','用例等级','创建人','用例执行阶段']
        #生成第一行 用例目录,创建人
        for r in range(0, len(self.row0)):
            self.sheet1.write(0, r, self.row0[r])
        self.out = xmind_to_dict(xmind_file)
        self.xls_name = self.out[0]['topic']['title']  # xls name
        self.menu = self.out[0]['topic']['topics']  ##用例目录列表
        self.menunum = len(self.menu)  # 总用例目录数
        # 设置用例数 变量
        z = 0  # 用例结果数计数器
        for m in range(0, self.menunum):
            self.menu_dir = self.xmind_title(self.menu[m]) #用例目录
            self.story = self.menu[m]['topics'] ##用例列表
            self.storynum = len(self.story) #总用例数
            # j=1 #用例计算器

            for i in range(0, self.storynum):
                self.testcase_name = self.xmind_title(self.story[i]) ##用例名称
                self.testcase_star = self.xmind_makers(self.story[i]) ##用例类型 冒烟
                self.testcase_p = self.xmind_p(self.story[i])  ##用例等级 p1

                self.testcase_content = self.story[i]['topics'][0] ##用例过程

                self.testcase_num = self.xmind_num(self.testcase_content)
                self.testcase_pre = self.xmind_title(self.testcase_content)  ##前置条件

                self.sheet1.write(z + 1, 1, self.testcase_name)  # 用例名字
                self.sheet1.write(z + 1, 0, self.menu_dir)  # 用例目录
                self.sheet1.write(z + 1, 2, tapdID)  # 需求id
                self.sheet1.write(z + 1, 3, self.testcase_pre)  # 前置条件
                self.sheet1.write(z + 1, 6, self.testcase_star)  # 用例类型
                self.sheet1.write(z + 1, 7, u"正常")  # 用例状态
                self.sheet1.write(z + 1, 8, self.testcase_p)  # 用例等级
                self.sheet1.write(z + 1, 9, editionname)  # 创建人

                self.teststep_title = ''
                self.teststep_result = ''
                for k in range(0, self.testcase_num):
                    self.testcase = self.testcase_content['topics'][k]  # 用例描述
                    # 用例步骤
                    self.teststep_title += self.xmind_title(self.testcase) + '\n'
                    print(self.teststep_title)
                    self.teststep_result += self.xmind_title(self.testcase['topics'][0]) + '\n'

                self.sheet1.write(z + 1, 4, self.teststep_title.strip("\n"))
                self.sheet1.write(z + 1, 5, self.teststep_result.strip("\n"))
                z = z + 1

        dir = self.xmind_path_dir(xmind_file)
        print(dir)
        self.f.save(dir + "/" + self.xls_name+'.xls') #xls名称取xmind主题名称


if __name__ == '__main__':
     #xmind_file = "**.xmind"  # xmind文件
     tapdID='需求id' # 需求id
     editionname='bb' # 创建人
     #performer='cc'
     xmind_to_xls().write_excel(xmind_file, tapdID, editionname)
     #xmind_to_xls().xmind_cat(xmind_file)
import tkinter as tk
from tkinter.filedialog import askopenfilename
from xmindtoxls import  xmind_to_xls
from tkinter.messagebox import showinfo
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)

        # 创建一个标签,输入版用例目录,一般为“tabd目录名”
        self.trLabel = tk.Label(self, text="需求ID")
        # 设定使用grid布局 servicename, editionname
        self.trLabel.grid(row=2, column=0)
        self.tapdID = tk.StringVar()
        self.trEntry = tk.Entry(self, textvariable = self.tapdID)
        self.trEntry.grid(row=2, column=1)


        # 创建一个标签,输入创建人-执行人
        self.fourLabel = tk.Label(self, text="执行人")
        # 设定使用grid布局
        self.fourLabel.grid(row=4, column=0)
        self.owner = tk.StringVar()
        self.fourEntry = tk.Entry(self,textvariable = self.owner)
        self.fourEntry.grid(row=4, column=1)

        # 创建一个提交按钮,用来触发提交方法,获取值
        self.clickButton = tk.Button(self, text="提交", command=self.getvalue)
        # 设定使用grid布局
        self.clickButton.grid(row=5, column=1)

    def getvalue(self):
        '''获取输入的值,并执行转换excel函数'''
        global way, tapdID, owner
        way = self.path.get()
        # module = self.module.get()
        tapdID = self.tapdID.get().strip()
        owner = self.owner.get().strip()
        print(way, tapdID, owner)
        self.regvalue = '.*.xmind$'
        self.xmind_reg = re.match(self.regvalue, way)

        if self.xmind_reg:
            # xmind转换成xls
            self.xmind_to_xls = xmind_to_xls()
            self.xmind_to_xls.write_excel(way, tapdID, owner)
            showinfo(title='恭喜你!!!', message='xls生成成功')
        else:
            showinfo(title='提示', message='请选择正确的xmind文件,谢谢!')
            return

# 创建一个MainUI对象
app = MainUI()
# 设置窗口标题
app.master.title('「xmind转xls」')
# 设置窗体大小
app.master.geometry('300x200')
app.place(relx=0.1, y=10, relheight=0.6, width=300)
# 主循环开始
app.mainloop()

总结

代码写的有点粗糙,后续优化点:

TODO

1、实现多模板

2、内容提示友好点