測試用例從xmind格式轉為Excel

背景

由于習慣使用xmind梳理test point,但有些場景描述較長且不是每個人都安裝xmind,為了方便于是寫了個xmind轉Excel格式的Python腳本。

效果

xmind層級關系
xmind格式test point.png
轉為Excel樣式
summary.png
Test point1.png

Test point2.png

腳本代碼及解釋

  1. 主要使用到xmindparser, json, xlwt這三個依賴包,思路是解釋xmind文件得到一個json, 然后解釋json對象,并寫入到Excel文件。
  2. 實際使用中可根據需要調整樣式或者需要的列,獻上源碼
# coding=utf-8
import time

from xmindparser import xmind_to_dict
import json
import xlwt


def writerows(worksheet):
    sizes = [15, 20, 40, 50, 70, 70, 8, 8, 8, 10, 20]
    columns = ["No.", 'Test title', 'Description', 'Prerequisite', 'Test step', 'Expect result',
               'Level', 'Type', 'Result', 'Tracker', 'Comment']  # 寫成excel表格用例的要素
    for col in range(len(columns)):
        worksheet.write(1, col, columns[col], title_styles())
        widths(worksheet, col, size=sizes[col])
    heights(worksheet, 1, 2)


def title_styles():
    """設置單元格標題樣式的基礎方法"""
    style = xlwt.XFStyle()
    style.pattern = patterns(46)
    style.font = fonts('Times New Roman', True)
    style.borders = borders()
    dicts = {"horz": "CENTER", "vert": "CENTER"}
    style.alignment = alignments(**dicts)
    style.borders = borders()
    return style


def normalstyles():
    """設置單元格標題樣式的基礎方法"""
    style = xlwt.XFStyle()
    style.font = fonts('Arial', False, False, False, "black", 10)
    style.borders = borders()
    dicts = {"horz": "LEFT", "vert": "CENTER"}
    style.alignment = alignments(**dicts)
    style.borders = borders()
    return style


def borders(status=1):
    """設置單元格的邊框
    細實線:1,小粗實線:2,細虛線:3,中細虛線:4,大粗實線:5,雙線:6,細點虛線:7大粗虛線:8,細點劃線:9,粗點劃線:10,細雙點劃線:11,粗雙點劃線:12,斜點劃線:13"""
    border = xlwt.Borders()
    border.left = status
    border.right = status
    border.top = status
    border.bottom = status
    return border


def heights(worksheet, line, size=4):
    """設置單元格的高度"""
    worksheet.row(line).height_mismatch = True
    worksheet.row(line).height = size * 256


def widths(worksheet, line, size=11):
    """設置單元格的寬度"""
    worksheet.col(line).width = size * 256


def alignments(**kwargs):
    """設置單元格的對齊方式
    status有兩種:horz(水平),vert(垂直)
    horz中的direction常用的有:CENTER(居中),DISTRIBUTED(兩端),GENERAL,CENTER_ACROSS_SEL(分散),RIGHT(右邊),LEFT(左邊)
    vert中的direction常用的有:CENTER(居中),DISTRIBUTED(兩端),BOTTOM(下方),TOP(上方)"""
    alignment = xlwt.Alignment()

    if "horz" in kwargs.keys():
        alignment.horz = eval(f"xlwt.Alignment.HORZ_{kwargs['horz'].upper()}")
    if "vert" in kwargs.keys():
        alignment.vert = eval(f"xlwt.Alignment.VERT_{kwargs['vert'].upper()}")
    alignment.wrap = 1  # 設置自動換行
    return alignment


def fonts(name='Times New Roman', bold=False, underline=False, italic=False, colour='black', height=11):
    """設置單元格中字體的樣式
    默認字體為宋體,不加粗,沒有下劃線,不是斜體,黑色字體"""
    font = xlwt.Font()
    # 字體
    font.name = name
    # 加粗
    font.bold = bold
    # 下劃線
    font.underline = underline
    # 斜體
    font.italic = italic
    # 顏色
    font.colour_index = xlwt.Style.colour_map[colour]
    # 大小
    font.height = 20 * height
    return font


