xmind2testcase使用与二次开发

xmind2testcase安装、简单二次开发与使用说明:

添加xmind文件备份

重构生成CSV文件

preview预览页面数据显示重构

一、安装

1.xmind2testcase安装

pip install xmind2testcase

2.启动服务

进入默认位置:C:\Users\dell\AppData\Roaming\Python\Python38\Scripts,打开cmd命令窗口,执行命令xmind2testcase.exe webtool 5000,浏览器地址栏输入http://本地ip:5000 访问

二、二次开发

源码地址C:\Users\dell\AppData\Roaming\Python\Python38\site-packages\webtool

1.xmind文件备份

打开application.py,添加BACKUP_FOLDER = os.path.join(here, 'backup')

init()方法添加

if not exists(BACKUP_FOLDER):os.mkdir(BACKUP_FOLDER)

save_file(file)添加

shutil.copy(upload_to, BACKUP_FOLDER)

2.重构生成CSV脚本

import xlwt
from xmindparser import xmind_to_dict
import os'''
对xmind文件增加了多种样式的处理
'''def font():'''设置字体:return:'''font = xlwt.Font()font.bold = Falsereturn fontdef border():'''设置边框:return:'''border = xlwt.Borders()border.left = 1border.right = 1border.top = 1border.bottom = 1return borderdef backcolor():'''设置背景色:return:'''backcolor = xlwt.Pattern()backcolor.pattern = xlwt.Pattern.SOLID_PATTERNbackcolor.pattern_fore_colour = 21return backcolordef style():'''设置不同样式:return:'''# 设置第一行样式alignment0 = xlwt.Alignment()alignment0.horz = 0x02alignment0.vert = 0x01style0 = xlwt.XFStyle()style0.alignment = alignment0style0.borders = border()style0.font = font()style0.pattern = backcolor()# 用例编码、模块样式alignment1 = xlwt.Alignment()alignment1.horz = 0x02alignment1.vert = 0x01style1 = xlwt.XFStyle()style1.alignment = alignment1# 测试用例名称样式alignment2 = xlwt.Alignment()alignment2.horz = 0x01alignment2.vert = 0x01alignment2.wrap = 1style2 = xlwt.XFStyle()style2.alignment = alignment2# 操作步骤样式alignment3 = xlwt.Alignment()alignment3.horz = 0x01alignment3.vert = 0x01alignment3.wrap = 1  # 单元格内自动换行style3 = xlwt.XFStyle()style3.alignment = alignment3style3.alignment.wrap = 1  # 单元格有换行符时换行# 预期结果样式alignment4 = xlwt.Alignment()alignment4.horz = 0x01alignment4.vert = 0x01alignment4.wrap = 1style4 = xlwt.XFStyle()style4.alignment = alignment4return style0, style1, style2, style3, style4class xmind_to_csv():""" xmind文档用例转xls文档用例"""def infinite_for(self, loop, case, case_list, n):for branches in loop:# 定义新字符串,把所有路径加起来strvar = case + branches['title'] + '/#'if 'topics' not in branches:# 分支遍历完,把他加到列表里面case_list.append(strvar)continuebranch = branches['topics']# 无限循环调用方法,遍历他的全部分支self.infinite_for(branch, strvar, case_list, n)# 根据传参重写路径# else:#     strvar = strvardef read_xmind(self, filename):if filename.endswith('.xmind') and os.path.exists(filename):self.xmind = xmind_to_dict(filename)self.file_name = filename.split('.')[0]return self.xmind, self.file_nameelse:print('文件格式不对或文件不存在!')def write_excel(self, filename):'''生成excel文件函数'''global li_varstyles = style()  # xls单元格样式self.workbook = xlwt.Workbook(encoding='utf-8')self.worksheet = self.workbook.add_sheet('sheet1', cell_overwrite_ok=True)row_0 = ['用例编码', '模块', '测试要点', '测试用例标题', '操作步骤', '预期结果', '实际结果', '是否通过','执行人员', '备注']sizes = [10, 15, 30, 30, 50, 30, 30, 10, 10, 30]  # 设置单元格长度for i in range(len(row_0)):self.worksheet.write(0, i, row_0[i], styles[0])self.worksheet.col(i).width = sizes[i] * 256  # 设置单元格长度self.worksheet.row(0).height_mismatch = True  # 设置单元格高度self.worksheet.row(0).height = 4 * 256self.worksheet.set_panes_frozen('1')  # 设置冻结为真self.worksheet.set_horz_split_pos(1)  # 水平冻结第一行self.worksheet.set_vert_split_pos(2)  # 垂直冻结第一列# 开始解析xmind并写入excelself.xd = self.read_xmind(filename)self.xls_name = self.xd[0][0]['topic']['title']case_list = []  # 所有用例case = ''  # 单条用例self.data_case = self.xd[0][0]['topic']['topics']# 循环遍历整个字典,并把每个最小分支的路径按 /# 加入到case_list 列表中self.infinite_for(self.data_case, case, case_list, 0)try:# print(listvar)n = 1for a_var in case_list:l_var = a_var.split('/#')[:-1]print(l_var)if len(l_var) < 3:# print('格式不符合要求')continueelif len(l_var) == 5:Test_no = '%03d' % n  # 用例编号Module = f'{l_var[0]}'  # 所属模块Test_point = f'{l_var[1]}'  # 测试要点Test_title = f'{l_var[2]}'  # 测试标题Test_step = f'{l_var[-2]}'  # 操作步骤Test_result = f'{l_var[-1]}'  # 预期结果# 写入的参数li_var = [Test_no, Module, Test_point, Test_title, Test_step, Test_result]elif len(l_var) == 4:Test_no = '%03d' % n  # 用例编号Module = f'{l_var[0]}'  # 所属模块Test_point = f'{l_var[1]}'  # 测试要点Test_title = f'{l_var[1]}'  # 测试标题Test_step = f'{l_var[-2]}'  # 操作步骤Test_result = f'{l_var[-1]}'  # 预期结果li_var = [Test_no, Module, Test_point, Test_title, Test_step, Test_result]elif len(l_var) == 3:Test_no = '%03d' % n  # 用例编号Module = f'{l_var[0]}'  # 所属模块Test_point = f'{l_var[0]}'  # 测试要点Test_title = f'{l_var[0]}'  # 测试标题Test_step = f'{l_var[-2]}'  # 操作步骤Test_result = f'{l_var[-1]}'  # 预期结果li_var = [Test_no, Module, Test_point, Test_title, Test_step, Test_result]else:Test_no = '%03d' % n  # 用例编号Module = f'{l_var[0]}'  # 所属模块Test_point = f'{l_var[1]}'  # 测试要点Test_title = f'{l_var[2]}'  # 测试标题Test_step = f'{l_var[-2]}'  # 操作步骤Test_result = f'{l_var[-1]}'  # 预期结果li_var = [Test_no, Module, Test_point, Test_title, Test_step, Test_result]# for j in li_var:#     self.worksheet.write(n, int(j[-1]), j[:-1])for i in range(len(li_var)):self.worksheet.write(n, 0, li_var[0], styles[1])self.worksheet.write(n, 1, li_var[1], styles[1])self.worksheet.write(n, 2, li_var[2], styles[2])self.worksheet.write(n, 3, li_var[3], styles[2])self.worksheet.write(n, 4, li_var[4], styles[3])self.worksheet.write(n, 5, li_var[5], styles[3])n += 1self.workbook.save(self.xd[1] + '.csv')  # xls名称取xmind主题名称except Exception as e:print(e)if __name__ == '__main__':run = xmind_to_csv()run.write_excel(filename='系统消息001.xmind')# os.system('pause')
download_zentao_file(filename)方法修改,引用新的处理方法,注释原部分代码,使用新的处理方法

