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数组,而不是对象,不能 ...
随机推荐
- 关于NB-IoT的十大问题和答案【转】
转自:https://blog.csdn.net/u011943791/article/details/80287053 今天大白来给各位解答一下关于NB-IoT的十大问题. 问1:NB-IoT模块还 ...
- codeforces 1082G - Petya and Graph 最大权闭合子图 网络流
题意: 让你选一些边,选边的前提是端点都被选了,求所有的边集中,边权和-点权和最大的一个. 题解: 对于每个边建一个点,然后就是裸的最大权闭合子图, 结果比赛的时候我的板子太丑,一直T,(不会当前弧优 ...
- Task.Run与Task.Factory.StartNew的区别
Task是可能有延迟的工作单元,目的是生成一个结果值,或产生想要的效果.任务和线程的区别是:任务代表需要执行的作业,而线程代表做这个作业的工作者. 在.Net 4中,Task.Factory.Star ...
- vue 动态变量值不变化
caseData = { lists:[] }; vm = new Vue({ el: '.hs-mt', data: caseData }); function getlist(pid,id){ $ ...
- Vue项目中,要保证某个部分的高度,应该怎么设置
.icons overflow: hidden height: padding-bottom: % background: green
- FM算法(二):工程实现
主要内容: 实现方法 Python实现FM算法 libFM 一.实现方法 1.FM模型函数 变换为线性复杂度的计算公式: 2.FM优化目标 根据不同的应用,FM可以采用不同的损失函数loss fu ...
- from表单校验插件 validate 实例
$("#nextSubmit").click(function(){ $("#recovePasswordForm").submit(); }); $(&quo ...
- CSS选择器权重计算
CSS各种选择器的权重: 1.ID选择器 +100 2.类.属性.伪类选择器 +10 3.元素.伪元素选择器 +1 4.其他选择器 +0 如果有两个CSS样式都作用于某元素,如: #id ...
- pip错误-failed to create process/fatal error in launcher
电脑同时装了python2和python3,并且都配置了环境变量 将python2的python.exe改成python2.exe,python3的python.exe没有改(主要用python2时则 ...
- MATLAB读视频报错 Unable to initialize the video obtain properties (videoreader in Matlab)
这个bug卡了半天,这里记录一下 Error using VideoReader/init (line ) Could not read file due to an unexpected error ...