xmind用例数据上传至禅道

 xmind格式参考,只需要在一级子主题填写对应用例模块ID,其余格式随意即可生成用例并直接上传到禅道:

 代码里需填写禅道对应登录账号及用例所属产品

import requests
import json
import re
import hashlib
import pprint
import threading
from xmindparser import xmind_to_dictdef get_sub_topic(topic_data_list, k=0, row=None, result=None):'''遍历出所有数据'''if row is None:row = {}if result is None:result = []for topic_data in topic_data_list:# 获取下一行时,清除上一行针对当前索引后面的数据k_list = []for j in row:k_list.append(j)for j in k_list:if j > k:row.pop(j)# 赋值当前索引 标题row[k] = topic_data['title']if 'topics' in topic_data:get_sub_topic(topic_data['topics'], k=k + 1, row=row, result=result)else:result.append(row.copy())return resultdef get_xmind_data(xmind_file_path):data = xmind_to_dict(xmind_file_path)topics = data[0]['topic']['topics']result = get_sub_topic(topics)return resultdef get_max_length(data):length = 0for l in data:length = len(l) if len(l) > length else lengthreturn lengthdef get_length_first_name(length, data):for l in data:if length == len(l):if length > 4:return l[-4], length - 4else:return l[1], 1def get_case(title, data: list, index):row = []tag = -1for i, l in enumerate(data):if len(l) > index and l[index] == title:if tag == -1 or i == tag + 1:row.append(l)tag = ifor r in row:data.remove(r)return rowdef case_to_params(row: list, index: int):case = {}module: str = row[0][0]module_id = re.search('#\d+', module)if module_id is None:returnmodule_id = module_id.group()row[0][0] = module.replace(f'({module_id})', '').replace(f'({module_id})', '')case['module'] = module_id[1:]case['title'] = '-'.join(row[0][:index + 1])row = [r[index + 1:] for r in row]three = []group = {}for r in row:if len(r) == 3:three.append(r[0]) if r[0] not in three else ''for t in three:group[t] = []for r in row:if r[0] == t:group[t].append(r[1:])num = 1oo = []for o in row:if len(o)==0:continueif o[0] in three and o[0] not in oo:case[f'steps[{num}]'] = o[0]case[f'stepType[{num}]'] = 'group'j = 1pp = []for rr in group[o[0]]:num_key = f'{num}.{j}'if len(rr) == 1:case[f'steps[{num_key}]'] = rr[0]case[f'stepType[{num_key}]'] = 'item'case[f'expects[{num_key}]'] = ''j += 1elif len(rr) == 2:if rr[0] not in pp:case[f'steps[{num_key}]'] = rr[0]case[f'stepType[{num_key}]'] = 'item'case[f'expects[{num_key}]'] = rr[1]j += 1pp.append(rr[0])else:num_key = f'{num}.{j - 1}'case[f'expects[{num_key}]'] += f'\n{rr[1]}'oo.append(o[0])num += 1elif o[0] in three:continueelif len(o) == 1:case[f'steps[{num}]'] = o[0]case[f'stepType[{num}]'] = 'item'case[f'expects[{num}]'] = ''num += 1elif len(o) == 2:if o[0] not in oo:case[f'steps[{num}]'] = o[0]case[f'stepType[{num}]'] = 'step'case[f'expects[{num}]'] = o[1]num += 1oo.append(o[0])else:case[f'expects[{num - 1}]'] += f'\n{o[1]}'return casehost = 'https://rhjs.techgp.cn/'def md5update(args):input_name = hashlib.md5()input_name.update(args.encode("utf-8"))return input_name.hexdigest()class CaseUpload:@staticmethoddef __get_session():url = '{}/api-getsessionid.json'.format(host, )rj = requests.get(url)data = rj.json()['data']if isinstance(data, str):data = json.loads(data)return data['sessionID']def login(self, username, password):sid = self.__get_session()url = '{}/user-login.json?account={}&password={}&zentaosid={}'.format(host, username, password, sid)rj = requests.get(url)res = rj.json()if res['status'] == 'success':return {'sid': sid,'username': username,'password': md5update(password),'nickname': res['user']['realname'],'email': res['user']['email']}return Falsedef create_case(self, sid, product, payload):module = payload['module']form = {'product': str(product), 'type': 'feature', 'stage[]': '','story': '0', 'color': '', 'pri': '3', 'precondition': '','keywords': '', 'status': 'wait', 'labels[]': '', 'files[]': ''}url = f'{host}/zentao/testcase-create-{product}-0-{module}.json?zentaosid={sid}'form.update(payload)files = []response = requests.request("POST", url, data=form, files=files)print('response create', response.text)def main(xmind_file_path, product: str, account: dict, ):''':param xmind_file_path::param account: {'username':'xx.li','password':'123456'}:return:'''data = get_xmind_data(xmind_file_path)data = [[i for i in l.values()] for l in data]case_list = []while data:max_length = get_max_length(data)title, index = get_length_first_name(max_length, data)row = get_case(title, data, index)# print('row::',row)case = case_to_params(row, index)case_list.append(case)pprint.pprint(case_list)print(len(case_list))case_upload=CaseUpload()sid = case_upload.login(**account)['sid']tlist=[]for _case in case_list:t=threading.Thread(target=case_upload.create_case,args=(sid,product,_case))# case_upload.create_case(sid,product,_case)tlist.append(t)t.start()for t in tlist:t.join()if __name__ == '__main__':main('/Users/xx/Desktop/cases/大数据/数字化v1.1.1.xmind', '248',{'username': 'xx','password': 'xx'})

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

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

