適用于Mac端的Testlink測試用例批量轉(zhuǎn)化工具

項(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,如圖:


用例集-設(shè)置

支持導(dǎo)入的文件類型

2.明確了支持導(dǎo)入的文件類型集歇,接下來就需要明確具體以怎樣的格式才能正確導(dǎo)入桶略。

我們點(diǎn)擊“查看支持文件格式”,查看官方給出的file-formats:


importAexport.png

可以看到,文檔中明確給出了可以導(dǎo)入和導(dǎo)出測試項(xiàng)目际歼、測試用例集惶翻、單個(gè)測試用例等等...我這里要做的就是導(dǎo)入測試用例集,先就Test suite進(jìn)行分析鹅心,其他類型的續(xù)簽可以類推...

這里有2種方式吕粗,一種帶keywords,一種不帶keywords旭愧,就拿帶keywords的來說:


suiteWkeywords.png

根元素必須是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:


用例模板.png

testlink導(dǎo)出的xml模板like this:
testlink導(dǎo)出的xml.png

這里面有很多是我不需要的卧惜,將之剔除,只保留關(guān)鍵的精華部分夹纫,整理了一下咽瓷,我需要的格式like this:


最終形式.png

這就是我最終要轉(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包:


dmg.png

添加到電腦應(yīng)用程序就可以雙擊使用啦~


1547799945753.jpg
選擇對(duì)話框.png

寫在最后,要做一個(gè)東西真不容易啊~
呼呼~完

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缩擂,一起剝皮案震驚了整個(gè)濱河市鼠冕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胯盯,老刑警劉巖懈费,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異博脑,居然都是意外死亡憎乙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門叉趣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泞边,“玉大人,你說我怎么就攤上這事疗杉≌笱瑁” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵乡数,是天一觀的道長椭蹄。 經(jīng)常有香客問我,道長净赴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任罩润,我火速辦了婚禮玖翅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己金度,他們只是感情好应媚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猜极,像睡著了一般中姜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跟伏,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天丢胚,我揣著相機(jī)與錄音,去河邊找鬼受扳。 笑死携龟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勘高。 我是一名探鬼主播峡蟋,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼华望!你這毒婦竟也來了蕊蝗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赖舟,失蹤者是張志新(化名)和其女友劉穎蓬戚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體建蹄,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碌更,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洞慎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痛单。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖劲腿,靈堂內(nèi)的尸體忽然破棺而出旭绒,到底是詐尸還是另有隱情,我是刑警寧澤焦人,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布挥吵,位于F島的核電站,受9級(jí)特大地震影響花椭,放射性物質(zhì)發(fā)生泄漏忽匈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一矿辽、第九天 我趴在偏房一處隱蔽的房頂上張望丹允。 院中可真熱鬧郭厌,春花似錦、人聲如沸雕蔽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽批狐。三九已至扇售,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚣艇,已是汗流浹背承冰。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓废,地道東北人巷懈。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像慌洪,于是被迫代替她去往敵國和親顶燕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容