• python提效小工具-统计xmind用例数量


    问题:做测试的朋友们经常会用到xmind这个工具来梳理测试点或写测试用例,但是xmind8没有自带的统计测试用例,其他版本的xmind有些自带节点数量统计功能,但也也不会累计最终的数量,导致统计测试工作量比较困难。

    解决方法:利用python开发小工具,实现同一份xmind文件中一个或多个sheet页的用例数量统计功能。

    一、源码

    #!/usr/bin/env python

    -- coding:utf-8 --

    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

        # 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):
        """统计xmind中的用例数"""
        for i in range(len(li)):
            if li[i].__contains__('topics'):
                # 带topics标签表示有子标题,递归执行方法
                self.count_case(li[i]['topics'])
                # 不带topics表示无子标题,此级别即是用例
            else:
                # 有标记成功或失败时会有makers标签
                if li[i].__contains__('makers'):
                    for mark in li[i]['makers']:
                        # 成功
                        if mark == "symbol-right":
                            self.case_success += 1
                        # 失败
                        elif mark == "symbol-wrong":
                            self.case_fail += 1
                        # 阻塞
                        elif mark == "symbol-attention":
                            self.case_block += 1
                        # 优先级
                        elif mark == "priority-1":
                            self.case_priority += 1
                # 用例总数
                self.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)
    
        # 插入一行统计数据
        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.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.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.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.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.case_priority, relief='groove', borderwidth='2',
                                            width=10)
        self.label_case_priority.grid(row=row_number, column=5)
        self.total_cases += self.count
        self.total_success += self.case_success
        self.total_fail += self.case_fail
        self.total_block += self.case_block
        self.toal_case_priority += self.case_priority
    
    def new_lines(self):
        """用例统计表新增多行"""
        # 从text中获取所有行
        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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144

    if name == ‘main’:
    r = tk.Tk()
    ParseXmind®
    r.mainloop()

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

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

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

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

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

    2、执行代码

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

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

    三、实现效果
    在这里插入图片描述

  • 相关阅读:
    顺序表的应用-通讯录
    大数据技术原理与应用
    FISCO BCOS(二十二)——— 游离节点、观察者节点和共识节点
    关怀“钉子户”,魅族卷对了方向
    低代码平台要怎么选?便宜其实也有好货!
    java分割大文件为多个小文件
    Denoising diffusion implicit models 阅读笔记
    良好的编码习惯
    【LeetCode】插入区间
    ElasticSearch环境配置-尚硅谷大数据培训
  • 原文地址:https://blog.csdn.net/weixin_43214644/article/details/127333745