def patterns(colors=19):
    """設置單元格的背景顏色,該數字表示的顏色在xlwt庫的其他方法中也適用,默認顏色為白色
    0 = Black, 1 = White,2 = Red, 3 = Green, 4 = Blue,5 = Yellow, 6 = Magenta, 7 = Cyan,
    16 = Maroon, 17 = Dark Green,18 = Dark Blue, 19 = Dark Yellow ,almost brown), 20 = Dark Magenta,
    21 = Teal, 22 = Light Gray,23 = Dark Gray, the list goes on..."""
    pattern = xlwt.Pattern()
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
    pattern.pattern_fore_colour = colors
    return pattern


def main(xmind_file):
    xm = xmind_to_dict(xmind_file)[0]['topic']
    # indent is format json, ensure_ascii not show Chinese, not show ASCII code
    print(json.dumps(xm, indent=2, ensure_ascii=False))
    workbook = xlwt.Workbook(encoding='utf-8')  # 創建workbook對象
    # Add Summary
    summary_sheet = workbook.add_sheet("Summary")
    widths(summary_sheet, 0, 30)
    summary_sheet.write(0, 0, "Test Point List", title_styles())
    for i in range(len(xm["topics"])):
        test_suit = xm["topics"][i]
        summary_sheet.write(i + 1, 0, str(i + 1).__add__(". ").__add__(test_suit["title"]), normalstyles())
        worksheet = workbook.add_sheet(test_suit["title"], cell_overwrite_ok=True)  # 創建工作表,并設置可以重寫單元格內容
        worksheet.write(0, 0, "Comment", title_styles())
        worksheet.write_merge(0, 0, 1, 5, test_suit["note"])
        heights(worksheet, 0, 3)
        writerows(worksheet)
        x = 2  # 寫入數據的當前行數
        for j in range(len(test_suit["topics"])):
            test_point_title = test_suit["topics"][j]
            for k in range(len(test_point_title["topics"])):
                test_prerequisite = test_point_title["topics"][k]
                for n in range(len(test_prerequisite["topics"])):
                    test_step = test_prerequisite["topics"][n]
                    for m in range(len(test_step["topics"])):
                        test_except = test_step["topics"][m]
                        for q in range(len(test_except["topics"])):
                            test_type_and_tracker = test_except["topics"][q]
                            worksheet.write(x, 0, x - 1, normalstyles())  # No.
                            worksheet.write(x, 1, test_point_title["title"], normalstyles())  # 執行title
                            worksheet.write(x, 2, test_point_title["note"], normalstyles())  # 執行prerequisite
                            worksheet.write(x, 3, test_prerequisite["title"], normalstyles())  # 執行prerequisite
                            worksheet.write(x, 4, test_step["title"], normalstyles())  # 執行步驟
                            worksheet.write(x, 5, test_except["title"], normalstyles())  # 預期結果
                            level = "High"
                            if test_point_title["makers"][0] == "priority-2":
                                level = "Medium"
                            if test_point_title["makers"][0] == "priority-3":
                                level = "Low"
                            worksheet.write(x, 6, level, normalstyles())  # Level
                            # testtype = "UT"
                            # if test_point_title["makers"][1] == "tag-orange":
                            #     level = "CT"
                            # if test_point_title["makers"][1] == "tag-dark-blue":
                            #     level = "FT"
                            # if test_point_title["makers"][1] == "tag-green":
                            #     level = "MT"
                            # testtype = "UT"
                            # if test_type_and_tracker["makers"][1] == "tag-orange":
                            # #     level = "CT"
                            # if test_point_title["makers"][1] == "tag-dark-blue":
                            #     level = "FT"
                            # if test_point_title["makers"][1] == "tag-green":
                            #     level = "MT"
                            optype = test_type_and_tracker["title"].split(":", 1)[0]
                            worksheet.write(x, 7, optype, normalstyles())  # Type
                            worksheet.write(x, 8, "", normalstyles())  # Result
                            worksheet.write(x, 9, "", normalstyles())  # Tracker
                            worksheet.write(x, 10, "", normalstyles())  # Comment
                            x += 1
                            # time.sleep(1)
                            print(x)
                            # print(test_point_title)

    workbook.save(xm["title"] + ".xls")  # xls名稱取xmind主題名稱


if __name__ == "__main__":
    main("../testPointFile/TestPointSample.xmind")

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容