使用Xmind写用例

使用Python解析Xmind,统计用例个数

代码:

  1. from xmindparser import xmind_to_dict
  2. import tkinter as tk
  3. from tkinter import filedialog
  4.  
  5. class ParseXmind:
  6. # 统计文件中用例数
  7. def count_case(self, li):
  8. for i in range(len(li)):
  9. if li[i].__contains__('topics'): # 带topics标签意味着有子标题,递归执行方法
  10. self.count_case(li[i]['topics'])
  11. else: # 不带topics意味着无子标题,此级别既是用例
  12. # print(li[i]['title'])
  13. if li[i].__contains__('makers'): # 有标记成功或失败时会有makers标签
  14. if li[i]['makers'].__contains__('task-done'): # 标记成功的
  15. self.case_success += 1
  16. elif li[i]['makers'].__contains__('symbol-wrong'): # 标记失败的
  17. self.case_fail += 1
  18. elif li[i]['makers'].__contains__('symbol-code'): # 标记阻塞的
  19. self.case_block += 1
  20. self.count += 1 # 用例总数
  21. # print(self.count)
  22.  
  23. # 用例统计表新增一行
  24. def new_line(self, filename, row_number):
  25. self.count = 0
  26. self.case_fail = 0
  27. self.case_success = 0
  28. self.case_block = 0
  29. # 调用python中xmind_to_dict方法,将xmind转成字典
  30. self.sheets = xmind_to_dict(filename) # sheets是一个list,可包含多sheet页;
  31. for sheet in self.sheets:
  32. print(sheet)
  33. self.my_list = sheet['topic']['topics'] # 字典的值sheet['topic']['topics']是一个list
  34. # print(my_list)
  35. self.count_case(self.my_list)
  36.  
  37. # 插入一行统计数据
  38. lastname = filename.split('/')
  39. self.label_file = tk.Label(self.frm2, text=lastname[-1], relief='groove', borderwidth='', width=25)
  40. self.label_file.grid(row=row_number, column=0)
  41. self.label_case = tk.Label(self.frm2, text=self.count, relief='groove', borderwidth='', width=10)
  42. self.label_case.grid(row=row_number, column=1)
  43. self.label_pass = tk.Label(self.frm2, text=self.case_success, relief='groove', borderwidth='', width=10)
  44. self.label_pass.grid(row=row_number, column=2)
  45. self.label_fail = tk.Label(self.frm2, text=self.case_fail, relief='groove', borderwidth='', width=10)
  46. self.label_fail.grid(row=row_number, column=3)
  47. self.label_block = tk.Label(self.frm2, text=self.case_block, relief='groove', borderwidth='', width=10)
  48. self.label_block.grid(row=row_number, column=4)
  49. self.total_cases += self.count
  50. self.total_success += self.case_success
  51. self.total_fail += self.case_fail
  52. self.total_block += self.case_block
  53.  
  54. # 用例统计表新增多行
  55. def new_lines(self):
  56. # total汇总用
  57. self.total_cases = 0
  58. self.total_success = 0
  59. self.total_fail = 0
  60. self.total_block = 0
  61.  
  62. lines = self.text.get(1.0, tk.END) # 从text中获取所有行
  63. row_number = 2
  64. for line in lines.splitlines(): # 分隔成每行
  65. if line == '':
  66. break
  67. print(line)
  68. self.new_line(line, row_number)
  69. row_number += 1
  70.  
  71. # total汇总行
  72. self.label_file = tk.Label(self.frm2, text='total', relief='groove', borderwidth='', width=25)
  73. self.label_file.grid(row=row_number, column=0)
  74. self.label_case = tk.Label(self.frm2, text=self.total_cases, relief='groove', borderwidth='', width=10)
  75. self.label_case.grid(row=row_number, column=1)
  76. self.label_pass = tk.Label(self.frm2, text=self.total_success, relief='groove', borderwidth='', width=10)
  77. self.label_pass.grid(row=row_number, column=2)
  78. self.label_fail = tk.Label(self.frm2, text=self.total_fail, relief='groove', borderwidth='', width=10)
  79. self.label_fail.grid(row=row_number, column=3)
  80. self.label_block = tk.Label(self.frm2, text=self.total_block, relief='groove', borderwidth='', width=10)
  81. self.label_block.grid(row=row_number, column=4)
  82.  
  83. # 上传多个文件,并插入text中
  84. def upload_files(self):
  85. select_files = tk.filedialog.askopenfilenames(title="可选择1个或多个文件")
  86. for file in select_files:
  87. self.text.insert(tk.END, file + '\n')
  88. self.text.update()
  89.  
  90. def __init__(self, root):
  91. # GUI
  92. root.title('Xmind用例个数统计')
  93. width = 570
  94. height = 500
  95. xscreen = root.winfo_screenwidth()
  96. yscreen = root.winfo_screenheight()
  97. xmiddle = (xscreen - width)/2
  98. ymiddle = (yscreen - height)/2
  99. root.geometry('%dx%d+%d+%d' % (width, height, xmiddle, ymiddle))
  100.  
  101. self.frm1 = tk.Frame(root)
  102. self.frm2 = tk.Frame(root)
  103. self.frm1.grid(row=0, padx='', pady='')
  104. self.frm2.grid(row=1, padx='', pady='')
  105.  
  106. self.but_upload = tk.Button(self.frm1, text='上传xmind文件', command=self.upload_files, bg='#dfdfdf')
  107. self.but_upload.grid(row=0, column=0, pady='')
  108. self.text = tk.Text(self.frm1, width=55, height=10, bg='#f0f0f0')
  109. self.text.grid(row=1, column=0)
  110. self.but2 = tk.Button(self.frm2, text="开始统计", command=self.new_lines, bg='#dfdfdf')
  111. self.but2.grid(row=0, columnspan=5, pady='')
  112. self.label_file = tk.Label(self.frm2, text="文件名", relief='groove', borderwidth='', width=25, bg='#FFD0A2')
  113. self.label_file.grid(row=1, column=0)
  114. self.label_case = tk.Label(self.frm2, text="用例数", relief='groove', borderwidth='', width=10, bg='#FFD0A2').grid(row=1, column=1)
  115. self.label_pass = tk.Label(self.frm2, text="成功", relief='groove', borderwidth='', width=10, bg='#FFD0A2').grid(row=1, column=2)
  116. self.label_fail = tk.Label(self.frm2, text="失败", relief='groove', borderwidth='', width=10, bg='#FFD0A2').grid(row=1, column=3)
  117. self.label_block = tk.Label(self.frm2, text="阻塞", relief='groove', borderwidth='', width=10, bg='#FFD0A2').grid(row=1, column=4)
  118.  
  119. root = tk.Tk()
  120. ParseXmind(root)
  121. root.mainloop()

