python提效小工具-统计xmind用例数量(末节点统计)

工具使用说明
1、xmind文件中使用下列图标进行分类标识:

标记表示p0级别case:数字1

标记表示执行通过case:绿色√

标记表示执行失败case:红色×

标记表示执行阻塞case:橙色!

2、执行代码

3、在弹框内【上传xmind文件】按钮

4、在弹框内【开始统计】按钮

5、支持统计多个文件,多个sheet
————————————————
在以下原文链接修改了点:https://blog.csdn.net/weixin_43214644/article/details/127333745

__author__ = 'zhongxintao'
import tkinter as tk
from tkinter import filedialog, messagebox
from xmindparser import xmind_to_dict
import xmind


class ParseXmind:
    def __init__(self, root):
        # self.count = 0
        # self.case_fail = 0
        # self.case_success = 0
        # self.case_block = 0
        # self.case_priority = 0
        self.data = []

        # total汇总用
        self.total_cases = 0
        self.total_success = 0
        self.total_fail = 0
        self.total_block = 0
        self.toal_case_priority = 0


        # 设置弹框标题、初始位置、默认大小
        root.title(u'xmind文件解析及用例统计工具')
        width = 760
        height = 600
        xscreen = root.winfo_screenwidth()
        yscreen = root.winfo_screenheight()
        xmiddle = (xscreen - width) / 2
        ymiddle = (yscreen - height) / 2
        root.geometry('%dx%d+%d+%d' % (width, height, xmiddle, ymiddle))

        # 设置2个Frame
        self.frm1 = tk.Frame(root)
        self.frm2 = tk.Frame(root)

        # 设置弹框布局
        self.frm1.grid(row=1, padx='20', pady='20')
        self.frm2.grid(row=2, padx='30', pady='30')

        self.but_upload = tk.Button(self.frm1, text=u'上传xmind文件', command=self.upload_files, bg='#dfdfdf')
        self.but_upload.grid(row=0, column=0, pady='10')
        self.text = tk.Text(self.frm1, width=55, height=10, bg='#f0f0f0')
        self.text.grid(row=1, column=0)
        self.but2 = tk.Button(self.frm2, text=u"开始统计", command=self.new_lines, bg='#dfdfdf')
        self.but2.grid(row=0, columnspan=6, pady='10')
        self.label_file = tk.Label(self.frm2, text=u"文件名", relief='groove', borderwidth='2', width=25,
                                   bg='#FFD0A2')
        self.label_file.grid(row=1, column=0)
        self.label_case = tk.Label(self.frm2, text=u"用例数", relief='groove', borderwidth='2', width=10,
                                   bg='#FFD0A2').grid(row=1, column=1)
        self.label_pass = tk.Label(self.frm2, text=u"成功", relief='groove', borderwidth='2', width=10,
                                   bg='#FFD0A2').grid(row=1, column=2)
        self.label_fail = tk.Label(self.frm2, text=u"失败", relief='groove', borderwidth='2', width=10,
                                   bg='#FFD0A2').grid(row=1, column=3)
        self.label_block = tk.Label(self.frm2, text=u"阻塞", relief='groove', borderwidth='2', width=10,
                                    bg='#FFD0A2').grid(row=1, column=4)
        self.label_case_priority = tk.Label(self.frm2, text="p0case", relief='groove', borderwidth='2',
                                            width=10, bg='#FFD0A2').grid(row=1, column=5)

    def count_case(self, li, row_number):
        """统计xmind中的用例数"""
        self.data.append({'count':0, 'case_fail':0, 'case_success':0, 'case_block':0, 'case_priority':0})
        for i in range(len(li)):
            if li[i].__contains__('topics'):
                # 带topics标签表示有子标题,递归执行方法
                self.count_case(li[i]['topics'], row_number)
                # 不带topics表示无子标题,此级别即是用例
            else:
                # 有标记成功或失败时会有makers标签
                if li[i].__contains__('makers'):
                    for mark in li[i]['makers']:
                        # 成功
                        if mark == "symbol-right":
                            # self.case_success += 1
                            self.data[row_number - 2]['case_success'] += 1
                        # 失败
                        elif mark == "symbol-wrong":
                            # self.case_fail += 1
                            self.data[row_number - 2]['case_fail'] += 1
                        # 阻塞
                        elif mark == "symbol-attention":
                            # self.case_block += 1
                            self.data[row_number - 2]['case_block'] += 1
                        # 优先级
                        elif mark == "priority-1":
                            # self.case_priority += 1
                            self.data[row_number - 2]['case_priority'] += 1
                # 用例总数
                # self.count += 1
                self.data[row_number - 2]['count'] += 1

    def new_line(self, filename, row_number):
        """用例统计表新增一行"""
        # sheets是一个list,可包含多sheet页
        sheets = xmind_to_dict(filename)  # 调用此方法,将xmind转成字典
        for sheet in sheets:
            print(sheet)
            # 字典的值sheet['topic']['topics']是一个list
            my_list = sheet['topic']['topics']
            print(my_list)
            self.count_case(my_list, row_number)

        # 插入一行统计数据
        lastname = filename.split('/')
        self.label_file = tk.Label(self.frm2, text=lastname[-1], relief='groove', borderwidth='2', width=25)
        self.label_file.grid(row=row_number, column=0)

        self.label_case = tk.Label(self.frm2, text=self.data[row_number - 2]['count'], relief='groove', borderwidth='2', width=10)
        self.label_case.grid(row=row_number, column=1)
        self.label_pass = tk.Label(self.frm2, text=self.data[row_number - 2]['case_success'], relief='groove', borderwidth='2',
                                   width=10)
        self.label_pass.grid(row=row_number, column=2)
        self.label_fail = tk.Label(self.frm2, text=self.data[row_number - 2]['case_fail'], relief='groove', borderwidth='2', width=10)
        self.label_fail.grid(row=row_number, column=3)
        self.label_block = tk.Label(self.frm2, text=self.data[row_number - 2]['case_block'], relief='groove', borderwidth='2', width=10)
        self.label_block.grid(row=row_number, column=4)
        self.label_case_priority = tk.Label(self.frm2, text=self.data[row_number - 2]['case_priority'], relief='groove', borderwidth='2',
                                            width=10)
        self.label_case_priority.grid(row=row_number, column=5)
        self.total_cases += self.data[row_number - 2]['count']
        self.total_success += self.data[row_number - 2]['case_success']
        self.total_fail += self.data[row_number - 2]['case_fail']
        self.total_block += self.data[row_number - 2]['case_block']
        self.toal_case_priority += self.data[row_number - 2]['case_priority']

    def cleanup(self):
        # self.count = 0
        # self.case_fail = 0
        # self.case_success = 0
        # self.case_block = 0
        # self.case_priority = 0
        self.data = []

        # total汇总用
        self.total_cases = 0
        self.total_success = 0
        self.total_fail = 0
        self.total_block = 0
        self.toal_case_priority = 0

    def new_lines(self):
        """用例统计表新增多行"""
        # 从text中获取所有行
        self.cleanup()
        lines = self.text.get(1.0, tk.END)
        row_number = 2
        # 分隔成每行
        for line in lines.splitlines():
            if line == '':
                break
            print(line)
            self.new_line(line, row_number)
            row_number += 1

        # total汇总行
        self.label_file = tk.Label(self.frm2, text='total', relief='groove', borderwidth='2', width=25)
        self.label_file.grid(row=row_number, column=0)
        self.label_case = tk.Label(self.frm2, text=self.total_cases, relief='groove', borderwidth='2', width=10)
        self.label_case.grid(row=row_number, column=1)

        self.label_pass = tk.Label(self.frm2, text=self.total_success, relief='groove', borderwidth='2',
                                   width=10)
        self.label_pass.grid(row=row_number, column=2)
        self.label_fail = tk.Label(self.frm2, text=self.total_fail, relief='groove', borderwidth='2', width=10)
        self.label_fail.grid(row=row_number, column=3)
        self.label_block = tk.Label(self.frm2, text=self.total_block, relief='groove', borderwidth='2',
                                    width=10)
        self.label_block.grid(row=row_number, column=4)

        self.label_case_priority = tk.Label(self.frm2, text=self.toal_case_priority, relief='groove',
                                            borderwidth='2',
                                            width=10)
        self.label_case_priority.grid(row=row_number, column=5)

    def upload_files(self):
        """上传多个文件,并插入text中"""
        select_files = tk.filedialog.askopenfilenames(title=u"可选择1个或多个文件")
        for file in select_files:
            self.text.insert(tk.END, file + '\n')
            self.text.update()