相关文章

认识相机

认识相机 在Threejs中相机的表示是THREE.Camera,它是相机的抽象基类,其子类有两种相机,分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera。类图如下所示: 透视投影相机(PerspectiveCam…

【项目实践】海康威视工业相机SDK开发小白版入门教程(VS2015+OpenCV4.5.1)

本文目录 前言怎么查找资料?数据手册例程 项目开发VS版本与OpenCV版本选择VS配置OpenCVVS添加MVS安装目录下的头文件和库VS项目开发 编程问题记录相机数据如何转换为OpenCV的Mat类型?函数不能修改全局指针变量?OpenCV运行报错“有未经处理的异…

Azure Kinect sdk 入门,简单使用深度相机

首先要安装azure Kinect dk传感器和人体跟踪的软件 先安装传感器:Azure-Kinect-Sensor-SDK/usage.md at develop microsoft/Azure-Kinect-Sensor-SDK GitHub 在这个网址里下载, 点击红笔画出来的地方,下载安装,记住安装路径&a…

入门级数码相机

为了满足不同层次顾客的购买要求,小编今天给大家交上一篇家用DC完全导购。从200万像素到800万像中间,分别选取了几款各级别中值得推荐的DC为大家推荐。在这里先给朋友们提一下目前数码相机市场相素与价位之间的简单联系。 目前,200万像素的数…

【计算机视觉-从入门到精通系列】 第二章 相机模型

2.1 针孔模型 计算机视觉是一门研究如何让计算机“看”世界的学科。人要看到世界需要眼睛,计算机要看到世界同样也需要“眼睛”,计算机的“眼睛”主要就是相机。实际应用中,相机的种类纷繁复杂,包括手机和平板电脑的相机&#xff…

5分钟入门Cinemachine智能相机系统

摘要:相机是Unity世界的眼睛,一个智能相机更是能帮咱们节省大把的时间和精力。Cinemachine现在已经大量应用到各种项目中,如果你还没有用过Cinemachine,墙裂建议你来体验一下。 你好,我是跟着大智学Unity的萌新&#x…

立体视觉入门指南(1):坐标系与相机参数

亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间。而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有…

camera学习入门指南

等待补充。 1.背景介绍 近年来,随着消费电子领域市场的快速增长,如安防、图像等领域,camera市场得到了快速发展。智能手机这几年以拍照作为主打卖点,带动了camera(CCM)出货。 具体可以看电子行业分析或者券…

机器视觉——入门基础(三)——相机镜头选型

目录 相机选型 分辨率、快门、帧率、色彩、靶面、接口 镜头选型 分辨率、靶面、焦距、接口、光圈畸变工作距离 常用计算示例 相机选型 分辨率、快门、帧率、色彩、靶面、接口 镜头选型 分辨率、靶面、焦距、接口、光圈畸变工作距离 常用计算示例 1. 面阵相机和镜头选型 已…

划重点!| 必须了解的工业相机入门级知识

工业相机是机器视觉系统的核心部件,其相关基础知识是行业内人员必须熟知的。那么分辨率、像素深度、行频、信噪比具体是指什么?CCD和CMOS又该如何去进行选择?今天我们就对这些内容进行一个简单的梳理,希望能够帮助大家了解更多。 …

机器视觉——入门基础(一)—— 相机篇

目录 一,相机就是CCD么? 二,像素。 三,像素直径。 四,CCD的大小。 五,快门速度。 六,增益。 七,1D相机(线扫描相机) 八,3D相机。 九&…

IP 协议的相关特性和数据链路层相关知识总结

目录 IP 协议的相关特性 一、IP协议的特性 二、 IP协议数据报格式 三、 IP协议的主要功能 1. 地址管理 动态分配 IP地址 NAT机制 NAT背景下的通信 IPV6 2. 路由控制​​​​​​​ 3.IP报文的分片与重组 数据链路层相关知识 1、以太网协议(Ethernet) 2.M…

掌握Python的X篇_28_python包管理工具pip命令

本篇将会介绍在实际使用python中最能节省效率的内容,利用第三方库拿来就用。 文章目录 1. pip命令是什么2. pip相关操作2.1 list2.2 install2.3 uninstall2.4 导出和导入2.4.1 freeze命令2.4.2 “-r” 3. 国内镜像4. Python Packges Index网站 1. pip命令是什么 p…

DiskGenius分区移动硬盘

打开DiskGenius 右键点击1T(实际显示是900多G)的移动硬盘,选择快速分区 分区个数按自己需要来选,卷标也按自己需要来修改,取消主分区的勾选框,因为是移动硬盘,不需要转操作系统,所以…

AUtoCAD Civil 3D-曲面-原始数据处理

Civil3D中,曲面是最重要的一个对象之一。曲面涉及到的知识点比较多,作为一个刚接触Civil3D的学习者,可能对于各种概念和各种概念之间的关系比较迷惑。这篇文章及梳理下曲面的一些重要的概念框架。 1、 曲面的分类 曲面可以分为四种类型&…

如何将卫星影像或者航拍影像叠加到CAD设计图上(Auto CAD版)

同步视频教程:卫星图像应用到AutoCAD工程设计(套合、叠加、配准)-Bigemap GIS Office 视频教程:如何选择中央子午线或者分度带 第一步 工具准备 BIGEMAP地图下载器:Bigemap系列产品-GIS行业基础软件kml\shp 相关教…

AutoCAD套合(叠加)卫星影像和矢量路网数据-CAD配准

BIGEMAP无偏移影像叠加配准(Auto CAD版) ​ 同步视频教程:http://www.iqiyi.com/w_19rubyfogh.html 专题地图制作视频教程:http://www.iqiyi.com/w_19rvlbep4l.html#vfrm16-1-1-1 下载:全国路网数据、全国水系矢量 …

cad图转成shp文件并把其平面坐标投影配准成大地坐标(配准针对没有底图的情况)

所需工具:arcmap,supermap(这里安装过程就不写了,网上一堆,自行搜搜吧。) 一、先将cad图转成shp文件 打开arcmap中,在图层中加入数据。 在arcmap中导入cad图后,选择需要的要素导出。比如,这里需要面要素,右击面要素,选择数据,点击导出数据。 选择将要导出shp文件…

history记录日期时间和日志记录操作

history命令能查看到操作日期和时间的配置方法: 1)在/etc/profile文件中添加一行: export HISTTIMEFORMAT"%F %T whoami " 2)保存后,执行加载命令: source /etc/profile 3)然后检…

ASP.NET Core - 缓存之分布式缓存

分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时。 与其他将缓存数据存储在单个应用服务器上的缓存方案相比&am…