测试用例从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阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容