1.xmind文件模板如下所示(最后一个子级为预置条件)


2.excel用例模板


3.获取xmind文件数据并转成字典形式

from xmindparser import xmind_to_dict
#xmind_to_dict可读取xmind文件并转成字典形式展示 def get_xmind(filename1):
"""
获取思维导图数据
:return:
"""
data = xmind_to_dict(filename1)[0]["topic"]
return data if __name__ == '__main__': print(get_xmind(r"E:\集成资料\测试项目\项目资料\用例模板.xmind"))

"D:\Program Files\Python\Python37-32\python.exe" E:/pythonproject/work_pro/complete_case_export.py
{'title': '用例模板', 'topics': [{'title': '登录', 'topics': [{'title': '成功登录', 'makers': ['priority-1'], 'topics': [{'title': '点击账号输入框输入账号', 'topics': [{'title': '点击密码输入框输入密码', 'topics': [{'title': '点击提交菜单', 'topics': [{'title': '登录成功,进入到系统首页'}]}]}]}]}, {'title': '账号为空', 'makers': ['priority-3'], 'topics': [{'title': '不输入账号\r\n点击密码输入框输入密码\r\n点击提交菜单', 'topics': [{'title': '登录失败,提示账号密码错误'}]}]}, {'title': '密码为空', 'makers': ['priority-3'], 'topics': [{'title': '点击账号输入框输入账号\r\n不输入密码\r\n点击提交菜单', 'topics': [{'title': '登录失败,提示账号密码错误'}]}]}, {'title': '账号错误', 'makers': ['priority-3'], 'topics': [{'title': '点击账号输入框输入错误的账号', 'topics': [{'title': '点击密码输入框输入密码', 'topics': [{'title': '点击提交菜单', 'topics': [{'title': '登录失败,提示账号密码错误'}]}]}]}]}, {'title': '密码错误', 'makers': ['priority-3'], 'topics': [{'title': '点击账号输入框输入账号', 'topics': [{'title': '点击密码输入框输入错误的密码', 'topics': [{'title': '点击提交菜单', 'topics': [{'title': '登录失败,提示账号密码错误'}]}]}]}]}]}, {'title': '设备管理', 'topics': [{'title': '设备列表', 'topics': [{'title': '列表展示', 'makers': ['priority-1'], 'topics': [{'title': '查看列表数据展示是否与实际一致', 'topics': [{'title': '列表字段包含:设备名称等'}]}]}, {'title': '组合搜索', 'makers': ['priority-2'], 'topics': [{'title': '输入设备名称、设备编号、寄存器号搜索', 'topics': [{'title': '搜索出的结果数据同时满足以上条件'}]}]}]}, {'title': '设备新增', 'topics': [{'title': '成功新增设备', 'makers': ['priority-1'], 'topics': [{'title': '查看列表数据展示是否与实际一致', 'topics': [{'title': '列表字段包含:设备名称等'}]}]}, {'title': '必填项不输入时新增', 'makers': ['priority-4'], 'topics': [{'title': '输入设备名称、设备编号、寄存器号搜索', 'topics': [{'title': '搜索出的结果数据同时满足以上条件'}]}]}]}, {'title': '设备删除', 'topics': [{'title': '删除不在使用设备', 'makers': ['priority-1'], 'topics': [{'title': '查看列表数据展示是否与实际一致', 'topics': [{'title': '列表字段包含:设备名称等'}]}]}, {'title': '删除已在使用的设备', 'makers': ['priority-3'], 'topics': [{'title': '输入设备名称、设备编号、寄存器号搜索', 'topics': [{'title': '搜索出的结果数据同时满足以上条件'}]}]}]}, {'title': '设备编辑', 'topics': [{'title': '成功编辑设备', 'makers': ['priority-1'], 'topics': [{'title': '查看列表数据展示是否与实际一致', 'topics': [{'title': '列表字段包含:设备名称等'}]}]}, {'title': '编辑正在使用的设备', 'makers': ['priority-3'], 'topics': [{'title': '输入设备名称、设备编号、寄存器号搜索', 'topics': [{'title': '搜索出的结果数据同时满足以上条件'}]}]}]}]}]}

