Python解析Xmind工具
使用Xmind写用例

使用Python解析Xmind,统计用例个数
代码:
from xmindparser import xmind_to_dict
import tkinter as tk
from tkinter import filedialog class ParseXmind:
# 统计文件中用例数
def count_case(self, li):
for i in range(len(li)):
if li[i].__contains__('topics'): # 带topics标签意味着有子标题,递归执行方法
self.count_case(li[i]['topics'])
else: # 不带topics意味着无子标题,此级别既是用例
# print(li[i]['title'])
if li[i].__contains__('makers'): # 有标记成功或失败时会有makers标签
if li[i]['makers'].__contains__('task-done'): # 标记成功的
self.case_success += 1
elif li[i]['makers'].__contains__('symbol-wrong'): # 标记失败的
self.case_fail += 1
elif li[i]['makers'].__contains__('symbol-code'): # 标记阻塞的
self.case_block += 1
self.count += 1 # 用例总数
# print(self.count) # 用例统计表新增一行
def new_line(self, filename, row_number):
self.count = 0
self.case_fail = 0
self.case_success = 0
self.case_block = 0
# 调用python中xmind_to_dict方法,将xmind转成字典
self.sheets = xmind_to_dict(filename) # sheets是一个list,可包含多sheet页;
for sheet in self.sheets:
print(sheet)
self.my_list = sheet['topic']['topics'] # 字典的值sheet['topic']['topics']是一个list
# print(my_list)
self.count_case(self.my_list) # 插入一行统计数据
lastname = filename.split('/')
self.label_file = tk.Label(self.frm2, text=lastname[-1], relief='groove', borderwidth='', width=25)
self.label_file.grid(row=row_number, column=0)
self.label_case = tk.Label(self.frm2, text=self.count, relief='groove', borderwidth='', 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='', 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='', 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='', width=10)
self.label_block.grid(row=row_number, column=4)
self.total_cases += self.count
self.total_success += self.case_success
self.total_fail += self.case_fail
self.total_block += self.case_block # 用例统计表新增多行
def new_lines(self):
# total汇总用
self.total_cases = 0
self.total_success = 0
self.total_fail = 0
self.total_block = 0 lines = self.text.get(1.0, tk.END) # 从text中获取所有行
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='', 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='', 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='', 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='', 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='', width=10)
self.label_block.grid(row=row_number, column=4) # 上传多个文件,并插入text中
def upload_files(self):
select_files = tk.filedialog.askopenfilenames(title="可选择1个或多个文件")
for file in select_files:
self.text.insert(tk.END, file + '\n')
self.text.update() def __init__(self, root):
# GUI
root.title('Xmind用例个数统计')
width = 570
height = 500
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)) self.frm1 = tk.Frame(root)
self.frm2 = tk.Frame(root)
self.frm1.grid(row=0, padx='', pady='')
self.frm2.grid(row=1, padx='', pady='') self.but_upload = tk.Button(self.frm1, text='上传xmind文件', command=self.upload_files, bg='#dfdfdf')
self.but_upload.grid(row=0, column=0, pady='')
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="开始统计", command=self.new_lines, bg='#dfdfdf')
self.but2.grid(row=0, columnspan=5, pady='')
self.label_file = tk.Label(self.frm2, text="文件名", relief='groove', borderwidth='', width=25, bg='#FFD0A2')
self.label_file.grid(row=1, column=0)
self.label_case = tk.Label(self.frm2, text="用例数", relief='groove', borderwidth='', width=10, bg='#FFD0A2').grid(row=1, column=1)
self.label_pass = tk.Label(self.frm2, text="成功", relief='groove', borderwidth='', width=10, bg='#FFD0A2').grid(row=1, column=2)
self.label_fail = tk.Label(self.frm2, text="失败", relief='groove', borderwidth='', width=10, bg='#FFD0A2').grid(row=1, column=3)
self.label_block = tk.Label(self.frm2, text="阻塞", relief='groove', borderwidth='', width=10, bg='#FFD0A2').grid(row=1, column=4) root = tk.Tk()
ParseXmind(root)
root.mainloop()
执行效果:

