通用技术 测试用例转换,excel 转 word

Violet_yoo · 2024年01月22日 · 最后由 ZaZing 回复于 2024年01月30日 · 6018 次阅读

最近把之前写的测试用例转换代码拿出来优化了一波,感觉日常使用基本没什么问题了,所以准备拿出来分享一波

产生缘由

这个脚本的是用来把 excel 写的测试用例转换为 word 格式,我们是用在项目验收中,通常我们写用例还是在 excel 中,但是验收的时候必须要求 word 文件,如果没有这个脚本的话,需要花费大量的人力去复制粘贴用例,费时费力,所以准备写一个脚本用来自动转换,省却无用的重复工作

项目结构

代码结构

exword.py 文件即为所用脚本,整个代码共分为六个可执行函数,分别为:get_sheet、generate_word_file、add_table_to_document_up、add_table_to_document_center、add_table_to_document_down、excel_to_docx,下面分别介绍六个函数的功能以及部分主要代码展示

  • get_sheet:通过输入 excel 工作表名称,获取工作表内容,返回 datas,数据结构为列表嵌套字典
def get_sheet(sheet_name):
    sheet = book.sheet_by_name(sheet_name)
    nrows = sheet.nrows  # 行数
    ncols = sheet.ncols  # 列数
    datas = []  # 存放数据
    keys = sheet.row_values(0)  # 第一行标题

    for row in range(1, nrows):
        data = {}  # 每一行数据
        for col in range(0, ncols):
            value = str(sheet.cell_value(row, col))  # 取出每一个单元格的数据
            # 替换特殊字符
            value = value.replace('<', '').replace('>', '').replace('$', '')
            data[keys[col]] = value

        # 截取第一行元素
        arrs = [value for value in data.values()]
        # 通过测试用例编号分组,用的很少
        first = arrs[0]
        # 通过二级模块分组,常用
        second = arrs[2]
        # 通过功能点名称分组,常用
        third = arrs[4]

        data['first'] = first
        data['second'] = second
        data['third'] = third

        datas.append(data)

    logger.info('excel文件内容获取成功!!')
    return datas
  • generate_word_file:初始化 word 文档,返回一个 word 对象

  • add_table_to_document_up:在 word 对象中组装列表的上部分,这里所说的上部分指的是需求编号到前置条件这六部分,这六部分是固定不变的,因此单独拿出来作为列表的上部分,此方法需要依赖于 word 对象和填充的数据,传入 doc 和 data_table,返回 doc, doc_table, data_table

def add_table_to_document_up(doc, data_table):
    # 表格上段
    # 新增表格 7行4列
    doc_table = doc.add_table(rows=7, cols=4)
    doc_table.style = "Table Grid"
    doc_table.style.font.size = Pt(12)
    doc_table.style.font.name = '宋体'

    # 合并单元格 赋值
    merge_cells = [
        (0, 1, 0, 3),
        (1, 1, 1, 3),
        (2, 1, 2, 3),
        (3, 1, 3, 3),
        (4, 1, 4, 3),
        (5, 1, 5, 3)
    ]

    cell_texts = [
        ('需求编号', '暂无'),
        ('用例编号', data_table[0]['用例编号']),
        ('用例名称', f"对{data_table[0]['一级模块']}所有功能点进行用例编写"),
        ('用例说明', data_table[0]['用例描述']),
        ('测试内容', f"验证{data_table[0]['一级模块']}模块中所有功能"),
        ('前置条件', data_table[0]['前置条件'])
    ]

    for row_start, col_start, row_end, col_end in merge_cells:
        doc_table.cell(row_start, col_start).merge(doc_table.cell(row_end, col_end))

    for i, (label, text) in enumerate(cell_texts):
        doc_table.rows[i].cells[0].text = label
        doc_table.rows[i].cells[1].text = text
    return doc, doc_table, data_table
  • add_table_to_document_center:在 word 对象中组装列表的中部,这里所说的中部指的是用例体部分,因为这部分不确定每个功能有多少用例,所以这部分是活动的,将这部分单独拿出来作为表格的中部,此方法需要依赖于 word 对象、表格对象和填充的数据,传入 doc, doc_table, data_table,返回 doc, doc_table, data_table
def add_table_to_document_center(doc, doc_table, data_table):
    # 表格中段
    # 设置标题
    head_cells = doc_table.rows[6].cells
    head_cells[0].text = '序号'
    head_cells[1].text = '测试步骤'
    head_cells[2].text = '预期结果'
    head_cells[3].text = '实际结果'
    # 第1 列水平居中,并设置行高,所有单元格内容垂直居中
    for i in range(0, 7):
        # 水平居中
        p = doc_table.rows[i].cells[0].paragraphs[0]
        p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
        doc_table.rows[i].height = Cm(0.6)  # 行高
        # 垂直居中
        for j in range(0, 4):
            doc_table.rows[i].cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
    # 生成表格并填充内容
    row_num = 0
    for data in data_table:
        row = doc_table.add_row()
        row_cells = row.cells
        row_cells[0].text = str(row_num + 1)  # 序号,需要转换成字符串
        row_cells[1].text = data['测试步骤']
        row_cells[2].text = data['预期结果']
        row_cells[3].text = data['预期结果']
        # 水平居中
        p = row_cells[0].paragraphs[0]
        p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
        row.height = Cm(0.6)  # 行高
        # 垂直居中
        for j in range(0, 4):
            row_cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
        row_num = row_num + 1
    doc.add_paragraph(text='', style=None)  # 换行
    return doc, doc_table, data_table
  • add_table_to_document_down:在 word 对象中组装列表的下部,这里所说的下部指的是用例结束部分,包含测试负责人等信息,这部分通常是固定不变的,将这部分单独拿出来作为表格的下部,此方法需要依赖于表格对象,传入 doc_table,返回 doc_table