Process finished with exit code 0

4.用代码实现excel用例模板

    def __init__(self, filename1, filename2):
"""
数据初始化
:param filename:
:param data:
"""
self.str1 = ""
self.str2 = ""
self.step = ""
self.i = 1
self.k = 1
self.data = get_xmind(filename1) if os.path.isfile(filename2):
self.filename = filename2
else:
self.filename = filename2 + "\\" + self.data["title"] + ".xlsx" self.wb = openpyxl.Workbook(self.filename)
for s in self.data['topics']:
self.wb.create_sheet(s["title"])
self.wb.save(self.filename)
self.title = ["所属模块", "相关研发需求", "用例标题", "前置条件", "步骤", "预期", "关键词", "优先级", "用例类型", "适用阶段",
"用例状态"]
self.work = openpyxl.load_workbook(self.filename)
self.sheetnames = self.work.sheetnames
for name in self.sheetnames:
self.sheet = self.work[name] for i in range(1, len(self.title) + 1):
self.sheet.cell(1, i).value = self.title[i - 1] # 写入表头
self.sheet.cell(1, i).font = Font(bold=True, color=colors.BLACK) # 将表头字体设置为黑色,加粗
self.sheet.cell(1, i).fill = PatternFill(fill_type="solid", fgColor="003399") # 将表头填充颜色
row_name = get_column_letter(i) # 将数字编号转为字母编号
if i in [3, 5, 6]:
self.sheet.column_dimensions[row_name].width = 40 # 设置宽度
else:
self.sheet.column_dimensions[row_name].width = 20 self.work.save(self.filename)

5.将获取的数据按规则写入excel

    def set_value(self, infos):
"""
获取用例并写入excel
:return:
"""
global work , sheet, title, lever
for info in infos["topics"]:
if info["title"] in self.sheetnames:
self.i = 1
workbook = self.open_sheet(info["title"])
sheet = workbook[1]
work = workbook[0] if info.get("topics"):
if info.get("makers"):
self.k = 0
title = info["title"]
lever = info["makers"][0].split("-")[1]
self.str1 = infos["title"]
else:
if self.k == 0:
self.step += info["title"] + "\n"
if isinstance(info["topics"], list):
self.set_value(info)
else:
self.i += 1
data = "【" + self.str1 + "】" + title
sheet.cell(self.i, 3).value = data
sheet.cell(self.i, 5).value = self.step.rstrip("\n")
sheet.cell(self.i, 6).value = info["title"]
sheet.cell(self.i, 8).value = lever
sheet.cell(self.i, 9).value = "功能测试"
sheet.cell(self.i, 10).value = "功能测试阶段"
sheet.cell(self.i, 11).value = "正常"
sheet.cell(self.i, 3).alignment = Alignment(wrapText=True)
sheet.cell(self.i, 5).alignment = Alignment(wrapText=True)
sheet.cell(self.i, 6).alignment = Alignment(wrapText=True)
self.step = ""
self.k += 1
work.save(self.filename)

6.为了方便传参操作,引入easygui,通过界面传入

filename1 = g.fileopenbox(msg="请选择需要转换的xmind文件", title="文件", filetypes=["*.xmind"], multiple=False, default=r"E:\\")
filename2 = g.diropenbox(msg="请选择保存的文件路径", title="文件", default=r"E:\\")

7.完整实现代码

