項(xiàng)目背景
公司的測試用例采用Testlink進(jìn)行管理,項(xiàng)目組的成員習(xí)慣不同输虱,有些喜歡直接在testlink上寫case音念,有些又喜歡先在excel寫了再導(dǎo)入,公司已經(jīng)提供了一個(gè)用例轉(zhuǎn)化的工具者甲,不過是適用于windows的,現(xiàn)在都切換到mac辦公以后砌创,就沒法適用了虏缸,就想著自己寫一個(gè)吧,惠己及人纺铭,真拿這群孩子沒辦法(手動(dòng)攤手~)
需求分析
簡言之寇钉,就是:將excel寫的用例文件轉(zhuǎn)化成testlink支持上傳的格式文件,批量導(dǎo)入到testlink
需求肢解:
1.testlink支持上傳的文件類型是什么------XML
我們?cè)趖estlink上創(chuàng)建好項(xiàng)目計(jì)劃-版本后舶赔,新建一個(gè)測試用例集,點(diǎn)擊用例集的設(shè)置按鈕谦秧,有一些操作竟纳,其中一個(gè)叫“導(dǎo)入用例集”,點(diǎn)擊導(dǎo)入用例集疚鲤,進(jìn)入到的頁面锥累,可以看到可選的導(dǎo)入文件類型為XML,如圖:
2.明確了支持導(dǎo)入的文件類型集歇,接下來就需要明確具體以怎樣的格式才能正確導(dǎo)入桶略。
我們點(diǎn)擊“查看支持文件格式”,查看官方給出的file-formats:
可以看到,文檔中明確給出了可以導(dǎo)入和導(dǎo)出測試項(xiàng)目际歼、測試用例集惶翻、單個(gè)測試用例等等...我這里要做的就是導(dǎo)入測試用例集,先就Test suite進(jìn)行分析鹅心,其他類型的續(xù)簽可以類推...
這里有2種方式吕粗,一種帶keywords,一種不帶keywords旭愧,就拿帶keywords的來說:
根元素必須是testsuite颅筋,它標(biāo)識(shí)這是一個(gè)測試用例集,每對(duì)testcase子元素代表一條測試用例case输枯,每個(gè)case包含子元素:summary描述议泵、steps操作步驟、expectedresults預(yù)期結(jié)果桃熄、keywords關(guān)鍵詞等肢簿。由于官方文檔維護(hù)記錄最近只到10年,這個(gè)應(yīng)該是比較老的結(jié)構(gòu)了蜻拨,我在做的時(shí)候遇到了些坑池充,按著搞了半天都不對(duì),最后直接簡單粗暴現(xiàn)在testlink上創(chuàng)建一個(gè)用例集缎讼,內(nèi)建幾條case收夸,然后再導(dǎo)出來對(duì)它的xml格式進(jìn)行分析,拿到我想要的形式血崭。嗯...我的excel用例模板like this:
testlink導(dǎo)出的xml模板like this:
這里面有很多是我不需要的卧惜,將之剔除,只保留關(guān)鍵的精華部分夹纫,整理了一下咽瓷,我需要的格式like this:
這就是我最終要轉(zhuǎn)化成的格式~
明確了要實(shí)現(xiàn)什么,接下來就是怎么實(shí)現(xiàn)的問題了~
實(shí)現(xiàn)
解決一個(gè)問題的方法有千萬種舰讹,每種都有各自的優(yōu)缺點(diǎn)茅姜,關(guān)鍵是看你想怎么做,具體問題具體分析月匣,這里我語言選擇python(暫時(shí)只會(huì)這個(gè)和shell哈哈~)钻洒。
要用到的庫:
1.操作excel,讀取數(shù)據(jù):xlrd
2.處理xml:python內(nèi)置的xml模塊
3.我要如何提供友好的交互性供團(tuán)隊(duì)成員使用锄开?這里用到:Tkinter素标。支持本地選擇文件
簡單粗暴,上代碼:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import xlrd
from xml.dom.minidom import Document
import Tkinter,tkFileDialog
import os
class excel_to_xml():
def __init__(self):
pass
def get_filepath(self):
"""
提供文件選擇對(duì)話框萍悴,從本地選擇要轉(zhuǎn)化的excel文件头遭,返回文件路徑
"""
root = Tkinter.Tk()
root.withdraw()
filepath = tkFileDialog.askopenfilename()
return filepath
def read_excel(self,path):
"""
讀取excel內(nèi)容寓免,返回所有用例值
"""
# 打開文件
file = xlrd.open_workbook(path)
# 獲取第一個(gè)sheet(按索引)
sheet1 = file.sheet_by_index(0)
# 獲取行數(shù)和列數(shù)
nrows = sheet1.nrows
ncols = sheet1.ncols
print nrows,ncols
# 獲取單元格內(nèi)容
nclosvalue = []
for j in range(1,nrows):
nrowsvalue = []
for i in range(ncols):
cellvalue = sheet1.cell(j,i)
nrowsvalue.append(cellvalue)
i +=1
nclosvalue.append(nrowsvalue)
j += 1
return nclosvalue
def to_xml(self):
"""
處理數(shù)據(jù),轉(zhuǎn)化成xml格式计维,并將文件保存在用例同路徑下
"""
path1 = self.get_filepath()
doc = Document() # 創(chuàng)建DOM文檔對(duì)象
testcases = doc.createElement('testcases')
doc.appendChild(testcases)
excle_results = self.read_excel(path1)
print(len(excle_results))
for i in range(len(excle_results)):
print"第"+str(i+1)+"個(gè)用例為:\n"
print(excle_results[i])
testcase = doc.createElement('testcase')
testcase.setAttribute('name', "%s" % excle_results[i][0].value)
testcases.appendChild(testcase)
summary = doc.createElement('summary')
summary_text = doc.createTextNode('%s' % excle_results[i][1].value)
summary.appendChild(summary_text)
testcase.appendChild(summary)
steps = doc.createElement('steps')
testcase.appendChild(steps)
step = doc.createElement('step')
steps.appendChild(step)
step_number = doc.createElement('step_number')
step_number_text = doc.createTextNode('1')
step_number.appendChild(step_number_text)
step.appendChild(step_number)
actions = doc.createElement('actions')
actions_text = doc.createTextNode('%s' % excle_results[i][2].value)
actions.appendChild(actions_text)
step.appendChild(actions)
expectedresults = doc.createElement('expectedresults')
expectedresults_text = doc.createTextNode('%s' % excle_results[i][3].value)
expectedresults.appendChild(expectedresults_text)
step.appendChild(expectedresults)
i += 1
# 要生成的xml文件名
xml_name = path1.strip().split('.')[0] + '.xml'
# 要生成的xml文件到目錄(絕對(duì)路徑)
dir = path1.strip().split('/')[-2]
xml_dir = os.path.join(('%s') % dir,xml_name)
try:
f = open(xml_dir,'w')
doc.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')
f.close()
except:
print("您沒有選擇任何文件袜香!")
change = excel_to_xml()
change.to_xml()
最后,要以怎樣的形式供團(tuán)隊(duì)成員使用享潜?
扔給成員一個(gè)腳本困鸥?可以,但是需要成員也配置環(huán)境剑按、安裝庫疾就,操作麻煩;
這里我選擇打包成一個(gè)mac端的dmg應(yīng)用程序艺蝴,成員只需雙擊即可從本地文件選擇要轉(zhuǎn)化的文件猬腰。方法有很多,這里不贅述猜敢,我用的py2app姑荷,打包后生產(chǎn)dmg包:
添加到電腦應(yīng)用程序就可以雙擊使用啦~
寫在最后,要做一個(gè)東西真不容易啊~
呼呼~完