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


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

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

    一、源码

    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
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    __author__ = 'zhongxintao'
    import tkinter as tk
    from tkinter import filedialog
    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()
     
     
    if __name__ == '__main__':
        r = tk.Tk()
        ParseXmind(r)
        r.mainloop()

     

    二、工具使用说明

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

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

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

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

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

    2、执行代码

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

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

    三、实现效果

    转载请说明原文出处!!!

     



    作者:Xintao zhong
    出处:https://zxt518.cnblogs.com/

    如果,您希望更容易地发现我的新文章,不妨点击一下绿色通道的关注我,亦可微信搜索号Zxt-shenhaiweilan关注我。

    如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!
    版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。如您有任何疑问或者授权方面的协商,请          .
  • 相关阅读:
    NoSQL
    MySQL查询的执行流程
    draw.io 二次开发(idea2020) 系列(二)
    Android 逆向之安全防护基本策略
    在线音乐播放器 --- 图片上传
    2009(408)数据结构有关链表代码题
    Qt TCP网络编程基本教程
    如何查看mysql里面的锁(详细)
    T31开发笔记:OTA升级
    nero platinum刻录光盘简要教程(文章末尾有教程链接)
  • 原文地址:https://www.cnblogs.com/zxt518/p/16793800.html