最近在使用Testlink时,发现导入的用例是xml格式,且没有合适的工具转成excel格式,xml使用excel打开显示的东西也太多,网上也有相关工具转成csv格式的,结果也不合人意。
那求人不如尔己,自己写一个吧
需要用到的模块有:xml.dom.minidom(python自带)、xlwt
使用版本:
python:2.7.5
xlwt:1.0.0
一、先分析Testlink XML格式:
这是一个有两级testusuit的典型的testlink用例结构,我们只需要取testsuite name,testcase name,preconditions,actions,expectedresults
二、程序如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
#coding:utf-8
'''
Created on 2015-8-20
@author: Administrator
'''
'''
'''
import xml.etree.cElementTree as ET
import xml.dom.minidom as xx
import os,xlwt,datetime
workbook = xlwt.Workbook(encoding = "utf-8" )
#
booksheet = workbook.add_sheet(u 'sheet_1' )
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
dom = xx.parse(r 'D:\\Python27\test.xml' )
root = dom.documentElement
row = 1
col = 1
borders = xlwt.Borders()
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
style = xlwt.easyxf( 'align: wrap on,vert centre, horiz center' ) #自动换行、水平居中、垂直居中
#设置标题的格式,字体方宋、加粗、背景色:菊黄
#测试项的标题
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;' )
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)
#冻结首行
booksheet.panes_frozen = True
booksheet.horz_split_pos = 1
#一级目录
for i in root.childNodes:
testsuite = i.getAttribute( 'name' ).strip()
#print testsuite
#print testsuite
'''
写测试项
'''
print "row is :" ,row
booksheet.write(row,col,testsuite,style)
#二级目录
for dd in i.childNodes:
print " %s" % dd.getAttribute( 'name' )
testsuite2 = dd.getAttribute( 'name' )
if not dd.getElementsByTagName( 'testcase' ):
print "Testcase is %s" % testsuite2
row = row + 1
booksheet.write(row, 2 ,testsuite2,style) #写测试分项
row = row + 1
booksheet.write(row, 1 ,testsuite2,style)
itemlist = dd.getElementsByTagName( 'testcase' )
for subb in itemlist:
#print " %s" % subb.getAttribute('name')
testcase = subb.getAttribute( 'name' )
row = row + 1
booksheet.write(row, 2 ,testcase,style)
ilist = subb.getElementsByTagName( 'preconditions' )
for ii in ilist:
preconditions = ii.firstChild.data.replace( "<br />" , " " )
col = col + 1
booksheet.write(row, 3 ,preconditions,style)
steplist = subb.getElementsByTagName( 'actions' )
#print steplist
for step in steplist:
actions = step.firstChild.data.replace( "<br />" , " " )
col = col + 1
booksheet.write(row, 4 ,actions,style)
#print "测试步骤:",steplist[0].firstChild.data.replace("<br />"," ")
expectlist = subb.getElementsByTagName( 'expectedresults' )
for expect in expectlist:
result = expect.childNodes[ 0 ].nodeValue.replace( "<br />" ,"" )
booksheet.write(row, 5 ,result,style)
row = row + 1
workbook.save( 'demo.xls' )
|
写入excel的效果如下:
我们再来看个实例:
需要下载一个module:xlwt,如下是source code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
import xml.dom.minidom
import xlwt
import sys
col = 0
row = 0
def handle_xml_report(xml_report, excel):
problems = xml_report.getElementsByTagName( "problem" )
handle_problems(problems, excel)
def handle_problems(problems, excel):
for problem in problems:
handle_problem(problem, excel)
def handle_problem(problem, excel):
global row
global col
code = problem.getElementsByTagName( "code" )
file = problem.getElementsByTagName( "file" )
line = problem.getElementsByTagName( "line" )
message = problem.getElementsByTagName( "message" )
for node in code:
excel.write(row, col, node.firstChild.data)
col = col + 1
for node in file :
excel.write(row, col, node.firstChild.data)
col = col + 1 for node in line:
excel.write(row, col, node.firstChild.data)
col = col + 1 for node in message:
excel.write(row, col, node.firstChild.data)
col = col + 1
row = row + 1
col = 0
if __name__ = = '__main__' :
if ( len (sys.argv) < = 1 ):
print ( "usage: xml2xls src_file [dst_file]" )
exit( 0 )
#the 1st argument is XML report ; the 2nd is XLS report
if ( len (sys.argv) = = 2 ):
xls_report = sys.argv[ 1 ][: - 3 ] + 'xls'
#if there are more than 2 arguments, only the 1st & 2nd make sense
else :
xls_report = sys.argv[ 2 ]
xmldoc = xml.dom.minidom.parse(sys.argv[ 1 ])
wb = xlwt.Workbook()
ws = wb.add_sheet( 'MOLint' )
ws.write(row, col, 'Error Code' )
col = col + 1
ws.write(row, col, 'file' )
col = col + 1
ws.write(row, col, 'line' )
col = col + 1
ws.write(row, col, 'Description' )
row = row + 1
col = 0
handle_xml_report(xmldoc, ws)
wb.save(xls_report)
|