大数跨境

Python+OpenAI打造测试用例生成工具:设计思路与技术原理全拆解

Python+OpenAI打造测试用例生成工具:设计思路与技术原理全拆解 51Testing软件测试网
2026-09-29
4
导读:基于CustomTkinter的测试用例生成工具,实现功能清单配置→知识库匹配→智能生成→批量导出,融合规则与LLM,按模块分sheet输出,提升用例编写效率。

本文基于 customtkinter 开发的桌面端测试用例生成工具,核心目标是实现「功能清单配置→知识库匹配→智能生成测试用例→批量导出」的全流程自动化。

下面从整体设计思路和核心技术原理两方面拆解,让你清晰理解代码的架构和底层逻辑。

图1 功能清单页面
生成测试用例页面图2 生成测试用例页面
图3 导出功能清单
导出测试用例图4 导出测试用例
  • 功能清单页面设计核心思路:通过输入系统名称、模块名称,基于基础模板和完成模板两种方式,生成功能清单。

    基础模版包括简单的新增、修改、删除、查询功能,完整的模版包括基础+其他功能(和公司密切相关的业务)。

    同时,生成功能清单后可以进行修改,进而保存。

  • 生成测试用例页面:通过导入用例知识库,结合导入的功能清单,基于功能清单的功能找到用例知识库。

    如新增功能,匹配新增功能的测试用例,直到清单上所有功能匹配完成,生成excel 版本的测试用例。

    整个设计逻辑按照模块名称对应sheet 名,页面名称对应页面名称,操作项对应功能项名称。

一、整体设计思路

工具采用「分层模块化+双Tab业务拆分」的设计模式,核心遵循「用户交互→数据处理→结果输出」的流程,同时兼顾易用性和扩展性。

1. 核心设计原则

设计原则
具体体现
模块化拆分
按业务功能拆分为「功能清单生成」「测试用例生成」两个核心Tab,各模块独立但数据互通
数据持久化
知识库保存为本地JSON文件,避免重复导入;Excel/Word导出支持自定义路径和命名
智能适配
无匹配模板时自动生成测试用例,支持对话式批量修改用例(对接OpenAI API)
容错性
过滤空行/无效数据、异常捕获、操作日志记录,避免单次操作失败导致程序崩溃
用户友好
可视化预览(Treeview)、双击编辑、自动换行处理、工作日日期计算等细节优化

2. 业务流程设计(核心链路)

业务流程设计图图5 业务流程设计图

3. 数据结构设计

核心数据结构
用途
存储形式
global_modules
功能清单模块数据
列表(字典元素:name/page_func/template/remark/full_func)
global_knowledge_base
用例模板知识库
有序字典(key=功能项,value=用例模板列表)
global_test_cases
生成的测试用例
列表(字典元素:包含18+测试用例字段)
module_func_dict
按模块分组的功能清单
有序字典(key=模块名,value=页面/功能项列表)

二、核心技术原理

1. 界面开发:CustomTkinter + Tkinter 组合

  • 底层框架
    基于 tkinter(Python内置GUI库),用 customtkinter 封装美化(支持现代UI、主题切换、圆角控件)。
  • 核心组件
    • CTkTabview:实现「功能清单」「测试用例」双Tab切换;
    • CTkScrollableFrame:支持模块输入框的滚动展示;
    • ttk.Treeview:测试用例/功能清单的可视化预览(支持双击编辑单元格);
    • scrolledtext.ScrolledText:操作日志和对话记录的展示。
  • 动态组件
    ModuleFrame 类封装模块输入框,支持「添加/删除/编辑」,通过回调函数更新组件索引,实现动态布局。

2. 文档处理:python-docx + pandas

(1)Word(docx)处理(功能清单导入/导出)

  • 导入:解析docx中的表格,过滤空行/表头行(修复最后一行识别问题),提取「模块/页面/功能项/备注」;
  • 导出:创建结构化Word表格,支持单元格合并、背景色设置、文字居中/加粗,生成标准化功能清单文档。
  • Docx 常见操作:

Document() 新建文档
add_heading() 添加标题
add_paragraph() 添加段落
save() 保存文件。
Document(文件路径) 打开文档
doc.tables 获取所有表格
row.cells 遍历单元格提取文本
add_table(rows, cols) 创建表格
cell.merge() 合并单元格
设置 table.style 为带边框样式
通过 XML 代码设置背景色
直接遍历 row.cells用 cell.text.strip() 提取文本
doc.sections[0] 访问页面设置
调整 page_width/page_height(纸张大小)
left_margin/right_margin(边距)