执行效果:

Python解析Xmind工具的更多相关文章

  1. 用Python解析XMind

    本文来自网易云社区 作者:孙圣翔 转自:http://shengxiang.me/article/35/python-parse-xmind.html XMind是画思维脑图很好的工具,正好组里有个需 ...

  2. 提效工具-python解析xmind文件及xmind用例统计

    现状 每个公司都有一个维护测试case的系统,有自研的也有买的,比如QC, 禅道等等,QA往往习惯使用xmind等思维导图工具来编写测试用例,因为思路清晰,编写方便,那么这就有一个问题,大多公司要求所 ...

  3. PYTHON解析XML的多种方式效率对比实测

    在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜索后发现,目前应用比较广泛,且效率相对较高的E ...

  4. Python 包管理工具解惑

    Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...

  5. Python第三方常用工具、库、框架等

    Python ImagingLibrary(PIL):它提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换.打印和显示.还能进行一些图形效果的处理,如图形的放大.缩小和旋 ...

  6. python 解析docx文档的方法,以及利用Python从docx文档提取插入的文本对象和图片

    首先安装docx模块,通过pip install docx或者在docx官方链接上下载安装都可以 下面来看下如何解析docx文档:文档格式如下 有3个部分组成 1 正文:text文档 2 一个表格. ...

  7. Python包管理工具和多版本环境管理

    1. Python包管理工具 在安装Python包的过程中,经常涉及到distutils.setuptools.distribute.setup.py.easy_install.easy_instal ...

  8. 【转】Python 爬虫的工具列表【预】

    这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pycurl). pycurl – 网络 ...

  9. java 写一个JSON解析的工具类

    上面是一个标准的json的响应内容截图,第一个红圈”per_page”是一个json对象,我们可以根据”per_page”来找到对应值是3,而第二个红圈“data”是一个JSON数组,而不是对象,不能 ...

随机推荐

  1. [Ynoi2018]末日时在做什么?有没有空?可以来拯救吗?

    这道题真的超级...毒瘤 + 卡常 + 耗 RP 啊... 传送门 noteskey 题解看 shadowice 大仙 的 code 如果发现自己 T 掉了,别心急,洗把脸再交一遍试试... //by ...

  2. webpack4加载字体

    webpack加载字体,刚开始下载完字体后就用css去引用它,结果死活没显示我要的字体,后来https://www.aliyun.com/jiaocheng/654750.html这篇文章说要把下载的 ...

  3. unity 网页加载AB问题

    下载一次后会缓存,清理一下就能加载新的同名AB了 AssetBundle.onload

  4. OrCAD Capture CIS 16.6 为原理图中的Off-Page Connector添加页面编号

    操作系统:Windows 10 x64 工具1:OrCAD Capture CIS 16.6-S062 (v16-6-112FF) 为原理图中的Off-Page Connector添加页面编号 一般来 ...

  5. Ubuntu 18.04LTS 更新镜像配置

    清华大学开源镜像站:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ Ubuntu 的软件源配置文件是 /etc/apt/sources.list.将 ...

  6. .net core2.x 自动注入 Entity(实体对象到上下文)

    概要:有点老套,因为早在 .net frmework的时候(core还没出来),我们在使用 ef(4....6)的时候就已经这么用,这里我在搭建框架,所以随手写下,让后来人直接拿去用用. 1.使用前提 ...

  7. 利用MySQL游标进行计算排名

    SELECT a.id, a.nick_name, a.member_account, a.integral, () AS tRank #计算行号 FROM tzqc_raw_data AS a, ( ...

  8. vue中mint-ui的filed的与blur事件结合实现检查用户输入是否正确

    标题mint-ui的filed与blur事件验证用户输入格式是否正确说明:本人前端菜鸟,只是想借个地方做个笔记,为了以后查阅时比较方便.如有大神有什么建议的地方,欢迎提出来. 1.不得不说,mint- ...

  9. Lesnoe Ozero 2017. BSUIR Open 2017

    A. Tree Orientation 树形DP,$f[i][j][k]$表示$i$的子树中有$j$个汇点,$i$往父亲的树边方向为$k$的方案数. 转移则需要另一个DP:$g[i][j][k]$表示 ...

  10. Java Web 浏览器关闭后Session就会被销毁吗?

    浏览器关闭后Session就会被销毁吗? Session是JSP的九大内置对象(也称为隐含对象)中的一个,用于保存当前用户的状态信息,初学者可能认为Session的生命周期是从打开一个浏览器发送请求到 ...