Python解析Xmind工具的更多相关文章
- 用Python解析XMind
本文来自网易云社区 作者:孙圣翔 转自:http://shengxiang.me/article/35/python-parse-xmind.html XMind是画思维脑图很好的工具,正好组里有个需 ...
- 提效工具-python解析xmind文件及xmind用例统计
现状 每个公司都有一个维护测试case的系统,有自研的也有买的,比如QC, 禅道等等,QA往往习惯使用xmind等思维导图工具来编写测试用例,因为思路清晰,编写方便,那么这就有一个问题,大多公司要求所 ...
- PYTHON解析XML的多种方式效率对比实测
在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜索后发现,目前应用比较广泛,且效率相对较高的E ...
- Python 包管理工具解惑
Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...
- Python第三方常用工具、库、框架等
Python ImagingLibrary(PIL):它提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换.打印和显示.还能进行一些图形效果的处理,如图形的放大.缩小和旋 ...
- python 解析docx文档的方法,以及利用Python从docx文档提取插入的文本对象和图片
首先安装docx模块,通过pip install docx或者在docx官方链接上下载安装都可以 下面来看下如何解析docx文档:文档格式如下 有3个部分组成 1 正文:text文档 2 一个表格. ...
- Python包管理工具和多版本环境管理
1. Python包管理工具 在安装Python包的过程中,经常涉及到distutils.setuptools.distribute.setup.py.easy_install.easy_instal ...
- 【转】Python 爬虫的工具列表【预】
这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pycurl). pycurl – 网络 ...
- java 写一个JSON解析的工具类
上面是一个标准的json的响应内容截图,第一个红圈”per_page”是一个json对象,我们可以根据”per_page”来找到对应值是3,而第二个红圈“data”是一个JSON数组,而不是对象,不能 ...
随机推荐
- c4b和c4f的区别
1. cc.c4b的参数直接填rgba的值. 2 .cc.c4f(r,g,b,透明度),把rgb值填进去,会发现颜色不对,需要把rgb值除以255,所以最终转换公式是: cc.c3b(r,g,b) = ...
- mysql拼接字符串
CONCAT(str1,str2,...) 如:在每一列meeting_persons的现有内容之上,增加15112319字符串 UPDATE wos_hrs.meeting_logs SET mee ...
- Python面向对象之-反射
Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr 判断是否有改属性或者方法,有返回True,没有返回false getattr 如果是属性获得该属性 ...
- js单元测试
最近研究了js的单元测试,分享一下心得. 说起单元测试以前还真是不太了解,这次索性了解一番,测试有很多包含单元测试,性能测试,安全测试和功能测试等几方面,本次只介绍一下单元测试. 前端进行单元测试主要 ...
- webpack配置antd的按需加载
安装babel-plugin-import插件.下面方法二选一,都可以实现antd的按需加载. 一.配置webpack.config.js文件 { test: /.jsx?$/, exclude: / ...
- get、put、post、delete含义与区别
1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...
- [转] Java程序员学C#基本语法两个小时搞定(对比学习)
Java程序员学C#基本语法两个小时搞定(对比学习) 对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. ...
- 使用163.com邮箱发送邮件
不要直接使用登录的密码,而是用配置中的授权码做为密码
- 2017 CCPC Qinhuangdao Site
A. Balloon Robot 假设机器人$0$时刻位于$0$号位置,那么每个气球所需的时间为$(s_a-b)\bmod m$. 将所有气球按这个时间排序,枚举每个气球的时间作为偏移量,得出最优解即 ...
- JQuery 绑定单击事件到某个函数的的方法
<script> function 我会在加载完页面马上执行() { alert('我会在加载完页面马上执行'); } function 我只会在按钮点击时才执行() { alert('我 ...