(2)Excel(xlsx)处理(知识库/用例导入/导出)

  • 导入:pandas.read_excel 读取多sheet文件,按「功能项」分组构建知识库;
  • 导出:pandas.ExcelWriter 按模块拆分sheet,限制sheet名长度(Excel最大31字符),保证字段顺序与模板一致;
  • 关键优化:导出时自动为步骤/期望结果插入换行符( ),解决Excel双击换行问题。
  •  Pandas 常见操作:pandas 是python 中用于操作excel 文件的类库,包括读取文件、写入文件,写入前同时伴随数据清洗、数据查询、数据分组与聚合等操作。


操作分类
操作描述
核心代码
文件读写
读取Excel文件(强制字符串类型)
df = pd.read_excel("文件.xlsx", dtype=str)
读取CSV文件(适配中文编码)
df = pd.read_csv("文件.csv", encoding='utf-8-sig', dtype=str)
读取Excel多工作表并合并
xls = pd.ExcelFile("文件.xlsx")
df = pd.concat([pd.read_excel(xls, sheet) for sheet in xls.sheet_names])
导出CSV文件(不含索引)
df.to_csv("文件.csv", index=False, encoding='utf-8-sig')
导出Excel文件(指定工作表)
df.to_excel("文件.xlsx", sheet_name="测试用例", index=False)
按模块分sheet导出Excel
with pd.ExcelWriter("文件.xlsx") as writer:
  for module, df_module in df.groupby("模块名称"):
    df_module.to_excel(writer, sheet_name=module, index=False)
数据清洗
填充所有空值为空字符串
df = df.fillna("")
清理字段前后空格
df["字段名"] = df["字段名"].str.strip()
强制转换字段类型为字符串
df["字段名"] = df["字段名"].astype(str)
过滤空行/无效行(按关键字段)
df = df[df["用例编号"] != ""]
批量清理多个字段空格
for col in ["模块名称", "bug编号"]:
  df[col] = df[col].str.strip()
替换字段值(统一格式)
df["测试结果"] = df["测试结果"].replace({"失败": "fail", "成功": "pass"})
数据筛选
按字段值筛选数据
df_fail = df[df["测试结果"] == "fail"]
多条件筛选(模块+功能项)
df_target = df[(df["模块名称"] == "现场管理") & (df["功能项"] == "新增")]
模糊匹配(按关键词筛选)
df_search = df[df["标题"].str.contains("新增", na=False)]
按列表筛选(指定BUG编号)
df_bug = df[df["bug编号"].isin(["BUG001", "BUG002"])]
取前N行数据(TOP排名)
df_top5 = df.sort_values("失败数", ascending=False).head(5)
分组分析
按字段分组
module_groups = df.groupby("模块名称")
统计字段值分布(计数)
df["模块名称"].value_counts()
分组统计用例数
df.groupby("模块名称")["用例编号"].count()
分组计算失败率
module_total = df.groupby("模块名称")["用例编号"].count()
module_fail = df[df["测试结果"]=="fail"].groupby("模块名称")["用例编号"].count()
module_fail_rate = (module_fail/module_total*100).fillna(0)
多维度交叉分析(透视表)
pd.pivot_table(df, index="模块名称", columns="功能项", values="用例编号", aggfunc="count", fill_value=0)
字段操作
添加新列(默认值)
df["模块名称"] = "默认模块"
重命名列(兼容不同字段名)
df = df.rename(columns={"缺陷编号": "bug编号"})
保留指定列(精简字段)
df = df[["用例编号", "测试结果", "bug编号"]]
调整列顺序(按模板排序)
df = df[["模块名称", "页面名称", "用例编号"]]
批量修改字段值
df.loc[df["测试结果"]=="fail", "bug编号"] = "BUG001"
基础统计
统计字段去重数(模块数)
df["模块名称"].nunique()
计算失败率(百分比)
fail_rate = len(df[df["测试结果"]=="fail"])/len(df)*100
按字段排序(降序)
df_sorted = df.sort_values("失败数", ascending=False)
格式化数值(保留2位小数)
df["失败率"] = df["失败率"].round(2)
结果输出
导出分析结果到Excel(多sheet)
with pd.ExcelWriter("分析报告.xlsx") as writer:
  df_result.to_excel(writer, sheet_name="模块失败率", index=False)
生成模块失败率柱状图
df["失败率"].plot(kind="bar", color="orangered")
生成测试结果饼图
df["测试结果"].value_counts().plot(kind="pie", autopct="%1.1f%%")
保存可视化图表
plt.savefig("模块失败率.png", dpi=300)
异常处理
禁用链式赋值警告
pd.set_option('mode.chained_assignment', None)
尝试多编码读取CSV
encodings = ['utf-8', 'gbk', 'utf-8-sig']
for enc in encodings:
  try:
    df = pd.read_csv("文件.csv", encoding=enc)
    break
  except:
    continue
检查字段是否存在
if "bug编号" not in df.columns:
  df["bug编号"] = ""

