将testlink导出的xml格式用例转化为Excel

前言

        项目交付需要提交文档,其中要求提供测试用例的文档,但是TestLink只能导出为xml格式(ps,可能是我们公司的testlink太老-_-),不可能直接交付一个xml格式文件给领导吧。2000多条用例也不可能手工改写。最后求助python脚本,使用脚本来转换格式。

需求分析

  • 需要解析xml格式文件
  • 存为Excel格式文件
  • Testlink导出的xml文件对多段文字、特殊符号使用了html格式转义,需要反向解析

准备

  1. 安装python3.6
  2. 安装xlwt模块用于写入Excel文件

行动

1.解析html文件,使用python包html.parser.HTMLParser

从导出来的xml文件中发现步骤的字符串是如下格式

 zzzzz。


yyyy;


xxxxxx。 

 

我们期望。转化为
zzzzz。
yyyy;
xxxxxx。
粗略分析,testlink导出的多段文字、特殊符号只使用了标签和html转义字符,所以代码如下
from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.a = list()#由于一次会有多个html标签,所以我们用列表存储标签中的值
    def handle_starttag(self, tag, attrs):
        pass

    def handle_endtag(self, tag):
        pass

    def handle_data(self, data):
        text = data.strip()
        if len(text) > 0:
            self.a.append(text)
    def text(self):
        return ''.join(self.a)#返回一次解析后的字符串

2.将一个测试用例看成一个类,使用类来管理一个测试用例的属性,在写入Excel的时候使用这个类传递属性方便写入

class EXCELP(object):
    def __init__(self):
        pass
        self.__title_1 = 'N/A'
        self.__title_2 = 'N/A'
        self.__title_3 = 'N/A'
        self.__title_4 = 'N/A'
        self.__title_5 = 'N/A'
        self.__casetitle = 'N/A'
        self.__preconditions = 'N/A'
        self.__actions = 'N/A'
        self.__excepted = 'N/A'
        self.__importance = 'N/A'
    def set_title_1(self,value):
        self.__title_1 = value
    def set_title_2(self,value):
        self.__title_2 = value
    def set_title_3(self,value):
        self.__title_3 = value
    def set_title_4(self,value):
        self.__title_4 = value
    def set_title_5(self,value):
        self.__title_5 = value
    def set_casetitle(self,value):
        self.__casetitle = value
    def set_preconditions(self,value):
        self.__preconditions = value
    def set_actions(self,value):
        self.__actions = value
    def set_excepted(self,value):
        self.__excepted = value
    def set_importance(self,value):
        self.__importance = value

    def returnall(self):
        return self.__title_1,self.__title_2,self.__title_3,self.__title_4,self.__title_5,self.__casetitle,self.__preconditions,self.__actions,self.__excepted,self.__importance.

3.使用xml.etree.ElementTree解析xml文件
Testlink从跟目录导出的xml文件
默认的xml结构是类似下面结构的,每个测试集都是一个testsuite,testsuite下面可能会有多个testsuite,然后才是testcase,所以我们可以使用getroot()方法获取根元素,再通过遍历子元素(getchildren()方法)的方式逐步解析到最后testcase元素,再从testcase元素解析出测试用例的属性(前置条件、步骤、期望结果等)。


部分代码如下:

el = xml.etree.ElementTree.parse('his.xml')#加载解析的xml文件
p = el.getroot()#获取根元素对象
for suite in p.getchildren():
    if suite.tag == 'testsuite':#判断子元素的元素名tag是否是testsuite,如果是继续解析
        EP.set_title_1((suite.attrib)['name'])#通过测试用例属性管理类复制这次解析的测试用例的一级目录名称
        for x in suite.getchildren():#继续解析子元素
            if z.tag == 'testcase':#判断解析到测试用例元素
                EP.set_title_4(q[6].text)#通过测试用例属性管理类进行赋值
		EP.set_preconditions(formate_precondition(q[4].text))#当解析的属性包含html元素时调用formate_precondition方法进行html元素转换
def formate_precondition(g):
    try:
        actions_parser = MyHTMLParser()
        actions_parser.feed(g)
        actions_parser.close()
        text = actions_parser.text()
        return text
    except:
        return 'N/A'



4.写入Excel

#构建了写入方法,避免重复写入多次代码
def writesheet(rows,sheet,p):
    for i,v in enumerate(p):
        sheet.write(rows,i,v)

wb = xlwt.Workbook(encoding='GBK')
ws = wb.add_sheet('Sheet1')
writesheet(rows, ws, EP.returnall())#使用测试用例属性管理类的retrunall方法返回所有测试用例属性,写入

至此测试用例转换工作基本完成,需要注意的是如果测试用例书写不规范,比如目录层级太多,步骤、期望结构某些值为空,在解析时都有可能引起失败,这个时候需要在代码里面适当增加try---except来避免解析失败时整个测试用例没有获取到或者写入空值。如果有存在疑问或者文中错误、或是有更好的方法,欢迎留言、私信。


你可能感兴趣的:(python,testlink,xml,excel)