def add_table_to_document_down(doc_table):
    # 表格下段
    # 循环五次新增列表用来填写结果和其他信息
    for _ in range(5):
        doc_table.add_row()
    # 单元格合并
    merge_cells = [
        (-1, 1, -1, 3),
        (-2, 1, -2, 3),
        (-3, 1, -3, 3),
        (-4, 1, -4, 3),
        (-5, 1, -5, 3)
    ]

    # 单元格文本
    cell_texts = [
        (('测试责任人', ''), WD_PARAGRAPH_ALIGNMENT.CENTER),
        (('判定结果', ''), WD_PARAGRAPH_ALIGNMENT.CENTER),
        (('测试时间', ''), None),
        (('实测截图', ''), None),
        (('评判标准', '每一步实际结果与预期结果相符,判定该用例通过;否则为不通过'), None)
    ]

    for row_start, col_start, row_end, col_end in merge_cells:
        doc_table.rows[row_start].cells[col_start].merge(doc_table.rows[row_end].cells[col_end])

    for i, ((label, text), alignment) in enumerate(cell_texts[::-1]):
        doc_table.rows[-i-1].cells[0].text = label
        doc_table.rows[-i-1].cells[1].text = text
        if alignment is not None:
            p = doc_table.rows[-i-1].cells[1].paragraphs[0]
            p.paragraph_format.alignment = alignment

    # 设置列宽
    col_width_dic = {0: 2, 1: 3, 2: 3, 3: 2}

    for col_num in range(4):
        doc_table.cell(0, col_num).width = Inches(col_width_dic[col_num])
    return doc_table
  • excel_to_docx:用例转换的主代码,在该函数中,承担对数据的提取、去重、分组,完成数据的处理之后,将表格进行组装,传入处理后的数据,表格会将数据填入指定部分,在表格方法执行完成后,会保存文档到当前文件夹
def excel_to_docx(sheet_name, datas):
    """生成word文件"""
    doc = generate_word_file()
    # 获取数据中的second的值并去重
    data_seconds = [data['second'] for data in datas]
    data_second = []
    [data_second.append(second_value) for second_value in data_seconds if not second_value in data_second]

    h2 = doc.add_heading(sheet_name, level=2)  # 二级标题
    run = h2.add_run('')  # 可以通过add_run来设置文字,也可以通过数组来获取
    run.font.name = '宋体'

    for second in data_second:
        h3 = doc.add_heading(second, level=3)  # 插入模板名称,三级标题
        run = h3.add_run('')  # 可以通过add_run来设置文字,也可以通过数组来获取
        run.font.name = '宋体'
        run.font.size = Pt(16)
        doc.add_paragraph(text='', style=None)  # 换行

        data_table = [data for data in datas if (data['second'] == second)]
        doc, doc_table, data_table = add_table_to_document_up(doc, data_table)
        doc, doc_table, data_table = add_table_to_document_center(doc, doc_table, data_table)
        doc_table = add_table_to_document_down(doc_table)
        max_row = len(doc_table.rows)
        # 对所有行和列水平垂直居中
        for i in range(0, max_row):
            # 水平居中
            p = doc_table.rows[i].cells[0].paragraphs[0]
            p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
            doc_table.rows[i].height = Cm(1.0)  # 设置行高
            # 垂直居中
            for j in range(0, 4):
                doc_table.rows[i].cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
    try:
        xlsx_path = os.path.join(os.getcwd(), 'result_document', f'{sheet_name}.docx')
        doc.save(xlsx_path)
    except PermissionError:
        logger.info(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        logger.error('文件已经生成,请检查!!')
    else:
        logger.info(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        logger.info(f'工作表:{sheet_name}转换完成,感谢使用!!')

实际效果


项目地址

项目在 gitee 上已经开源,欢迎大家使用、提出问题、star
https://gitee.com/violet_bin/little_tools

共收到 12 条回复 时间 点赞

我也干过类似的事情 只不过不是转用例
而是要根据用例和缺陷生成 word 格式的测试报告 包括用例详情和缺陷列表及统计表

你们公司好变态

想问一下楼主,验收过程中,word 的用例是怎么进行验收的?谁来验收?一条一条用例的验收?

这种一般都是对外交付项目的验收标准吧

Smobee 回复

项目的甲方来验收的,也会有第三方的验收公司、监理之类的协助验收,验收不用一条条对,应该只是看个大概,毕竟 word 的测试用例可能得几百页

fiskeryang 回复

那用例和缺陷不是得关联起来,有点好奇是手动关联的还是关键字匹配的呢
我理解的:
手动关联:比如在测试用例增加一列 bugid 之类的
关键字匹配:通过功能、模块名称分类(禅道里面可以区分,但是我们用的版本没法关联测试用例)

Smobee 回复

一条条的给用户演示 要求至少是合同里所有指标都能体现 所以每条用例都要有执行结果 和 结果截图 2J 的项目就是这样

Violet_yoo 回复

那可能是项目类型不一样,,哈哈,很好奇,为什么有这种验收过程,像我们自研的,但是内部验收,直接给客户使用。

fiskeryang 回复

那工作量很大啊😂

Smobee 回复

嗯 交付要花很多功夫 验收过程很严谨 甚至可以说有些刻板 国家的钱不是那么好拿的

学习下

嗯,对于 toB 或者 toG 的公司来说,确实有很多应对交付的文档工作。可以抽象出来,通过配置映射模板,可以将 excel 的用例转成对应的 word 用例文档。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册