import openpyxl
from openpyxl.styles import Font
from openpyxl.styles import colors
from openpyxl.styles import PatternFill
from openpyxl.styles import Alignment
from openpyxl.utils import get_column_letter # 将数字转为字母
from xmindparser import xmind_to_dict
import os
import easygui as g def get_xmind(filename1):
"""
获取思维导图数据
:return:
"""
data = xmind_to_dict(filename1)[0]["topic"]
return data class CaseXmind():
"""
思维导图转用例
"""
def __init__(self, filename1, filename2):
"""
数据初始化
:param filename:
:param data:
"""
self.str1 = ""
self.str2 = ""
self.step = ""
self.i = 1
self.k = 1
self.data = get_xmind(filename1) if os.path.isfile(filename2):
self.filename = filename2
else:
self.filename = filename2 + "\\" + self.data["title"] + ".xlsx" self.wb = openpyxl.Workbook(self.filename)
for s in self.data['topics']:
self.wb.create_sheet(s["title"])
self.wb.save(self.filename)
self.title = ["所属模块", "相关研发需求", "用例标题", "前置条件", "步骤", "预期", "关键词", "优先级", "用例类型", "适用阶段",
"用例状态"]
self.work = openpyxl.load_workbook(self.filename)
self.sheetnames = self.work.sheetnames
for name in self.sheetnames:
self.sheet = self.work[name] for i in range(1, len(self.title) + 1):
self.sheet.cell(1, i).value = self.title[i - 1] # 写入表头
self.sheet.cell(1, i).font = Font(bold=True, color=colors.BLACK) # 将表头字体设置为黑色,加粗
self.sheet.cell(1, i).fill = PatternFill(fill_type="solid", fgColor="003399") # 将表头填充颜色
row_name = get_column_letter(i) # 将数字编号转为字母编号
if i in [3, 5, 6]:
self.sheet.column_dimensions[row_name].width = 40 # 设置宽度
else:
self.sheet.column_dimensions[row_name].width = 20 self.work.save(self.filename) def open_sheet(self, name):
"""
打开指定工作表
:param name:
:return:
"""
work = openpyxl.load_workbook(self.filename)
sheet = work[name]
return work, sheet def set_value(self, infos):
"""
获取用例并写入excel
:return:
"""
global work , sheet, title, lever
for info in infos["topics"]:
if info["title"] in self.sheetnames:
self.i = 1
workbook = self.open_sheet(info["title"])
sheet = workbook[1]
work = workbook[0] if info.get("topics"):
if info.get("makers"):
self.k = 0
title = info["title"]
lever = info["makers"][0].split("-")[1]
self.str1 = infos["title"]
else:
if self.k == 0:
self.step += info["title"] + "\n"
if isinstance(info["topics"], list):
self.set_value(info)
else:
self.i += 1
data = "【" + self.str1 + "】" + title
sheet.cell(self.i, 3).value = data
sheet.cell(self.i, 5).value = self.step.rstrip("\n")
sheet.cell(self.i, 6).value = info["title"]
sheet.cell(self.i, 8).value = lever
sheet.cell(self.i, 9).value = "功能测试"
sheet.cell(self.i, 10).value = "功能测试阶段"
sheet.cell(self.i, 11).value = "正常"
sheet.cell(self.i, 3).alignment = Alignment(wrapText=True)
sheet.cell(self.i, 5).alignment = Alignment(wrapText=True)
sheet.cell(self.i, 6).alignment = Alignment(wrapText=True)
self.step = ""
self.k += 1
work.save(self.filename) if __name__ == '__main__': filename1 = g.fileopenbox(msg="请选择需要转换的xmind文件", title="文件", filetypes=["*.xmind"], multiple=False, default=r"E:\\")
filename2 = g.diropenbox(msg="请选择保存的文件路径", title="文件", default=r"E:\\") CaseXmind(filename1, filename2).set_value(get_xmind(filename1))

所属模块、相关研发需求、预置条件等字段都可以内置在xmind,只需要通过其他标签区分就行。