3. 智能生成:OpenAI API + 规则匹配

(1)知识库匹配逻辑

  • 核心:按「功能项」精准匹配知识库中的用例模板,无匹配时触发「规则式自动生成」;
  • 规则生成:根据功能项关键词(新增/修改/删除/查询等),预设步骤/期望结果模板,覆盖80%通用场景。

(2)对话式批量修改

  • 流程:用户输入自然语言指令 → 构造Prompt → 调用OpenAI API → 解析返回结果 → 更新用例数据;
  • Prompt设计要点:限定字段范围、明确修改规则、要求保持数据结构一致;
  • 模型选择:gpt-4o-mini(兼顾成本和效果),temperature=0.2(保证输出稳定)。

4. 数据处理:正则表达式 + 日期计算

(1)文本处理(解决换行/格式问题)

Python
# 核心正则:匹配「数字+顿号/点+内容」格式,拆分并换行
pattern = r'(\d+[、.])\s*([^1234567890]+)'
matches = re.findall(pattern, content)
new_content = "
".join([f"{num} {content.strip()}" for num, content in matches])

作用:将「1、点击2、保存」拆分为「1 点击 2 保存」,实现Excel自动换行。

(2)日期处理(工作日计算)

Python
def get_next_workday(self, date):
next_date = date + timedelta(days=1)
while next_date.weekday() in [5, 6]: # 5=周六,6=周日
next_date += timedelta(days=1)
return next_date

作用:为测试用例分配合理的创建日期,跳过周末,符合实际测试流程。

5. 异常处理与日志

  • 全局异常捕获:所有IO操作(文件读写、API调用)都包裹 try-except,避免程序崩溃;
  • 日志系统:分「功能清单日志」「测试用例日志」,记录操作时间+内容,支持滚动查看;
  • 用户反馈:通过 messagebox 提示操作结果,日志同步记录关键信息(如导入模块数、生成用例数)。

6. 知识库持久化

  • 存储格式:JSON文件(knowledge_base.json),将 defaultdict(list) 转换为普通字典保存;
  • 加载逻辑:程序启动时自动加载,导入/追加模板后自动保存,避免重复配置。

三、关键技术亮点

技术亮点
解决的问题
实现方式
双Tab业务解耦
功能清单和测试用例独立操作,数据按需互通
拆分 init_func_list_ui/init_case_gen_ui 方法,通过全局变量共享数据
动态模块编辑
支持无限添加/删除模块,编辑后数据实时同步
ModuleFrame 类+回调函数,维护模块索引和数据
按模块分sheet导出
解决多模块用例混乱问题
pandas.ExcelWriter 遍历模块字典,逐个写入sheet
修复最后一行识别
解决导入功能清单时遗漏最后一行的Bug
过滤空行/表头行,收集所有有效行后再处理
对话式批量修改
无需手动修改每条用例,支持自然语言指令
对接OpenAI API,解析指令并更新用例数据

总结

这份代码的核心设计逻辑是「可视化交互+结构化数据处理+智能生成」,技术上融合了:

  1. GUI开发:CustomTkinter实现现代界面,动态组件适配复杂输入;
  2. 文档解析:python-docx/pandas处理Word/Excel,保证数据导入导出的准确性;
  3. 智能生成:规则匹配+LLM API,实现测试用例的自动化和灵活修改;
  4. 工程化优化:异常处理、日志记录、数据持久化,保证工具的稳定性和易用性。

工具的核心价值是将测试用例编写从「手动逐条写」转变为「配置化+智能化生成」,大幅提升测试用例的编写效率,同时保证格式标准化。

针对于功能项操作很多系统都适配,将功能项进行模版化,从大到小进行拆分,再根据小的功能项进行组合进而形成页面用例、模块用例的组合。

——END——

声明:本文为51Testing软件测试网 M&T. 用户投稿内容,该用户投稿时已经承诺独立承担涉及知识产权的相关法律责任,并且已经向51Testing承诺此文并无抄袭内容。发布本文的用途仅仅为学习交流,不做任何商用,未经授权请勿转载,否则作者和51Testing有权追究责任。如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:editor@51testing.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。


图片

【声明】内容源于网络
0
0
51Testing软件测试网
博为峰51Testing软件测试网提供各种线上招聘、线上课程等网络服务,出版软件测试系列丛书及电子杂志,组织线上技术交流活动;同时还举办多种线下公益活动,如软件测试沙龙、软件测试专场招聘会等。
内容 3958
粉丝 0
51Testing软件测试网 博为峰51Testing软件测试网提供各种线上招聘、线上课程等网络服务,出版软件测试系列丛书及电子杂志,组织线上技术交流活动;同时还举办多种线下公益活动,如软件测试沙龙、软件测试专场招聘会等。
总阅读4.1k
粉丝0
内容4.0k