xmind2testcase使用与二次开发

news2024/12/23 10:52:32

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 = False
    return font


def border():
    '''
    设置边框
    :return:
    '''
    border = xlwt.Borders()
    border.left = 1
    border.right = 1
    border.top = 1
    border.bottom = 1
    return border


def backcolor():
    '''
    设置背景色
    :return:
    '''
    backcolor = xlwt.Pattern()
    backcolor.pattern = xlwt.Pattern.SOLID_PATTERN
    backcolor.pattern_fore_colour = 21
    return backcolor


def style():
    '''
    设置不同样式
    :return:
    '''
    # 设置第一行样式
    alignment0 = xlwt.Alignment()
    alignment0.horz = 0x02
    alignment0.vert = 0x01
    style0 = xlwt.XFStyle()
    style0.alignment = alignment0
    style0.borders = border()
    style0.font = font()
    style0.pattern = backcolor()

    # 用例编码、模块样式
    alignment1 = xlwt.Alignment()
    alignment1.horz = 0x02
    alignment1.vert = 0x01
    style1 = xlwt.XFStyle()
    style1.alignment = alignment1

    # 测试用例名称样式
    alignment2 = xlwt.Alignment()
    alignment2.horz = 0x01
    alignment2.vert = 0x01
    alignment2.wrap = 1
    style2 = xlwt.XFStyle()
    style2.alignment = alignment2

    # 操作步骤样式
    alignment3 = xlwt.Alignment()
    alignment3.horz = 0x01
    alignment3.vert = 0x01
    alignment3.wrap = 1  # 单元格内自动换行
    style3 = xlwt.XFStyle()
    style3.alignment = alignment3
    style3.alignment.wrap = 1  # 单元格有换行符时换行

    # 预期结果样式
    alignment4 = xlwt.Alignment()
    alignment4.horz = 0x01
    alignment4.vert = 0x01
    alignment4.wrap = 1
    style4 = xlwt.XFStyle()
    style4.alignment = alignment4

    return style0, style1, style2, style3, style4


class 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)
                continue
            branch = branches['topics']
            # 无限循环调用方法,遍历他的全部分支
            self.infinite_for(branch, strvar, case_list, n)
        # 根据传参重写路径
        # else:
        #     strvar = strvar

    def 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_name
        else:
            print('文件格式不对或文件不存在!')

    def write_excel(self, filename):
        '''生成excel文件函数'''

        global li_var

        styles = 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 * 256
        self.worksheet.set_panes_frozen('1')  # 设置冻结为真
        self.worksheet.set_horz_split_pos(1)  # 水平冻结第一行
        self.worksheet.set_vert_split_pos(2)  # 垂直冻结第一列

        # 开始解析xmind并写入excel
        self.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 = 1
            for a_var in case_list:
                l_var = a_var.split('/#')[:-1]
                print(l_var)
                if len(l_var) < 3:
                    # print('格式不符合要求')
                    continue
                elif 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 += 1

            self.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 os


def read_xmind(filename):
    '''
    读取xmind文件
    :param filename: xmind文件名
    '''
    if filename.endswith('.xmind') and os.path.exists(filename):
        xmind = xmind_to_dict(filename)
        return xmind
    else:
        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)
            continue
        branch = branches['topics']
        # 无限循环调用方法,遍历他的全部分支
        infinite_for(branch, strvar, TestCase_lise, n)
    # return TestCase_lise


def 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_lise


if __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 = 0
    for 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.coloradmin.cn/o/1153227.html

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

相关文章

医院能耗管控平台,医院节能降耗的有效利器

随着人们对医院舒适度要求的不断提升&#xff0c;医院采用新技术及信息化建设等手段来提升服务&#xff0c;导致能源使用效率高&#xff0c;医院能耗管控平台可以帮助医院在运行的基础上&#xff0c;促进医院节能降耗等工作。 医院目前存在的问题 1、医院人口密度大、用能系统…

2023年05月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 运行以下程序&#xff0c;如果通过键盘先后输入的数是1和3&#xff0c;输出的结果是&#xff1f;&#xff08; &#x…

springweb flux拦截请求获取参数和方法做接口签名防重放校验

在给spring webflux做接口签名、防重放的时候&#xff0c;往往需要获取请求参数&#xff0c;请求方法等&#xff0c;而spring webflux无法像spring mvc那样好获取&#xff0c;这里根据之前的实践特地说明一下&#xff1a; 总体思路&#xff1a; 1、利用过滤器&#xff0c;从原…

Yuhan Blu-ray DVD Creator for Mac: 打造专属的高清视听盛宴

在如今的高清时代&#xff0c;谁能拒绝一款能够轻松将高清影片刻录成蓝光DVD的刻录机呢&#xff1f;而Yuhan Blu-ray DVD Creator for Mac正是这样一款令人惊艳的软件。 作为一款专为Mac用户打造的蓝光DVD刻录机&#xff0c;Yuhan Blu-ray DVD Creator for Mac支持将各种高清视…

涛思数据与胜软科技达成战略合作,共同赋能石油行业数字化转型

近日&#xff0c;北京涛思数据科技有限公司&#xff08;以下简称“涛思数据”&#xff09;与山东胜软科技股份有限公司&#xff08;以下简称“胜软科技”&#xff09;于山东东营签署战略合作协议。双方围绕石油行业数字化转型趋势&#xff0c;合力打造石油行业数字化转型解决方…

设计模式_观察者模式

观察者模式 介绍 设计模式定义案例问题堆积在哪里解决办法观察者是行为型设计模式 多个对象 观察 1个对象小强考试完 成绩公布了 家长/同学得知成绩后 做出不同反应一个一个通知很麻烦 先通知谁 也有讲究的 信息发布方 抽象出一个信息管理类 负责管理监听者 类图 代码 Obse…