python 之将xmind转为excel用例文件的更多相关文章

  1. Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据

    背景 Python中,想要打开已经存在的excel的xls文件,然后在最后新的一行的数据. 折腾过程 1.找到了参考资料: writing to existing workbook using xlw ...

  2. 使用Python将xmind脑图转成excel用例(一)

    最近接到一个领导需求,将xmind脑图直接转成可以导入的excel用例,并且转换成gui可执行的exe文件,方便他人使用. 因为对Python比较熟悉,所以就想使用Python来实现这个功能,先理一下 ...

  3. Python实现XMind测试用例快速转Excel用例

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/c2d10f21.html 你好,我是测试蔡坨坨. 今天分享一个Python编写的小工具,实现XMind测试用例转Excel用 ...

  4. python xmind转Excel(puppet洛洛原创)

    需求:将xmind文件转为Excel文件,并添加UI界面操作以降低操作难度. 这个需求一句话就讲清楚了,但实际上还需要做很多工作: 1,了解Xmind文件结构 2,提取Xmind文件分支内容(重点) ...

  5. 【用例篇】Xmind转为csv 导入禅道

    用过禅道的都知道,用例维护实在是太不方便了,有人推荐了一种方法,用Xmind先编写用例(思路比较清晰),写好之后借助工具(xmind2testcase)将用例转为CSV格式,之后再导入禅道 参考资料: ...

  6. 小白学 Python(24):Excel 基础操作(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  7. C# 将PDF转为Excel

    通常,PDF格式的文档能支持的编辑功能不如office文档多,针对PDF文档里面有表格数据的,如果想要编辑表格里面的数据,可以将该PDF文档转为Excel格式,然后编辑.本文,将以C#代码为例,介绍如 ...

  8. python+requests+yaml实现接口自动化用例

    前言:最近也思考了一下怎么做接口自动化,以下内容属于自己目前阶段所学习到的内容,也逐渐投入自己实际工作中,把最近的学习新得跟大家分享下,话不多说,切入正题. 对接口自动化测试用例的思考:接口测试大多测 ...

  9. python使用xlrd模块读写Excel文件的方法

    本文实例讲述了python使用xlrd模块读写Excel文件的方法.分享给大家供大家参考.具体如下: 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi ...

  10. 【Python】 更棒的Excel操作模块xlwings

    [xlwings] 说到Python操作Excel,有好多模块都可以支持这个工作.比如最底层的win32模块不仅可以操作Excel,还可以操作其他一众windows的软件. 其他的比较熟悉的有xlrd ...

随机推荐

  1. 追求性能极致:Redis6.0的多线程模型

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  2. 【SDOI2013】 项链 题解

    Solution 将原问题分为两个问题求解. Part 1 首先求珍珠的种类数. 设\(f_i\)表示满足\(gcd = i\)的本质不同珍珠个数, \(g_i\)表示满足\(gcd\)为\(i\)的 ...

  3. 什么是齐博/齐博CMS之X1?

    齐博x1:核心+模块+插件+钩子的理念把系统的灵活性及拓展性做到了极致!!!齐博X1是齐博软件基于thinkphp5开发的内容管理系统,拓展性非常强,后台一键升级,后台提供丰富的频道模块云市插件市场. ...

  4. JavaScript函数式编程之函子

    函子(Functor) 函子是一个特殊的容器,通过一个普通对象来实现,该对象具有map方法,map方法可以运行一个函数对值进行处理(变形关系),容器包含值和值变形关系(这个变形关系就是函数).函数式编 ...

  5. jmeter分布式压测对master、slave防火墙配置

    首先要了解jmeter分布式压测的基础概念:master为统计结果的服务器,slave为各台压力机,如下图所示 一.结论 针对master 1.修改jmeter.properties的client.r ...

  6. 嵌入式-C语言基础:字符串结束标识符

    #include<stdio.h> int main() { char cdata[]={'h','e','l','l','o'}; char cdata2[]="hello&q ...

  7. Python基础之网络编程:2、OSI协议之七层协议

    目录 Python基础之网络编程 一.网络编程前戏 二.OSI七层协议 简介: 1.物理连接层 2.数据链路层 网络相关专业名词 3.网络层 4.传输层 Python基础之网络编程 一.网络编程前戏 ...

  8. IOT黑客入门篇之初探Badusb

    什么是Badusb?   BadUSB是一种使用带有恶意软件编程的USB设备的计算机安全攻击.例如,USB 闪存驱动器可以包含可编程的Intel 8051微控制器,该微控制器可以重新编程,将USB闪存 ...

  9. 安卓APP和小程序渗透测试技巧总结

    安卓APP和小程序渗透测试技巧总结 免责声明: 安卓7以上抓取https流量包 证书信任 首先安装OpenSSL,此步骤不再赘述,可以参考百度. 然后安装模拟器(我使用的是夜神模拟器). 导出需要的证 ...

  10. Go语言核心36讲21

    提到Go语言中的错误处理,我们其实已经在前面接触过几次了. 比如,我们声明过error类型的变量err,也调用过errors包中的New函数.今天,我会用这篇文章为你梳理Go语言错误处理的相关知识,同 ...