把Testlink的case导出转成excel,或把excel导入Testlink

这个脚本作用:

1:从testlinkexport  testsuite,下载的是xml格式的case文件。

2:用Read_xml_to_csv这个函数 转成csv格式,这个格式excel可以打开编辑case

3:编辑好的csv文件再用read_csv_to_xml这个函数转换回xml格式。

4:然后testlink上用import导入这个xml文件了。

注意:

我们在excel里面编辑的时候,不要添加或删除表格,只能改内容。


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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# -*- coding=gbk -*-
import  sys  
reload (sys)  
sys.setdefaultencoding( 'gbk' )   
import  csv
from  xml.etree.ElementTree  import  iterparse
import  xml.etree.ElementTree as ET
from  HTMLParser  import  HTMLParser
class  XML_CSV():
     #去掉xml文件中的HTML标签
     def  strip_tags( self ,htmlStr):
         htmlStr  =  htmlStr.strip()
         htmlStr  =  htmlStr.strip( "\n" )
         result  =  []
         parser  =  HTMLParser()
         parser.handle_data  =  result.append
         parser.feed(htmlStr)
         parser.close()
         return   ''.join(result)
      
     def  read_xml_to_csv( self ,csv_file,xmlfile):  
         csvfile  =  open (csv_file,  'wb' )
         spamwriter  =  csv.writer(csvfile, dialect = 'excel' )
         spamwriter.writerow([ 'tag' 'name' 'node_order' 'details' 'internalid' , 'externalid' , 'summary' , 'steps' , 'expectedresults' ])
         #逐行解析XML文件,将每行的内容存入列表,之后逐行写入CSV文件中
         for  (event,node)  in  iterparse(xmlfile,events = [ 'start' ]):
             if  node.tag  = =  "testsuite" :
                 suite_list  =  [' ',' ',' ',' ',' ',' ',' ',' ',' ']
                 print  node.attrib[ 'name' ]
                 suite_list[ 0 =  node.attrib[ 'name' ]
                 for  child  in  node:
                     if  child.tag  = =  "node_order" :
                         print  child.text
                         suite_list[ 2 =  child.text
                     if  child.tag  = =  "details" :
                         print  child.text
                         suite_list[ 3 =  self .strip_tags( str (child.text))
                 spamwriter.writerow(suite_list)
             if  node.tag  = =  "testcase" :
                 case_list  =  [ 'testcase' ,' ',' ',' ',' ',' ',' ',' ',' ']
                 print  node.attrib[ 'internalid' ]
                 print  node.attrib[ 'name' ]
                 case_list[ 1 =  node.attrib[ 'name' ]
                 case_list[ 4 =  node.attrib[ 'internalid' ]
                 for  child  in  node:
                     if  child.tag  = =  "node_order" :
                         print  child.text
                         case_list[ 2 =  child.text
                     if  child.tag  = =  "externalid" :
                         print  child.text
                         case_list[ 5 =  child.text
                     if  child.tag  = =  "summary" :
                         print  self .strip_tags( str (child.text))
                         case_list[ 6 =  self .strip_tags( str (child.text))
                     if  child.tag  = =  "steps" :
                         print  self .strip_tags( str (child.text))
                         case_list[ 7 =  self .strip_tags( str (child.text))
                     if  child.tag  = =  "expectedresults" :
                         #print child.text
                         print  self .strip_tags( str (child.text))
                         case_list[ 8 =  self .strip_tags( str (child.text))
                 spamwriter.writerow(case_list)
         csvfile.close()
     
     def  read_csv_to_xml( self ,csv_file,xmlfile):
         #逐行读取CSV文件的内容,将内容写进以internalid为键,name,sumary,steps,expectresult为值得字典
         csv_file  =  file (csv_file, 'rb' )
         reader  =  csv.reader(csv_file)  
         case_dic  =  {}  
         for  line  in  reader:  
             if  reader.line_num  = =  1 :  
                 continue  
             if  line[ 0 = =  "testcase" :
                 name  =  str (line[ 1 ])
                 internalid  =  str (line[ 4 ])
                 summary  =  line[ 6 ]
                 steps  =  line[ 7 ]
                 expectedresults  =  line[ 8 ]
                 case_dic[internalid]  =  (name,summary,steps,expectedresults)
         csv_file.close()
         print  case_dic
         #用ElementTree方法打开xml文件,逐行解析XML文件,发现case为tag的行,就将name,sumary,steps,expectresult,这几项用字典的值替换。
         tree  =  ET.ElementTree()
         tree.parse(xmlfile)
         root  =  tree.getroot()
         root_suite_name  =  root.attrib[ 'name' ]
         
         for  node  in  tree. iter ():
             if  node.tag  = =  "testsuite" :
                 print  node.attrib[ 'name' ]
                 sub_suite_name  =  node.attrib[ 'name' ]
                 if  sub_suite_name  = =  root_suite_name:
                     sub_suite_name  =  ""
                 for  child  in  node:
                     if  child.tag  = =  "node_order" :
                         #print child.text
                         pass
                     if  child.tag  = =  "details" :
                         pass
             if  node.tag  = =  "testcase" :
                 new_internalid  =  node.attrib[ 'internalid' ]
                 #将根目录和子目录的名字都写进了case名字中。如果不需要可以用下面那行注释掉的替换这一行
                 node.attrib[ 'name' =  root_suite_name + '_' + sub_suite_name + '_' + case_dic[new_internalid][ 0 ]
                 #node.attrib['name'] = case_dic[new_internalid][0]
                 print  node.attrib[ 'name' ]
                 #解析tag为testcase的节点的子节点,并修改节点的值
                 for  child  in  node:
                     if  child.tag  = =  "node_order" :
                         pass
                     if  child.tag  = =  "externalid" :
                         pass
                     if  child.tag  = =  "summary" :
                         child.text  =  case_dic[new_internalid][ 1 ]
                         child.text  =  str (child.text.replace( '\n' , "<p>" ))
                     if  child.tag  = =  "steps" :
                         child.text  =  str (case_dic[new_internalid][ 2 ])
                         child.text  =  str (child.text.replace( '\n' , "<p>" ))
                     if  child.tag  = =  "expectedresults" :
                         child.text  =  case_dic[new_internalid][ 3 ]
                         child.text  =  str (child.text.replace( '\n' , "<p>" ))
         #将修改后的ElementTree对象写入xml文件中。
         tree.write(xmlfile,encoding = 'utf8' )   
if  __name__  = =  "__main__" :
     test  =  XML_CSV()
     #test.read_xml_to_csv('testsuites2.csv','testsuites.xml')
     test.read_csv_to_xml( 'testsuites2.csv' , 'testsuites.xml' )

猜你喜欢

转载自blog.csdn.net/daocaoren1543169565/article/details/80881300
今日推荐