上个月用AI生成了一个项目的测试用例,430条。交给测试经理的时候,他说:"内容不错,但格式太乱了,没法直接用。"
我花了一下午,把430条用例手动整理成Excel表格。后来需求变了,重新生成后,又要再整理一次。这种"重复劳动"让人崩溃。
后来我在系统里加了四种导出格式:Excel、XMind、Word、Markdown。现在生成完成后,一键导出,测试工程师拿Excel执行,产品经理看XMind评审,老板看Word报告。本文分享完整实现方案。

一、为什么需要多种输出格式?
1.1 不同角色,不同需求
1.2 输出格式的价值
二、Excel导出器:测试工程师的最爱
2.1 Excel结构设计
测试用例文档.xlsx├── Sheet 1: 封面│ ├── 项目信息(项目名、日期、版本)│ ├── 文档概要(需求数、测试点数、用例数)│ └── Sheet索引│├── Sheet 2: 测试用例汇总│ ├── 表头(序号、需求/迭代、测试点、测试类型、用例标题、前置条件、步骤、预期结果、优先级、备注)│ ├── 数据行(按需求→测试点→用例展开)│ ├── 合并单元格(需求列、测试点列)│ └── 【核心】蓝色高亮、「需求未明确」棕色高亮│├── Sheet 3: 测试点统计│ ├── 统计表(需求、测试点、用例数、优先级分布)│ └── 合计行│└── Sheet 4: 用例生成失败明细(可选)├── 失败信息(需求名、测试点、失败原因、时间)└── 红色警示样式
2.2 ExcelExporter核心实现
from openpyxl import Workbookfrom openpyxl.styles import Font, Alignment, PatternFill, Border, Sidefrom openpyxl.utils import get_column_letterfrom pathlib import Pathclass ExcelExporter:”””Excel测试用例导出器”””def __init__(self):# 样式定义self.title_font = Font(name='微软雅黑', size=16, bold=True)self.header_font = Font(name='微软雅黑', size=11, bold=True)self.normal_font = Font(name='微软雅黑', size=10)self.high_priority_fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid')self.medium_priority_fill = PatternFill(start_color='FFFACD', end_color='FFFACD', fill_type='solid')self.low_priority_fill = PatternFill(start_color='F0F8FF', end_color='F0F8FF', fill_type='solid')self.core_fill = PatternFill(start_color='4169E1', end_color='4169E1', fill_type='solid')self.unclear_fill = PatternFill(start_color='DEB887', end_color='DEB887', fill_type='solid')# 边框self.border = Border(left=Side(style='thin'),right=Side(style='thin'),top=Side(style='thin'),bottom=Side(style='thin'))def export(self, requirements, output_path):”””导出Excel文件”””wb = Workbook()# 创建封面Sheetself._create_cover_sheet(wb, requirements)# 创建测试用例汇总Sheetself._create_cases_sheet(wb, requirements)# 创建测试点统计Sheetself._create_stats_sheet(wb, requirements)# 保存文件wb.save(output_path)
2.3 Excel样式设计要点
三、XMind导出器:测试经理的评审利器
3.1 XMind结构设计
测试用例思维导图.xmind├── 中心主题:项目名称│├── 分支1:需求A│ ├── 分支1.1:测试点A1│ │ ├── 分支1.1.1:【核心】用例1(高)│ │ ├── 分支1.1.2:用例2(中)│ │ └── 分支1.1.3:用例3(低)│ ││ ├── 分支1.2:测试点A2│ │ └── ...│ ││ └── 分支1.3:测试点A3│ └── ...│├── 分支2:需求B│ └── ...│└── 分支3:需求C└── ...
3.2 XMindExporter核心实现
import xmindfrom xmind.core.topic import TopicElementfrom xmind.core.const import TOPIC_DETACHEDclass XMindExporter:”””XMind思维导图导出器”””def __init__(self):self.workbook = Noneself.root_topic = Nonedef export(self, requirements, output_path):”””导出XMind文件”””# 创建工作簿self.workbook = xmind.load(output_path)# 获取中心主题self.root_topic = self.workbook.getPrimarySheet().getRootTopic()# 设置中心主题project_name = requirements[0].get('project_name', '测试用例') if requirements else '测试用例'self.root_topic.setTitle(project_name)# 添加需求分支for req in requirements:self._add_requirement_topic(req)# 保存文件xmind.save(self.workbook, output_path)def _add_requirement_topic(self, req):”””添加需求主题”””req_name = req.get('title', '')# 创建需求分支req_topic = self.root_topic.addSubTopic()req_topic.setTitle(req_name)# 添加测试点分支test_points = req.get('test_points', {}).get('points', [])for tp in test_points:tp_name = tp.get('name', '')# 创建测试点分支tp_topic = req_topic.addSubTopic()tp_topic.setTitle(tp_name)# 添加用例分支cases = tp.get('cases', [])for case in cases:case_title = case.get('title', '')priority = case.get('priority', '低')# 创建用例分支case_topic = tp_topic.addSubTopic()# 设置用例标题(包含优先级)case_topic.setTitle(f”{case_title} ({priority})”)# 根据优先级设置样式self._set_topic_style(case_topic, case)def _set_topic_style(self, topic, case):”””设置主题样式”””# 获取样式对象style = topic.getStyle()# 根据优先级设置字体颜色priority = case.get('priority', '低')if priority == '高':style.setFontColor('#FF0000')# 红色elif priority == '中':style.setFontColor('#FFA500')# 橙色else:style.setFontColor('#808080')# 灰色# 根据标识设置背景色title = case.get('title', '')if '【核心】' in title:style.setBackgroundColor('#ADD8E6')# 浅蓝色elif '「需求未明确」' in title:style.setBackgroundColor('#DEB887')# 棕色
3.3 XMind样式设计要点
四、Word导出器:给产品经理的正式文档
4.1 Word结构设计
需求未明确点汇总.docx├── 封面│ ├── 标题:需求未明确点汇总│ ├── 项目信息(项目名、日期、版本)│ └── 概要信息(未明确点数量)│├── 目录(自动生成)│├── 正文│ ├── 第1章:需求A的未明确点│ │ ├── 1.1 未明确点1│ │ │ ├── 问题描述│ │ │ ├── 影响分析│ │ │ └── 建议│ │ └── 1.2 未明确点2│ │ └── ...│ ││ ├── 第2章:需求B的未明确点│ │ └── ...│ ││ └── ...│└── 附录└── 未明确点统计表格
4.2 WordExporter核心实现
from docx import Documentfrom docx.shared import Pt, Cm, RGBColorfrom docx.enum.text import WD_ALIGN_PARAGRAPHfrom docx.enum.table import WD_TABLE_ALIGNMENTfrom docx.oxml.ns import qnclass WordExporter:”””Word文档导出器”””def __init__(self):self.document = Nonedef export(self, requirements, output_path):”””导出Word文件”””# 创建文档self.document = Document()# 设置文档属性self.document.styles['Normal'].font.name = '微软雅黑'self.document.styles['Normal'].font.size = Pt(11)self.document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')# 创建封面self._create_cover()# 添加目录self._add_table_of_contents()# 添加正文self._add_content(requirements)# 添加附录self._add_appendix(requirements)# 保存文件self.document.save(output_path)def _create_cover(self):”””创建封面”””# 标题title = self.document.add_heading('需求未明确点汇总', level=0)title.alignment = WD_ALIGN_PARAGRAPH.CENTERtitle.runs[0].font.size = Pt(22)title.runs[0].font.bold = True# 空行self.document.add_paragraph()# 项目信息info_table = self.document.add_table(rows=3, cols=2)info_table.alignment = WD_TABLE_ALIGNMENT.CENTER# 去除表格边框for row in info_table.rows:for cell in row.cells:cell.width = Cm(6)info_table.cell(0, 0).text = '项目名称:'info_table.cell(0, 1).text = self.project_nameinfo_table.cell(1, 0).text = '生成日期:'info_table.cell(1, 1).text = datetime.now().strftime('%Y-%m-%d')info_table.cell(2, 0).text = '文档版本:'info_table.cell(2, 1).text = 'V1.0'
4.3 Word样式设计要点
五、Markdown执行报告:技术人员的记录
5.1 报告结构
# 测试用例生成执行报告## 一、项目信息| 项目名称 | xxx ||----------|-----|| 生成日期 | 2026-06-25 || 需求数量 | 5 || 测试点数量 | 30 || 用例数量 | 150 |## 二、执行过程### 2.1 需求分析阶段- 开始时间:15:00:00- 结束时间:15:02:00- 耗时:2分钟- 分析需求:5个### 2.2 测试点生成阶段- 开始时间:15:02:00- 结束时间:15:05:00- 耗时:3分钟- 生成测试点:30个### 2.3 用例生成阶段- 开始时间:15:05:00- 结束时间:15:12:00- 耗时:7分钟- 生成用例:150个### 2.4 导出阶段- 开始时间:15:12:00- 结束时间:15:13:00- 耗时:1分钟## 三、统计信息### 3.1 用例优先级分布| 优先级 | 数量 | 占比 ||--------|------|------|| 高 | 50 | 33% || 中 | 70 | 47% || 低 | 30 | 20% |### 3.2 Token消耗统计| 指标 | 数值 ||------|------|| 总Token消耗 | 500,000 || Prompt Token | 300,000 || Completion Token | 200,000 || 总成本 | ¥0.5 |## 四、问题与建议### 4.1 生成失败的测试点- 测试点A:API调用超时,已重试成功- 测试点B:需求描述不清晰,已标记为「需求未明确」### 4.2 优化建议- 建议优化需求文档质量,减少模糊描述- 建议增加API调用重试次数
5.2 报告生成实现
class MarkdownReporter:”””Markdown执行报告生成器”””def __init__(self):self.report_lines = []def generate(self, task_info, execution_log, statistics):”””生成报告”””# 标题self._add_line('# 测试用例生成执行报告')self._add_line()# 项目信息self._add_section('项目信息')self._add_table([['项目名称', task_info.get('project_name', '')],['生成日期', datetime.now().strftime('%Y-%m-%d %H:%M:%S')],['需求数量', str(task_info.get('requirement_count', 0))],['测试点数量', str(task_info.get('test_point_count', 0))],['用例数量', str(task_info.get('case_count', 0))]])self._add_line()# 执行过程self._add_section('执行过程')for stage in execution_log:self._add_subsection(stage.get('stage', ''))self._add_line(f'- 开始时间:{stage.get(”start_time”, ””)}')self._add_line(f'- 结束时间:{stage.get(”end_time”, ””)}')self._add_line(f'- 耗时:{stage.get(”duration”, ””)}')if stage.get('details'):self._add_line(f'- {stage.get(”details”)}')self._add_line()# 统计信息self._add_section('统计信息')# 优先级分布self._add_subsection('用例优先级分布')priority_stats = statistics.get('priority_stats', {})total = sum(priority_stats.values())rows = []for p in ['高', '中', '低']:count = priority_stats.get(p, 0)percentage = f'{count/total*100:.1f}%' if total > 0 else '0%'rows.append([p, str(count), percentage])self._add_table([['优先级', '数量', '占比']] + rows)self._add_line()# Token消耗self._add_subsection('Token消耗统计')token_stats = statistics.get('token_stats', {})self._add_table([['指标', '数值'],['总Token消耗', f”{token_stats.get('total_tokens', 0):,}”],['Prompt Token', f”{token_stats.get('prompt_tokens', 0):,}”],['Completion Token', f”{token_stats.get('completion_tokens', 0):,}”],['总成本', f”¥{token_stats.get('total_cost', 0):.2f}”]])self._add_line()# 问题与建议self._add_section('问题与建议')# 失败记录failures = statistics.get('failures', [])if failures:self._add_subsection('生成失败的测试点')for failure in failures:self._add_line(f'- {failure}')self._add_line()# 优化建议self._add_subsection('优化建议')self._add_line('- 建议优化需求文档质量,减少模糊描述')self._add_line('- 建议增加API调用重试次数')return '\n'.join(self.report_lines)def _add_line(self, text=''):”””添加一行”””self.report_lines.append(text)def _add_section(self, title):”””添加章节”””self._add_line(f'## {title}')def _add_subsection(self, title):”””添加子章节”””self._add_line(f'### {title}')def _add_table(self, rows):”””添加表格”””# 表头header = '| ' + ' | '.join(rows[0]) + ' |'self._add_line(header)# 分隔线separator = '| ' + ' | '.join(['---'] * len(rows[0])) + ' |'self._add_line(separator)# 数据行for row in rows[1:]:self._add_line('| ' + ' | '.join(row) + ' |')
六、四种格式对比
6.1 多维度对比
6.2 使用建议
七、下一篇预告
今天我们深入了解了系统的输出格式与报表设计,包括Excel测试用例表格、XMind思维导图、Word未明确点汇总和Markdown执行报告。
下一篇,我将为你带来系列的总结篇:
7篇文章,从0到1完整复盘。包含实际应用案例、踩坑经验、技术栈总结和学习路线。
关注后回复"总结",获取完整技术栈清单和搭建指南。
💬 互动时间
你在工作中最常用的测试用例格式是什么?
是Excel、XMind,还是其他格式?
欢迎在评论区留言分享!
如果觉得这篇文章对你有帮助,欢迎点赞、在看、转发三连支持!
关注我,获取更多测试技术干货和实践经验分享!
夜雨聆风