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数组,而不是对象,不能 ...
随机推荐
- 关于git 远程仓库密码一直输错的问题
解决方法, git 换地方使用后需要重新配置秘钥,一个钥匙开一个地方的门: 如果还不行, 在控制面板-用户账户-凭据管理-加添凭证,输入正确的账号密码:因为Windows的凭据管理器里面可能保存了你刚 ...
- Vertx eventbus模块解析
eventbus 事件總線 協議棧 TCP分包,粘包解決採用方案: 消息定长(定義消息体總长度),消息分为消息头和消息体 dataType bytes description int 4 包体总大小 ...
- ycmd for emacs 代码自动补全
YCMD FOR EMACS Table of Contents 1. 安装 1.1. 下载 1.2. 安装相关依赖 1.3. 更新submodules 1.4. 安装 2. 配置 1 安装 1. ...
- freemaker 操作字符串
来源于博客:https://blog.csdn.net/qq_35624642/article/details/72926769 Freemarker操作字符串 1.substring(start,e ...
- ng表单验证
<angular>中form表单的验: 1.在form中加上 novalidate 2.利用ng-pattern验证 (*如果不匹配的话 ng-model是绑定不上数据的) 常用的表单验证 ...
- python 3编写贴吧图片下载软件(超简单)
业余时间初学者作品,大佬勿喷,代码都很简单. py文件打包成exe教程:python3.7 打包成exe程序, 本程序体验下载地址:python编译的贴吧图片下载工具 先上效果图 启动后是这样的: 按 ...
- SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)
在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...
- 英语口语练习系列-C35-马戏-谈论语言-己亥杂诗
词汇-马戏 circus audience spectator spotlight bandstand magic magician clown spacious attractive product ...
- django——模型层之单表
1.ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...
- php实现多进程和关闭进程
一.php实现多进程 PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展. 先代码: <?php$arr = ['30000000 ...