最近接到一個領導需求,將xmind腦圖直接轉成可以導入的excel用例,並且轉換成gui可執行的exe文件,方便他人使用。
因為對Python比較熟悉,所以就想使用Python3來實現這個功能,先理一下思路,首先要將xmind轉換成Python可用的數據格式,正好找到了一個xmindparser庫可以做這個事情,然后就好辦了,用xlwt庫寫成xls文件,再用Python自帶的gui庫 tkinter來寫 gui界面,最后用pyinstaller來打包。
計划分兩個py文件來寫,一個文件寫excel ,一個文件寫gui界面,因為需要導入的字段比較多,而且導入的格式有嚴格的要求,所以寫excel的邏輯還是有點復雜的,所以我們確定xmind的文件有相應的格式來寫,測試編號 測試需求 測試用例標題 測試用例執行步驟 測試用例預期結果 測試用例預置條件都要按照相應的格式來。格式如圖
通過xmindparser解析出來的格式是這樣的,是Python的字典加列表的格式
從這里我們可以分析出來xmind的格式的兩個屬性是我們用的,title 和topics ,其中title是我們要的內容,topics是內容的個數,這里可以封裝兩個函數來用,代碼我貼出來,因為要求的xls格式不一樣
所以具體的邏輯還要具體的去寫,我是按照我們工具要求的excel格式來寫的,可以給大家參考一下,你們需要什么格式可以在write_excel函數里面調整邏輯.
下一篇再把tkinter設計的gui代碼以及如何用pyintaller打包成exe貼上來。注:以下代碼都是在Python3環境下的
1 from xmindparser import xmind_to_dict 2 import re 3 import xlwt 4 5 class xmind_to_xls(): 6 def xmind_num(self,value): 7 """獲取xmind標題個數""" 8 try: 9 return len(value['topics']) 10 except KeyError: 11 return 0 12 13 def xmind_title(self,value): 14 """獲取xmind標題內容""" 15 return value['title'] 16 17 def xmind_cat(self,filename): 18 '''調試函數,打印內容用的''' 19 self.out = xmind_to_dict(filename) 20 self.story = self.out[0]['topic']['topics'] 21 self.num=len(self.story) 22 print(self.out) 23 print(self.out[0]['topic']['title']) 24 return self.story,self.num 25 26 def write_excel(self,xmind_file,servicename='',editionname='',performer=''): 27 '''生成excel文件函數''' 28 self.f=xlwt.Workbook() 29 self.sheet1 =self.f.add_sheet('sheet1',cell_overwrite_ok=True) 30 self.row0 = ["storyid", '需求名稱', '測試用例名稱', '執行步驟', '預期結果', '服務名稱', '版本', '執行人員'] 31 #生成第一行 32 for i in range(0,len(self.row0)): 33 self.sheet1.write(0,i,self.row0[i]) 34 self.out = xmind_to_dict(xmind_file) 35 self.xls_name=self.out[0]['topic']['title'] 36 self.story = self.out[0]['topic']['topics'] 37 self.storynum = len(self.story) 38 j=1 #用例計算器 39 z = 0 # 用例結果數計數器 40 for i in range(0, self.storynum): 41 self.storyname = self.story[i]['title'] 42 print(self.storyname) 43 self.regex_str = ".*[\[【](.+?)[\]】].*" 44 self.storyid_reg = re.match(self.regex_str, self.storyname) 45 if self.storyid_reg: 46 self.storyid=self.storyid_reg.group(1)#正則取出用例編號 47 #print(self.storyid_reg.group(1)) 48 self.testcase_num=self.xmind_num(self.story[i]['topics'][0]) 49 for k in range(0,self.testcase_num): 50 self.testcase=self.story[i]['topics'][0]['topics'][k] 51 self.testcase_name =self.xmind_title(self.testcase) 52 self.testcase_stepnum=self.xmind_num(self.testcase) #每個用例的步驟數量 53 self.sheet1.write(k + i + z + j, 2, self.testcase_name) 54 self.sheet1.write(k + i + z + j, 0, self.storyid) 55 self.sheet1.write(k + i + z + j, 1, self.storyname) 56 self.sheet1.write(k + i + z + j, 5, servicename) 57 self.sheet1.write(k + i + z + j, 6, editionname) 58 self.sheet1.write(k + i + z + j, 7, performer) 59 for x in range(0,self.testcase_stepnum): 60 self.testcase_step=self.testcase['topics'][x] 61 self.teststep_title=self.xmind_title(self.testcase_step) #用例步驟名稱 62 self.teststep_num=self.xmind_num(self.testcase_step) #用例步驟個數 63 if self.teststep_num != 0: 64 for y in range(0,self.teststep_num): 65 self.test_results=self.testcase_step['topics'][y] 66 self.test_result=self.xmind_title(self.test_results)#用例結果 67 self.sheet1.write(k + i + z + j+y+1, 3, self.teststep_title) 68 self.sheet1.write(k + i + z + j + y+1, 4, self.test_result) 69 z = z + y+1 70 else: 71 self.test_result=' ' 72 self.sheet1.write(k + i + z + j+1 , 3, self.teststep_title) 73 self.sheet1.write(k + i + z + j+1 , 4, self.test_result) 74 z = z + 1 75 j=j+k 76 self.f.save(self.xls_name+'.xls') #xls名稱取xmind主題名稱 77 78 if __name__ == '__main__': 79 xmind_file = "C:\\Users\\Administrator\\Desktop\\版本測試.xmind" # xmind文件 80 servicename='aa' 81 editionname='bb' 82 performer='cc' 83 #xmind_to_xls().write_excel(xmind_file,servicename,editionname,performer) 84 xmind_to_xls().xmind_cat(xmind_file)