《自拍教程65》Python Testlink用例导出工具xml2excel
时间:2020-05-14
本文章向大家介绍《自拍教程65》Python Testlink用例导出工具xml2excel,主要包括《自拍教程65》Python Testlink用例导出工具xml2excel使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
案例故事: 接上两篇:Python Testlink用例导入工具excel2xml
有导入,肯定有导出,很不凑巧,只支持Xml格式的用例导出。
我们需要把Xml格式的测试用例再转换成Excel版的测试用例,以方便阅读。
准备阶段
- 操作Xml的模块,我建议首选ElementTree, 本次用官方自动的ElementTree即可
- 操作Excel的模块,一直首选openpyxl
Python面向对象类形式
由于本案例涉及的代码有些许难度,且相对较长,
直接以面向对象类的形式来进行建模及程序设计。
建模:先设想有这么一个空白的世界,这个世界需要哪些类型的事物(名词)。
我们需要两个类,一个是ExcelParser类用于解析Excel获取Excel数据,
一个是XMLWriter类,用于将以上获取的Excel数据写入Xml文件里去。
# coding=utf-8
import os
import re
import shutil
from openpyxl import Workbook
from openpyxl.styles import Alignment
from xml.etree.ElementTree import ElementTree
class XmlReader():
'''读取XML文件并获得所有的各用例的详细字段'''
def __init__(self, xml_file):
self.xml_file = xml_file
self.all_case_list = []
self.tree = ElementTree()
self.tree.parse(self.xml_file)
self.xmlroot = self.tree.getroot()
def parse_xml(self):
'''解析并最终把所有数据写到self.all_case_lit'''
if self.xmlroot.tag == "testcases":
for node_1 in list(self.xmlroot):
if (node_1.tag == "testcase"):
temp_casedict = {}
temp_casedict["summary"] = node_1.attrib["name"]
for node_2 in list(node_1):
if (node_2.tag == "steps"):
action_list = []
result_list = []
action_count = 1
result_count = 1
for node_3 in node_2.iter():
if (node_3.tag == "actions"):
try:
action_list.append("Step" + str(action_count) + ":" + self.data_format(
node_3.text) + "\n")
except:
action_list.append( "Step" + str(action_count) + ":" + "" + "\n")
action_count = action_count + 1
if (node_3.tag == "expectedresults"):
try:
result_list.append("Result" + str(result_count) + ":" + self.data_format(
node_3.text) + "\n")
except:
result_list.append("Result" + str(result_count) + ":" + "" + "\n")
result_count = result_count + 1
action_liststr = "".join(action_list)
result_list_str = "".join(result_list)
temp_casedict["step"] = action_liststr
temp_casedict["expectResult"] = result_list_str
elif (node_2.tag == "preconditions"):
temp_casedict[node_2.tag] = self.data_format_fummary_precondition(node_2.text)
elif (node_2.tag == "execution_type"):
if (node_2.text == "1"):
temp_casedict[node_2.tag] = u"手动"
elif (node_2.text == "2"):
temp_casedict[node_2.tag] = u"自动"
elif (node_2.tag == "importance"):
if (node_2.text == "1"):
temp_casedict[node_2.tag] = "Low"
elif (node_2.text == "2"):
temp_casedict[node_2.tag] = "Medium"
elif (node_2.text == "3"):
temp_casedict[node_2.tag] = "High"
elif (node_2.tag == "keywords"):
for node_3 in node_2.iter():
if (node_3.tag == "keyword"):
temp_casedict[node_2.tag] = node_3.attrib["name"]
else:
pass
self.all_case_list.append(temp_casedict)
return self.all_case_list
def data_format(self, inputdata):
'''过滤掉(删掉)一些不必要的html的字符'''
inputdata = inputdata.strip()
inputdata = inputdata.replace('<p>', '').replace('</p>', '').replace('\n', '').replace('\t', '').replace(
'</div>', ''). \
replace('<div>', '').replace(' ', ' ').replace('>', ''). \
replace('<br />', '').replace("“", "", ).replace("”", "")
return inputdata
def data_format_fummary_precondition(self, inputdata):
'''过滤掉(删掉)一些不必要的html的字符'''
if inputdata != None:
inputdata = inputdata.strip()
inputdata = inputdata.replace('<p>', '').replace('</p>', '').replace('\n', '').replace('\t', '').replace(
'</div>', ''). \
replace('<div>', '').replace(' ', ' ').replace('>', '').replace('<br />', '')
else:
inputdata = ""
return inputdata
class ExcelWriter():
'''Get XML Cases and Generate Excel Cases'''
def __init__(self, all_case_list):
self.all_case_list = all_case_list
self.wb = Workbook()
def write_excel(self, save_path):
ws = self.wb.active
alignment = Alignment(horizontal="left", vertical="top", wrap_text=True)
ws.alignment = alignment
first_row = ["用例标题", "预置条件", "执行方式", "优先级", "测试步骤", "预期结果", "关键字"]
ws.append(first_row)
for case in self.all_case_list:
temp_row = [(case["summary"]), case["preconditions"], case["execution_type"], case["importance"],
case["step"],
case["expectResult"]]
if "keywords" in case:
temp_row.append(case["keywords"])
ws.append(temp_row)
self.wb.save(save_path)
if __name__ == '__main__':
curpath = os.getcwd()
xml_dir = os.path.join(curpath, "XML_Input") # 输入文件夹
xml_list = os.listdir(xml_dir)
output_dir = os.path.join(curpath, "Excel_Output") # 输出文件夹
try:
shutil.rmtree(output_dir)
except:
pass
if not os.path.exists(output_dir):
os.mkdir(output_dir)
for each_xml in xml_list:
print("*" * 60)
print("正在处理%s" % each_xml)
print("*" * 60)
xml_name, posfix = os.path.splitext(each_xml)
exch_xml_path = "%s%s%s" % (xml_dir, os.sep, each_xml)
x_obj = XmlReader(exch_xml_path)
all_case_list = x_obj.parse_xml()
e_obj = ExcelWriter(all_case_list)
excel_save_path = "%s%s%s.xlsx" % (output_dir, os.sep, xml_name)
e_obj.write_excel(excel_save_path)
print("XML转Excel完毕并保存到了 %s" % excel_save_path)
本案例素材下载
包括:导出来的测试用例xml,Python脚本
跳转到官网下载本素材
武散人出品,请放心下载!
运行方式与效果视频
更多更好的原创文章,请访问官方网站:www.zipython.com
自拍教程(自动化测试Python教程,武散人编著)
原文链接:https://www.zipython.com/#/detail?id=2e0f9c3c677045b1b2e9e81891db9387
也可关注“武散人”微信订阅号,随时接受文章推送。
原文地址:https://www.cnblogs.com/zipython/p/12887007.html
- MySQL高可用架构-MMM环境部署记录
- Silverlight之ListBox/Style学习笔记--ListBox版的图片轮换广告
- MySQL高可用架构-MHA环境部署记录
- 分布式监控系统Zabbix-3.0.3-完整安装记录 - 添加shell脚本监控
- Flash/Flex学习笔记(52):使用TweenLite
- 设计一个界面,很简单!
- 配置Quartz.net Cluster以及远程管理
- [原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
- Flash/Flex学习笔记(49):3D基础
- Flash/Flex学习笔记(51):3维旋转与透视变换(PerspectiveProjection)
- Linux系统批量化安装部署之Cobbler
- 解决JQuery中的ready函数冲突
- 关于监视容器我们了解的5件事
- C#检测SqlServer中某张表是否存在
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 算法:滑动窗口(二)
- Flutter基础widgets教程-LinearProgressIndicator篇
- Flutter基础widgets教程-ListTile篇
- 深入剖析 linux GCC 4.4 的 STL String
- Flutter基础widgets教程-MaterialApp篇
- 如何使用Visual Studio Code开发Django项目
- Flutter基础widgets教程-Padding篇
- Flutter基础widgets教程-Placeholder篇
- Flutter基础widgets教程-PopupMenuButton篇
- Python部署rad+xray自动化
- 2.建立第一个django项目与配置
- Flutter基础widgets教程-Radio篇
- Django中的QuerySet
- Python—requests模块详解
- python爬虫伪装请求头---fake-useragent