#使用重构生成CSV脚本
xmind_csv_file = xmind_to_csv()
xmind_csv_file.write_excel(full_path)
filename=filename.split('.')[0]+'.csv'
if not exists(join(app.config['UPLOAD_FOLDER'], filename)):abort(404)
@app.route('/<filename>/to/zentao')
def download_zentao_file(filename):full_path = join(app.config['UPLOAD_FOLDER'], filename)if not exists(full_path):abort(404)# zentao_csv_file = xmind_to_zentao_csv_file(full_path)# filename = os.path.basename(zentao_csv_file) if zentao_csv_file else abort(404)# return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)#使用重构生成CSV脚本xmind_csv_file = xmind_to_csv()xmind_csv_file.write_excel(full_path)filename=filename.split('.')[0]+'.csv'if not exists(join(app.config['UPLOAD_FOLDER'], filename)):abort(404)return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)

3.预览页面重构

预览数据处理

import xlwt
from xmindparser import xmind_to_dict
import osdef read_xmind(filename):'''读取xmind文件:param filename: xmind文件名'''if filename.endswith('.xmind') and os.path.exists(filename):xmind = xmind_to_dict(filename)return xmindelse:print('文件格式不对或文件不存在!')def infinite_for(loop, case, TestCase_lise, n):for branches in loop:# 定义新字符串,把所有路径加起来strvar = case + branches['title'] + '/#'if 'topics' not in branches:# 分支遍历完,把他加到列表里面TestCase_lise.append(strvar)continuebranch = branches['topics']# 无限循环调用方法,遍历他的全部分支infinite_for(branch, strvar, TestCase_lise, n)# return TestCase_lisedef do_xmind(filename):'''处理xmind文件,数据将显示在preview预览页面'''TestCase_lise = []suite = read_xmind(filename)# print(suite)suite_name = suite[0]['topic']['title']case_list = []  # 所有用例case = ''  # 单条用例data_case = suite[0]['topic']['topics']infinite_for(data_case, case, case_list, 0)# print(case_list)# print(len(case_list))for i in case_list:i=i.split('/#')[:-1]TestCase_lise.append(i)print(TestCase_lise)return TestCase_liseif __name__ == '__main__':do_xmind('系统消息001.xmind')
application.py引入模块