if __name__ == '__main__':
    r = tk.Tk()
    ParseXmind(r)
    r.mainloop()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果你想要在转换过程中,区分出每个用例的优先级(例如 P1、P2 等),你可以在 Xmind 文件中为每个用例设置一个特定的图标或者标签,然后在代码中读取该图标或者标签的信息,并将其添加到 Excel 文件中。 以下是一个示例代码,假设我们将 P1 用例用红色星号标记: ```python import xmindparser import pandas as pd # 读取 Xmind 文件 xmind_file = 'test.xmind' workbook = xmindparser.load(xmind_file) # 获取用例 sheet_list = [] for sheet in workbook[0]['topic']['topics']: case_list = [] for case in sheet['topics']: # 获取用例属性 case_dict = {} case_dict['模块'] = sheet['title'] case_dict['用例名称'] = case['title'] case_dict['前置条件'] = case['note'] case_dict['步骤'] = [step['title'] for step in case['topics'][0]['topics']] case_dict['预期结果'] = [step['title'] for step in case['topics'][1]['topics']] # 判断用例优先级 if 'priority' in case and case['priority'] == '1': case_dict['优先级'] = 'P1' else: case_dict['优先级'] = 'P2' case_list.append(case_dict) # 将用例添加到 sheet sheet_df = pd.DataFrame(case_list) sheet_df = sheet_df[['模块', '用例名称', '前置条件', '步骤', '预期结果', '优先级']] # 调整列顺序 sheet_list.append((sheet['title'], sheet_df)) # 将每个 sheet 转为 Excel 文件 writer = pd.ExcelWriter('test.xlsx') for sheet_name, sheet_df in sheet_list: sheet_df.to_excel(writer, sheet_name=sheet_name, index=False) writer.save() ``` 该代码在读取用例时,判断每个用例是否有 `priority` 属性,并且该属性值是否为 `1`,如果是,则将该用例的优先级设置为 `P1`,否则设置为 `P2`。然后将优先级信息添加到 Excel 文件中。 需要注意的是,在 Xmind 中设置图标或者标签的方法可能因版本不同而有所不同。你需要先查看 Xmind 的使用文档,了解如何设置图标或者标签。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值