文章目录
- 背景
- EXCEL的用例
- Word内容
- Python处理
- 读取excel的内容
- 将同模块的用例保存到同一个对象
- 采用DocxTemplate根据模板生成word文件
- 生成结果如下
- 全部代码如下
背景
目前测试用例使用excel整理后,后期需要变成word文件。采用手工粘贴赋值整理费时费力,随采用python程序处理,从工具人解放出来。
EXCEL的用例
excel的用例如下,一般会有很多模块,且至少包含所属模块,用例标题,前置条件,步骤,预期结果等内容 。
Word内容
需要生成Word的内容如下,就是将excel的内容填充到以下。
Python处理
1.使用pandas读取excel中列的内容
2.将同模块的用例保存到同一个对象(用来生成一个word文件)
3.采用DocxTemplate根据模板生成word文件
读取excel的内容
def creatData(file):
"""
:param file: 需要生成数据的excle文件
:return: 序列号数据
"""
df = pd.read_excel(file)
test_data = []
for i in df.index.values:
# 根据i来获取每一行指定的数据 并利用to_dict转成字典
row_data = df.loc[i, excelCol].to_dict()
test_data.append(row_data)
return test_data
将同模块的用例保存到同一个对象
excelCol = ['所属模块', '用例标题', '步骤', '预期', '前置条件']
# 获取excel中列的去重内容
data_moudle = pd.read_excel(excelFile)
moudle = pd.DataFrame(data_moudle['所属模块']).drop_duplicates(subset=None, keep='first', inplace=False).to_dict('list')[
"所属模块"]
allData = []
# 声明拼接的数组,用来生成文件内容
for i in moudle:
item = {"SSMK": i, "table": []}
allData.append(item)
for name in test_data:
for index, key in enumerate(moudle):
if name[excelCol[0]] == key:
allData[index]["table"].append(
{"YLBT": zhaunyi(name[excelCol[1]]), "BZ": zhaunyi(name[excelCol[2]]), "YQ": zhaunyi(name[excelCol[3]]),
"QZTJ": zhaunyi(name[excelCol[4]])})
采用DocxTemplate根据模板生成word文件
模板文件tem.docx如下
def createDoc(contexts):
"""
:param contexts: 生成文件的内容
:return: 生成文件
"""
for index, context in enumerate(contexts):
doc = DocxTemplate("template/tem.docx")
# 执行替换
doc.render(context)
# #保存新的文档
doc.save("./case/%s.docx" % (str(index) ))
生成结果如下
会根据excel中的模块生成对应的docx文件,此文章有三个模块,则会生成三个文件。
全部代码如下
# -*- coding:utf-8 -*-
import pandas as pd
from docxtpl import DocxTemplate
import os
import shutil
# 声明需要生成的所属模块
# 读取excel的文件包括路径和名称以及后缀名称
excelFile = 'excelCase/test.xlsx'
# 读取excel中的列,顺序不能变,列名称要跟excel的名称对应
excelCol = ['所属模块', '用例标题', '步骤', '预期', '前置条件']
# 获取excel中列的去重内容
data_moudle = pd.read_excel(excelFile)
moudle = pd.DataFrame(data_moudle['所属模块']).drop_duplicates(subset=None, keep='first', inplace=False).to_dict('list')[
"所属模块"]
print(moudle)
def zhaunyi(str):
# 由于excel中某些单元格为空,因此处理为无
# AttributeError: 'float' object has no attribute 'replace'
if (type(str) == float):
return '无';
"""
:param str: 需要转义的内容
:return: 将特殊字符转义
"""
return str.replace("&", "&").replace("<", "<").replace(">", ">")
def createDoc(contexts):
"""
:param contexts: 生成文件的内容
:return: 生成文件
"""
for index, context in enumerate(contexts):
doc = DocxTemplate("template/tem.docx")
# 执行替换
print(context)
print(index)
doc.render(context)
# #保存新的文档
# doc.save("./case/%s.docx" % (str(index) + "-" + str(context.get("SSMK")).replace("/", "-")))
doc.save("./case/%s.docx" % (str(index) ))
def cleanDoc(file):
"""
:param file: 传入需要清空的文件目录
:return: 从新生成文件目录
"""
if os.path.exists(file):
# 删除case目录
shutil.rmtree(file)
# 创建目录
os.mkdir(file)
allData = []
# 声明拼接的数组,用来生成文件内容
for i in moudle:
item = {"SSMK": i, "table": []}
allData.append(item)
def creatData(file):
"""
:param file: 需要生成数据的excle文件
:return: 序列号数据
"""
df = pd.read_excel(file)
test_data = []
for i in df.index.values:
# 根据i来获取每一行指定的数据 并利用to_dict转成字典
row_data = df.loc[i, excelCol].to_dict()
test_data.append(row_data)
return test_data
test_data = creatData(excelFile)
for name in test_data:
for index, key in enumerate(moudle):
if name[excelCol[0]] == key:
allData[index]["table"].append(
{"YLBT": zhaunyi(name[excelCol[1]]), "BZ": zhaunyi(name[excelCol[2]]), "YQ": zhaunyi(name[excelCol[3]]),
"QZTJ": zhaunyi(name[excelCol[4]])})
cleanDoc("./case")
createDoc(allData)