preview_file(filename)方法修改,注释旧代码,引入新处理方法
# testcases = get_xmind_testcase_list(full_path)
#重写界面显示数据
testcases=do_xmind(full_path)
@app.route('/preview/<filename>')
def preview_file(filename):full_path = join(app.config['UPLOAD_FOLDER'], filename)if not exists(full_path):abort(404)testsuites = get_xmind_testsuites(full_path)suite_count = 0for suite in testsuites:suite_count += len(suite.sub_suites)# testcases = get_xmind_testcase_list(full_path)#重写界面显示数据testcases=do_xmind(full_path)return render_template('preview.html', name=filename, suite=testcases, suite_count=suite_count)

preview.html修改

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{ name }} | Xmind2TestCase Preview</title><link rel="shortcut icon" href="{{ url_for('static',filename='favicon.ico') }}" type="image/x-icon"/><link rel="stylesheet" type="text/css" media="all" href="{{ url_for('static',filename='css/pure-min.css') }}"><link rel="stylesheet" type="text/css" media="all" href="{{ url_for('static',filename='css/custom.css') }}">
</head>
<body>
<div class="header"><h1>{{ name }}</h1><h2>用例模块: {{ suite_count }} / 用例数量: {{ suite | length }}/ <a href="{{ url_for("download_zentao_file",filename= name) }}">下载CSV</a>/ <a href="{{ url_for("download_testlink_file",filename= name) }}">下载XML</a>/ <a href="{{ url_for("index") }}">返回首页</a></h2>
</div>
<table class="pure-table tests-table"><thead><tr><th width="5%">序号</th><th width="10%">模块</th><th>测试要点</th><th width="40%">操作步骤</th><th width="23%">预期结果</th></tr></thead><tbody>
{#    {% for test in suite %}#}
{#        <tr>#}
{#            <td>{{ loop.index }}</td>#}
{#            <td>{{ test.suite }}</td>#}
{#            <td {% if test.name|length>100 %}class="long-name" {% endif %}>{{ test.name }}#}
{#                {% if test.name|length>100 %}#}
{#                    <span class="long-name-info">Warn: test name might be too long: {{ test.name|length }}!</span>#}
{#                {% endif %}#}
{#            </td>#}
{#            <td>#}
{#                <div class="tag-success tooltip">#}
{#                    Priority {{ test.importance }}#}
{#                    <span class="tooltiptext">Priority {{ test.importance }} </span>#}
{#                </div>#}
{#                {% if test.preconditions %}#}
{#                    <div class="pure-button tag-info tooltip">PreCond.#}
{#                        <p class="tooltiptext">#}
{#                            <b>Preconditions:</b> <br>#}
{#                            {{ test.preconditions | replace('\n','<br>') |safe }}#}
{#                        </p></div>#}
{#                {% endif %}#}
{#                {% if test.summary %}#}
{#                    <div class="pure-button tag-warn tooltip">Summary#}
{#                        <p class="tooltiptext">#}
{#                            <b>Summary:</b> <br>#}
{#                            {{ test.summary | replace('\n','<br>') |safe }}#}
{#                        </p></div>#}
{#                {% endif %}#}
{#            <td>#}
{#                {% if test.steps %}#}
{#                    <ol>#}
{#                        {% for step in test.steps %}#}
{#                            <li>{{ step.actions }}#}
{#                                {% if step.expectedresults %}#}
{#                                    <ul>#}
{#                                        <li>{{ step.expectedresults }}</li>#}
{#                                    </ul>#}
{#                                {% endif %}#}
{#                            </li>#}
{#                        {% endfor %}#}
{#                    </ol>#}
{#                {% endif %}#}
{#            </td>#}
{#        </tr>#}
{#    {% endfor %}#}{% for test in suite %}<tr><td>{{ loop.index }}</td><td>{{ test[0] }}</td>{% if test|length>2 %}<td>{{ test[-3] }}</td>{% else %}<td>{{ test[0] }}</td>{% endif %}<td>{{ test[-2] }}<td>{{ test[-1] }}</td></tr>{% endfor %}</tbody>
</table>
{#<div class="footer">#}
{#    <a href="{{ url_for('static', filename='guide/index.html') }}" target="_blank">User Guide</a> |#}
{#    <a href="https://github.com/zhuifengshen/xmind2testcase/issues/new" target="_blank">Report Issue</a> |#}
{#    Powered by <a href="https://github.com/zhuifengshen/xmind2testcase" target="_blank">XMind2TestCase</a>#}
{#</div>#}
</body>
</html>

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/125867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集简云slack(自建)无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统

slack是一个工作效率管理平台&#xff0c;让每个人都能够使用无代码自动化和 AI 功能&#xff0c;还可以无缝连接搜索和知识共享&#xff0c;并确保团队保持联系和参与。在世界各地&#xff0c;Slack 不仅受到公司的信任&#xff0c;同时也是人们偏好使用的平台。 官网&#x…

生产级 React 框架介绍

文章目录 生产级 React 框架生产级 React 框架Next.jsRemixGatsbyExpo 如何选择生产级 React 框架 生产级 React 框架 React 是一个流行的 JavaScript 框架&#xff0c;用于构建用户界面。React 框架可以帮助你快速构建高质量的 React 应用&#xff0c;但并不是所有的 React 框…

什么是Web 3.0?

什么是Web 3.0&#xff1f;简而言之&#xff0c;就是第三代互联网。 在回答Web 3.0之前&#xff0c;让我们先看一下Web 1.0和Web 2.0。 互联网革命 Web 1.0&#xff0c;第一代互联网&#xff0c;从互联网诞生到1997年。 在Web 1.0&#xff0c;互联网的信息是静态的只读网页&a…

问题 C: 搬寝室(DP)

算法分析&#xff1a; 题目意思为求n个物品&#xff0c;拿k对使得消耗的体力最少&#xff0c; 或者说是这k对物品&#xff0c;每一对中两件物品的质量差平方最小&#xff0c; 所以要使得质量差的平方小&#xff0c;只能排序后取质量相邻两个物品作为一对&#xff1b; 现在设f…

如何用ChatGPT快速写出一份合格的PPT报告

我们【AI写稿专家】的小伙伴中有很多企业高管和公务员&#xff0c;大家经常有写报告写ppt的需求&#xff0c;下面小编给大家介绍一下我们新发布生成PPT的功能&#xff0c;很简单很方便&#xff0c;看完大家不到1分钟就能生成一份拿得出手的PPT报告&#xff0c;再也不用费尽心思…

【设计模式】第25节:行为型模式之“访问者模式”

一、简介 访问者模式允许一个或者多个操作应用到一组对象上&#xff0c;设计意图是解耦操作和对象本身&#xff0c;保持类职责单一、满足开闭原则以及应对代码的复杂性。 二、优点 分离操作和数据结构增加新操作更容易集中化操作 三、适用场景 数据结构稳定&#xff0c;操…

私有网络的安全保障,WorkPlus Meet内网视频会议助力企业高效会议

在企业内部沟通与协作中&#xff0c;视频会议成为了一种必不可少的沟通方式。然而&#xff0c;传统的互联网视频会议往往受制于网络不稳定因素&#xff0c;给企业带来不便与困扰。WorkPlus Meet作为一款专注内网视频会议的软件&#xff0c;致力于为企业打造高效、稳定的内网视频…

NLP实践——中文指代消解方案

NLP实践——中文指代消解方案 1. 参考项目2. 数据2.1 生成conll格式2.2 生成jsonline格式 3. 训练3.1 实例化模型3.2 读取数据3.3 评估方法3.4 训练方法 4. 推理5. 总结 1. 参考项目 关于指代消解任务&#xff0c;有很多开源的项目和工具可以借鉴&#xff0c;比如spacy的基础模…

KNN模型

使用K-Nearest Neighbors (KNN)算法进行分类。首先加载一个数据集&#xff0c;然后进行预处理&#xff0c;选择最佳的K值&#xff0c;并训练一个KNN模型。 # encodingutf-8 import numpy as np datas np.loadtxt(datingTestSet2.txt) # 加载数据集&#xff0c;返回一个numpy数…

html获取网络数据,列表展示 第二种

html获取网络数据&#xff0c;列表展示 第二种 js遍历json数组中的json对象 image.png || - 判断数据是否为空&#xff0c;为空就显示 - <!DOCTYPE html> <html><head><meta charset"utf-8"><title>网页列表</title><script …

Java作业一

编写程序实现如下界面效果&#xff1a; import java.util.Scanner;public class Test01 {public static void main(String[] args) {String name;Scanner input new Scanner(System.in);System.out.println("请输入您的姓名&#xff1a;");name input.nextLine();S…

R2R 的一些小tip

批次间控制器(Run-to-run Controller)&#xff0c;以应对高混合生产的挑战。将最优配方参数与各种工业特征相关联的模型是根据历史数据离线训练的。预测的最优配方参数在线用于调整工艺条件。 批次控制(R2R control)是一种先进的工艺控制技术&#xff0c;可在运行(如批次或晶圆…

HTML+CSS+JS实现计算器

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

KnowledgeGPT:利用检索和存储访问知识库上增强大型语言模型10.30

利用检索和存储访问知识库上增强大型语言模型 摘要引言2 相关研究3方法3.1 任务定义3.2 知识检索3.2.1 代码实现3.2.2 实体链接3.2.3 获取实体信息3.2.4 查找实体或值3.2.5 查找关系 3.3 知识存储 4 实验 摘要 大型语言模型&#xff08;LLM&#xff09;在自然语言处理领域展现…

不同源安装nginx

Nginx是一款高性能的Web服务器软件。在安装Nginx时&#xff0c;可以选择不同的安装源。 1.官方源&#xff1a;在官方网站下载Nginx的源代码&#xff0c;然后进行编译安装。 2.EPEL源&#xff1a;EPEL (Extra Packages for Enterprise Linux)源是针对Red Hat、CentOS、Scienti…

TestCenter测试管理工具

estCenter&#xff08;简称TC&#xff09;一款广受好评的测试管理工具&#xff0c;让测试工作更规范、更有效率&#xff0c;实现测试流程无纸化&#xff0c;测试数据资产化。 产品概述 TC流程图 产品功能 一、案例库 案例库集中化管理&#xff0c;支持对测试用例集中管理&…

[PHP]DBErp进销存系统 v1.1 RC 221101

DBErp系统&#xff0c;是北京珑大钜商科技有限公司 基于 Laminas doctrine 2 开发的一套进销存系统。 本系统运行环境要求&#xff1a; 服务器系统&#xff1a;Linux&#xff08;推荐&#xff09;、Unix、Windows Web服务软件&#xff1a;Apache&#xff08;推荐&#xff09;…

map和set的使用

序列式容器和关联性容器 首先序列式容器和我们之前学的线性表很相似&#xff0c;序列式容器的功能就只是单纯的储存数据。序列式容器例如&#xff1a;vactor/list/deque等等 而关联式容器则并不单纯的储存数据&#xff0c;数据之间式存在关联关系的&#xff0c;有了这个关联关…

【Redis】环境配置

环境配置 Linux版本&#xff1a; Ubuntu 22.04.2 LTS 下载redis sudo apt install redis 启动redis redis-server 输入redis-server启动redis竟然报错了&#xff0c;原因是redis已经启动&#xff0c;网上大多数的解决方案如下&#xff1a; ps -ef | grep -i redis 查询redi…

顺序表——leetcode

原地删除数据 我们的思路这里给的是双指针&#xff0c;给两个指针&#xff0c;从前往后移动&#xff0c;如果不是val就覆盖&#xff0c;如果是我就跳过&#xff0c;大家一定要看到我们的条件是原地修改&#xff0c;所以我们不能另开一个数组来实现我们这道题目。 这里我们给两…