【Apache Flink】Flink DataStream API的基本使用

Flink DataStream API的基本使用 文章目录 前言1. 基本使用方法2. 核心示例代码3. 完成工程代码pom.xmlWordCountExample测试验证 4. Stream 执行环境5. 参考文档 前言 Flink DataStream API主要用于处理无界和有界数据流 。 无界数据流是一个持续生成数据的数据源&#xff0…

如何理解 Spring Boot 中的 Starter?

Starter 是 Spring Boot 的四大核心功能特性之一&#xff0c;除此之外,Spring Boot 还有自动装配、Actuator 监控等特性。Spring Boot 里面的这些特性&#xff0c;都是为了让开发者在开发基于 Spring 生态下的企业级应用时&#xff0c;只需要关心业务逻辑&#xff0c;减少对配置…

初识FFmpeg

前言 无意间见到群里的小伙伴展示视频工具。功能比较多&#xff0c;包括视频编码修改&#xff0c;画质处理&#xff0c;比例处理、名称提取&#xff0c;剪辑、标题拆解。因此开始了FFmpeg学习。以下摘自百度百科的解释。 FFmpeg是一套可以用来记录、转换数字音频、视频&#xf…

【LVS实战】02 搭建一个LVS-NAT实验

一、网络结构 用虚拟机搭建如下的几台机器&#xff0c;并配置如下的ip 关于虚拟机网卡和网络的配置&#xff0c;可以参考 iptables章节&#xff0c;05节&#xff1a;网络转发实验 主机A模拟外网的机器 B为负载均衡的机器 C和D为 RealServer 二、C和D主机的网关设置 C和D机…

vue项目引入elementui样式组件05

vue前端开发&#xff0c;关于样式部分&#xff0c;不需要自己去写&#xff0c;可以引用现有的一些组件&#xff0c;比如elemtnui&#xff0c;可官网查看 1、下载对应的包到vue项目中 通过npm进行安装 npm i element-ui -S2、引入到项目中&#xff0c;官网也提供了例子 3、运…

Shopee流量和销量不佳?或许你没有掌握正确的引流方法

很多卖家做了很久&#xff0c;但是发现流量和销量都没怎么增长&#xff0c;今天陈哥就分享一下如何正确的引流。 以下是一些有效的引流策略&#xff1a; 1. 站内引流&#xff1a;选择高性价比的潮流商品&#xff0c;根据目标客户群和重点品类进行选品。优化商品名称和描述&am…

顺序表练习

顺序表练习 图解插入与删除&#xff0c;详见相关内容&#xff1a;顺序存储结构的插入与删除 //顺序表的定义、创建、插入、删除、查找 //定义&#xff1a;结构体中数组、表长 //创建:输入元素&#xff0c;表长 //插入&#xff1a;判断表是否已满、判断位序合法性 //插入位序k…

好用的视频下载工具推荐

我不允许还有人不知道这款视频下载工具, 真的太好用了! &#xff01;! 随着视频行业的崛起&#xff0c;如今网络上各种各样的视频层出不穷, 那我们看到喜欢的视频该如何下载呢&#xff1f;今天小编来给大家分享一款非常实用的视频下载工具——Downni, 它兼容国内外大多数视频网…

网络编程服务端与客户端存在的端口问题

服务端的窗口不能再次使用的原因如下&#xff1a; 服务器端的窗口不能再次使用的原因可能有以下几点&#xff1a; 1. 窗口已经关闭&#xff1a;如果服务器端的窗口已经被关闭&#xff0c;那么就无法再次使用。关闭窗口后&#xff0c;服务器会释放相关资源&#xff0c;包括与该…

深度学习入门(二)之神经网络

文章目录 从感知机到神经网络神经网络的例子复习感知机激活函数 激活函数sigmoid函数阶跃函数的实现阶跃函数的图形sigmoid函数的图形sigmoid函数与阶跃函数比较非线性函数ReLU函数 多维数组的运算多维数组矩阵乘法神经网络的内积 三层神经网络的实现符号确认各层间信号传递的实…

视频剪辑达人教您:如何运用嵌套合并技巧制作固定片尾

在视频剪辑的过程中&#xff0c;嵌套合并技巧是一种非常实用的技术&#xff0c;可以帮助您将多个素材叠加在一起&#xff0c;制作出更加丰富多彩的视频。本文将由视频剪辑达人为您详细介绍如何运用云炫AI智剪嵌套合并技巧制作固定片尾&#xff0c;让您的视频剪辑水平更上一层楼…

场景交易额超40亿,海尔智家三翼鸟开始收获

文 | 螳螂观察 作者 | 余一 随着双十一的到来&#xff0c;国内的消费情绪再次被点燃。在这类大促之下&#xff0c;品牌们就像一个个天体&#xff0c;不断引动着市场潮汐&#xff0c;期待自己能触发更大的“海潮效应”。 所谓“海潮效应”是指&#xff0c;海水因天体的引力而…

总结之数据分析工具cube.js通过Docker部署

cube.js介绍 官网地址&#xff1a;https://cube.dev/ Cube.js是一个开源的模块化框架&#xff0c;用于构建分析web应用程序。它主要用于构建内部业务智能工具或向现有应用程序添加面向客户的分析。 Cube.js设计用于无服务器查询引擎&#xff0c;如AWS Athena和谷歌BigQuery。…

一张动图告诉你,输入网址之后,发生了什么事情?

让我们一步一步地来看这个过程。 步骤1&#xff1a; 用户在浏览器中输入一个URL&#xff08;比如www.bytebytego.com&#xff09;&#xff0c;然后按下回车键。首先&#xff0c;我们需要将这个URL转换成一个IP地址。通常&#xff0c;这个映射关系会被存储在缓存中&#xff0…