当前位置:网站首页>TestLink Export Use Case Transformation Tool
TestLink Export Use Case Transformation Tool
2022-08-10 15:06:00 【zljun8210】
因工作需要将TestlinkThe use case is exported asExcel文件,It is realized after borrowing some code from the Internet.
功能为:从TestLinkAn exported use case or set of use cases,Convert to Excel文件,The interface displays each use case of the transformation,Count the number of use cases per transformation.
代码如下:
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
File Name: xml2xlsx.py
Author : 曾良均
QQ: 277099728
Date: 8/9/2022 8:49 AM
Description :
-------------------------------------------------
Change Activity:
-------------------------------------------------
"""
import os, base64
import time
import logging
import xml
from fav import img
import re
try:
from lxml import etree
except ImportError:
import xml.etree.cElementTree as etree
import tkinter
from tkinter import messagebox
from tkinter import filedialog
from tkinter import *
import xlwt
import xml.dom.minidom
t1 = []
root = None
# Get the current time,用于输出日志
fmt = time.strftime("%m/%d %H:%M:%S", time.localtime()) + '>> '
__author__ = {
'name': '曾良均',
'QQ': '277099728',
'Email': '[email protected]',
'Blog': 'https://blog.csdn.net/zljun8210',
'Created': '2017-07-03'}
# 设置logger配置
logging.basicConfig(level=logging.DEBUG,
encoding='utf-8',
format='%(asctime)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='./test.log',
filemode='w')
class Converter():
path = "./"
def __init__(self, rt):
if rt is None:
self.t = tkinter.Tk()
else:
self.t = tkinter.Toplevel(rt)
self.t.title("xml2xls转换器")
# 设置窗口图标
self.setIcon()
self.t.geometry('600x400')
self.lab_input = Label(self.t, font=("微软雅黑", 9, "bold"), text=" 源文件: ")
self.lab_input.place(x=2, y=20)
self.ent = Entry(self.t, bd=1)
self.ent.place(x=80, y=20, width=250)
self.btn = Button(self.t, font=("微软雅黑", 9, "bold"), text=" 打开 ", command=self.callback)
self.btn.place(x=350, y=20)
self.btn_exe1 = Button(self.t, font=("微软雅黑", 9, "bold"), text=" Conversion use case ", command=self.tcConvert)
self.btn_exe1.place(x=410, y=20)
self.btn_exe2 = Button(self.t, font=("微软雅黑", 9, "bold"), text=" Transform the use case set ", command=self.tcConverts)
self.btn_exe2.place(x=500, y=20)
self.lab_info = Label(self.t, fg='red', font=("微软雅黑", 7, "bold underline"), text="注意:Transform the use case set,因TestLinkExported two-level test case set,其xml文件最外层testsuite,must be changed manuallytestsuites")
self.lab_info.place(x=15, y=55)
self.st = Text(self.t, wrap='word')
self.st.place(x=5, y=80, width=560, height=260)
self.st.configure(state=tkinter.DISABLED)
sb = Scrollbar(self.st, orient=VERTICAL)
sb["command"] = self.st.yview()
self.st["yscrollcommand"] = sb.set
sb.pack(side=RIGHT, fill='both')
self.labinfo = Label(self.t, font=("微软雅黑", 7, "bold"), text=" Testlink软件之XML转Excel工具 \n 作者:曾良均 \n Ver: 0.1 (20220809) ")
self.labinfo.place(x=420, y=350)
def setIcon(self):
tmp = open("tmp.ico", "wb+")
tmp.write(base64.b64decode(img))
tmp.close()
self.t.iconbitmap("tmp.ico")
os.remove("tmp.ico")
# 选取文件路径
def callback(self):
self.ent.delete(0, END)
filepath = filedialog.askopenfilename()
if filepath:
self.ent.insert(0, filepath) # Add the selected path to entry里面
@staticmethod
def openfilename():
filename = filedialog.asksaveasfilename(filetypes=[("打开文件", "*.xml")])
if filename:
return open(filename, 'w', encoding='utf8')
# 转换测试用例
def tcConvert(self):
path = self.ent.get()
logging.debug('转换的XML文件为 ' + path)
self.st.configure(state=tkinter.NORMAL)
# Used to clear the text box content
self.st.insert(tkinter.END, '转换的XML文件为 ' + path + '\n')
tfn = path.split("/")[-1]
ofn = tfn.split(".")[0]
# print("文件名是: " + ofn)
self.st.insert(tkinter.END, 'The converted filename is : ' + ofn + '.xls')
self.st.see(tkinter.END)
logging.debug('转换后的文件名: ' + ofn + '.xls')
if path == "":
tkinter.messagebox.showinfo("Messages", "Please open the valid onexml文件!")
dom = xml.dom.minidom.parse(path)
# 写入excel中
workbook = xlwt.Workbook(encoding="utf-8")
# 创建sheet名称
booksheet = workbook.add_sheet(ofn)
# 设置excel宽度
booksheet.col(0).width = 5120
booksheet.col(1).width = 5120
booksheet.col(2).width = 5120
booksheet.col(3).width = 5120
booksheet.col(4).width = 5120
booksheet.col(5).width = 5120
borders = xlwt.Borders()
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
# Set the header file font format, etc
title = xlwt.easyxf(
u'font:name 仿宋,height 240 ,colour_index black, bold on, italic off; align: wrap on, vert centre, horiz center;pattern: pattern solid, fore_colour light_orange;')
# 设置写入文件的格式
style = xlwt.easyxf('align: wrap on,vert centre, horiz center')
if dom:
logging.debug(" ---- 开始转换 ---- ")
self.st.insert(tkinter.END, "\n ---- 开始转换 ---- \n" + '\n')
self.st.update()
# 设置excel字段
item = '模块/任务'
Subitem = '用例名称'
CaseTitle = '描述'
Condition = '前置条件'
actions = '操作步骤'
Result = '预期结果'
booksheet.write(0, 0, item, title)
booksheet.write(0, 1, Subitem, title)
booksheet.write(0, 2, CaseTitle, title)
booksheet.write(0, 3, Condition, title)
booksheet.write(0, 4, actions, title)
booksheet.write(0, 5, Result, title)
k = 0
try:
testcases_tag = dom.getElementsByTagName('testsuite')
fun = testcases_tag[0].getAttribute('name')
except:
testcases_tag = dom.getElementsByTagName('testcases')
fun = '功能测试' # There is no parent name at this time,Directly set as functional test
finally:
testcase_tag_ = testcases_tag[0].getElementsByTagName('testcase')
for j in range(len(testcase_tag_)):
step_tag_ = testcases_tag[0].getElementsByTagName('testcase')[j].getElementsByTagName('steps')[
0].getElementsByTagName('step')
# print(step_tag_)
for i in range(len(step_tag_)):
# kvalue increases upwards
k = k + 1
# 获取用例名称
try:
testcase_tag_name = testcases_tag[0].getElementsByTagName('testcase')[j].getAttribute('name')
# 写入excel中
logging.debug(f'第 {k} 条用例: {testcase_tag_name}')
self.st.insert(tkinter.END, fmt + f'第 {k} 条用例: {testcase_tag_name}' + '\n')
self.st.see(tkinter.END)
self.st.update()
except:
testcase_tag_name = ''
booksheet.write(k, 1, testcase_tag_name, style)
# Get the use case description
try:
testcase_tab_summary = \
testcases_tag[0].getElementsByTagName('testcase')[j].getElementsByTagName('summary')[
0].firstChild.data
testcase_tab_summary = re.sub(r'<(p|/br|br|/p|br/)*>', '\n', testcase_tab_summary)
except:
testcase_tab_summary = ''
booksheet.write(k, 2, testcase_tab_summary, style)
# 获取前置条件
try:
testcase_tag_preconditions = \
testcases_tag[0].getElementsByTagName('testcase')[j].getElementsByTagName('preconditions')[
0].firstChild.data
testcase_tag_preconditions = re.sub(r'<(p|/br|br|/p|br/)*>', '\n', testcase_tag_preconditions)
except:
testcase_tag_preconditions = ''
booksheet.write(k, 3, testcase_tag_preconditions, style)
# Get how-to steps
try:
step_number = \
testcases_tag[0].getElementsByTagName('testcase')[j].getElementsByTagName('steps')[
0].getElementsByTagName('step')[i].getElementsByTagName('step_number')[0].firstChild.data
except:
step_number = 0
# 进行替换
step_number = re.sub(r'<(p|/br|br|/p|br/)*>', '\n', step_number)
# Get the use case steps
try:
step = testcases_tag[0].getElementsByTagName('testcase')[j].getElementsByTagName('steps')[
0].getElementsByTagName('step')[i].getElementsByTagName('actions')[0].firstChild.data
step = re.sub(r'<(p|/br|br|/p|br/)*>', '\n', step)
except:
step = ''
# will get the file writtenexcel中
booksheet.write(k, 4, step, style)
booksheet.write(k, 0, fun, style)
# 获取预期结果
try:
expectedresults = \
testcases_tag[0].getElementsByTagName('testcase')[j].getElementsByTagName('steps')[
0].getElementsByTagName('step')[i].getElementsByTagName('expectedresults')[
0].firstChild.data
expectedresults = re.sub(r'<(p|/br|br|/p|br/)*>', '\n', expectedresults)
except:
expectedresults = ''
booksheet.write(k, 5, expectedresults, style)
# 保存至本地
pathlist = path.split("/")
pathlist.pop()
newpath = '/'.join(pathlist)
workbook.save('{}.xls'.format(newpath + "/" + ofn))
logging.debug('The test case conversion is complete!!\n')
logging.debug(f'Converted this time{k} 条用例\n\n')
self.st.insert(tkinter.END, '\n' + 'The test case conversion is complete!!' + '\n')
self.st.insert(tkinter.END, fmt + f'Converted this time{k} 条用例' + '\n\n')
self.st.see(tkinter.END)
self.st.update()
self.st.configure(state=tkinter.DISABLED)
tkinter.messagebox.showinfo("Messages", "Convert Successfully.\n Save file to " + ofn + ".xls .")
# Transform test case sets
def tcConverts(self):
path = self.ent.get()
logging.debug('转换的XML文件为 ' + path)
self.st.configure(state=tkinter.NORMAL)
# Used to clear the text box content
self.st.delete(1.0, tkinter.END)
self.st.insert(tkinter.END, '转换的XML文件为 ' + path + '\n')
tfn = path.split("/")[-1]
ofn = tfn.split(".")[0]
# print("文件名是: " + ofn)
self.st.insert(tkinter.END, 'The converted filename is : ' + ofn + '.xls')
self.st.see(tkinter.END)
logging.debug('转换后的文件名: ' + ofn + '.xls')
if path == "":
tkinter.messagebox.showinfo("Messages", "Please open the valid onexml文件!")
dom = xml.dom.minidom.parse(path)
# 写入excel中
workbook = xlwt.Workbook(encoding="utf-8")
# 创建sheet名称
booksheet = workbook.add_sheet(ofn)
# 设置excel宽度
booksheet.col(0).width = 5120
booksheet.col(1).width = 5120
booksheet.col(2).width = 5120
booksheet.col(3).width = 5120
booksheet.col(4).width = 5120
booksheet.col(5).width = 5120
borders = xlwt.Borders()
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
# Set the header file font format, etc
title = xlwt.easyxf(
u'font:name 仿宋,height 240 ,colour_index black, bold on, italic off; align: wrap on, vert centre, horiz center;pattern: pattern solid, fore_colour light_orange;')
# 设置写入文件的格式
style = xlwt.easyxf('align: wrap on,vert centre, horiz center')
if dom:
logging.debug(" ---- 开始转换 ---- ")
self.st.insert(tkinter.END, "\n ---- 开始转换 ---- \n" + '\n')
self.st.update()
# 设置excel字段
item = '模块/任务'
Subitem = '用例名称'
CaseTitle = '描述'
Condition = '前置条件'
actions = '操作步骤'
Result = '预期结果'
booksheet.write(0, 0, item, title)
booksheet.write(0, 1, Subitem, title)
booksheet.write(0, 2, CaseTitle, title)
booksheet.write(0, 3, Condition, title)
booksheet.write(0, 4, actions, title)
booksheet.write(0, 5, Result, title)
# TestLinkExported two-level test case set,其xml文件最外层testsuiteIt needs to be changed manuallytestsuites
try:
testsites_tag = dom.getElementsByTagName('testsuites')
try:
testcases_tag = testsites_tag[0].getElementsByTagName('testsuite')
except:
testcases_tag = testsites_tag[0].getElementsByTagName('testcases')
except:
tkinter.messagebox.showinfo("Messages", "XMLThe file outermost object is nottestsuites,Please modify and try again.")
else:
k = 0
for m in range(len(testcases_tag)):
testcase_tag_ = testcases_tag[m].getElementsByTagName('testcase')
fun = testcases_tag[m].getAttribute('name')
for j in range(len(testcase_tag_)):
step_tag_ = testcases_tag[m].getElementsByTagName('testcase')[j].getElementsByTagName('steps')[
0].getElementsByTagName('step')
# print(step_tag_)
for i in range(len(step_tag_)):
# kvalue increases upwards
k = k + 1
# 获取用例名称
try:
testcase_tag_name = testcases_tag[m].getElementsByTagName('testcase')[j].getAttribute('name')
# 写入excel中
logging.debug(f'第 {k} 条用例: {testcase_tag_name}')
self.st.insert(tkinter.END, fmt + f'第 {k} 条用例: {testcase_tag_name}' + '\n')
self.st.see(tkinter.END)
self.st.update()
except:
testcase_tag_name = ''
booksheet.write(k, 1, testcase_tag_name, style)
# Get the use case description
try:
testcase_tab_summary = \
testcases_tag[m].getElementsByTagName('testcase')[j].getElementsByTagName('summary')[
0].firstChild.data
testcase_tab_summary = re.sub(r'<(p|/br|br|/p|br/)*>', '\n', testcase_tab_summary)
except:
testcase_tab_summary = ''
booksheet.write(k, 2, testcase_tab_summary, style)
# 获取前置条件
try:
testcase_tag_preconditions = \
testcases_tag[m].getElementsByTagName('testcase')[j].getElementsByTagName('preconditions')[
0].firstChild.data
testcase_tag_preconditions = re.sub(r'<(p|/br|br|/p|br/)*>', '\n', testcase_tag_preconditions)
except:
testcase_tag_preconditions = ''
booksheet.write(k, 3, testcase_tag_preconditions, style)
# Get how-to steps
try:
step_number = \
testcases_tag[m].getElementsByTagName('testcase')[j].getElementsByTagName('steps')[
0].getElementsByTagName('step')[i].getElementsByTagName('step_number')[0].firstChild.data
except:
step_number = 0
# 进行替换
step_number = re.sub(r'<(p|/br|br|/p|br/)*>', '\n', step_number)
# Get the use case steps
try:
step = testcases_tag[m].getElementsByTagName('testcase')[j].getElementsByTagName('steps')[
0].getElementsByTagName('step')[i].getElementsByTagName('actions')[0].firstChild.data
step = re.sub(r'<(p|/br|br|/p|br/)*>', '\n', step)
except:
step = ''
# will get the file writtenexcel中
booksheet.write(k, 4, step, style)
booksheet.write(k, 0, fun, style)
# 获取预期结果
try:
expectedresults = \
testcases_tag[m].getElementsByTagName('testcase')[j].getElementsByTagName('steps')[
0].getElementsByTagName('step')[i].getElementsByTagName('expectedresults')[
0].firstChild.data
expectedresults = re.sub(r'<(p|/br|br|/p|br/)*>', '\n', expectedresults)
except:
expectedresults = ''
booksheet.write(k, 5, expectedresults, style)
# 保存至本地
pathlist = path.split("/")
pathlist.pop()
newpath = '/'.join(pathlist)
workbook.save('{}.xls'.format(newpath + "/" + ofn))
logging.debug('The test case conversion is complete!!\n')
logging.debug(f'Converted this time{k} 条用例\n\n')
self.st.insert(tkinter.END, '\n' + 'The test case conversion is complete!!' + '\n')
self.st.insert(tkinter.END, fmt + f'Converted this time{k} 条用例' + '\n\n')
self.st.see(tkinter.END)
self.st.update()
self.st.configure(state=tkinter.DISABLED)
tkinter.messagebox.showinfo("Messages", "Convert Successfully.\n Save file to " + ofn + ".xls .")
if __name__ == '__main__':
root = None
t1.append(Converter(root))
root = t1[0].t
root.mainloop()
关于icon即logo图标实现,代码如下:
#! encoding:utf-8
import base64
__author__ = {
'name': '曾良均',
'QQ': '277099728',
'Email': '[email protected]',
'Blog': 'https://blog.csdn.net/zljun8210',
'Created': '2017-07-03'}
open_icon = open("favicon.ico", "rb") # The icon file to put in
b64str = base64.b64encode(open_icon.read()) # 以Base64的格式读出
open_icon.close()
write_data = "img=%s" % b64str
f = open("fav.py", "w+")
f.write(write_data)
f.close()
边栏推荐
- Programmer = overtime??- Master the time to master the life
- 解题-->在线OJ(十九)
- PyTorch 多机多卡训练:DDP 实战与技巧
- 强意识 压责任 安全培训筑牢生产屏障
- Azure IoT Partner Technology Empowerment Workshop: IoT Dev Hack
- E. Cross Swapping(并查集变形/好题)
- 正则表达式(包含各种括号,echo,正则三剑客以及各种正则工具)
- C#实现访问OPC UA服务器
- JS入门到精通完整版
- Based on Azuki Series: NFT Valuation Analysis Framework "DRIC"
猜你喜欢
随机推荐
"NIO Cup" 2022 Nioke Summer Multi-School Training Camp 7
Epoll learn to think: a high performance server processing framework
兆骑科创创业赛事活动发布平台,创业赛事,项目路演
解题-->在线OJ(十九)
systemui状态栏添加新图标
systemui屏蔽通知栏
2022-08-10 Daily: Swin Transformer author Cao Yue joins Zhiyuan to carry out research on basic vision models
fatal error C1083 无法打开包括文件'io.h' No such file
TestLink导出用例转换工具
数字藏品平台系统开发实战
Websocket realizes real-time change of chart content
【有限元分析】异型密封圈计算泄漏量与参数化优化过程(带分析源文件)
SWIG Tutorial "One"
基于 Azuki 系列:NFT估值分析框架“DRIC”
兆骑科创高层次人才创业大赛平台,投融资对接,双创服务
BFT机器人带你走进智慧生活 ——探索遨博机器人i系列的多种应用
Mysql语句分析、存储引擎、索引优化等详情
Oracle数据库备份dmp文件太大,有什么办法可以在备份的时候拆分成多个dmp吗?
Alibaba的秒杀系统—千亿级并发设计手册上线了
公网IP和内网IP的区别[通俗易懂]