当前位置:网站首页>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()
边栏推荐
猜你喜欢
随机推荐
Understanding_Data_Types_in_Go
阿里五位MySQL封神大佬耗17个月总结出53章性能优化法则
Parallels 将扩展桌面平台产品,以进一步改善在 Mac 上运行 Windows 的用户体验和工作效率
微信小程序,自定义输入框与导航胶囊对其
2022-08-10 Daily: Swin Transformer author Cao Yue joins Zhiyuan to carry out research on basic vision models
小程序-语音播报功能
C#实现访问OPC UA服务器
Epoll learn to think: a high performance server processing framework
JS 从零手写实现一个bind方法
SWIG教程《一》
systemui屏蔽通知栏
从全球价值链视角看,京东云数智供应链对未来经济有何影响?
第五讲 测试技术与用例设计
SWIG tutorial "two"
file system design
fatal error C1083 Unable to open include file 'io.h' No such file
It is reported that the original Meitu executive joined Weilai mobile phone, the top product may exceed 7,000 yuan
How does vue clear the tab switching cache problem?
正则表达式(包含各种括号,echo,正则三剑客以及各种正则工具)
Pagoda panel open Redis to specify the network machine