提交 4c9131ba authored 作者: 陈泽健's avatar 陈泽健

feat(report): 添加Markdown格式报告生成功能并优化文档排版

- 新增Markdown报告生成模块(markdown_generator.py)
- 支持Word和Markdown两种格式报告输出
- 添加报告格式选择参数(--format选项)
- 更新GUI界面支持格式选择
- 优化文档标题字号、字体和颜色配置
- 修改配置文件中的字体设置为宋体
- 更新PRD文档结构和内容描述
- 重构CLI模块支持多种格式输出
- 添加报告命名规则适配不同格式
- 更新README文档说明新功能特性
上级 09170467
......@@ -2,7 +2,7 @@
## 功能简介
本工具通过读取测试用例Excel文件和BUG列表Excel文件,自动生成功能测试报告(Word格式)。
本工具通过读取测试用例Excel文件和BUG列表Excel文件,自动生成功能测试报告(支持Word和Markdown两种格式)。
### 主要功能
......@@ -10,7 +10,7 @@
- 统计用例执行情况、BUG数量和等级分布
- 自动关联用例与BUG
- 生成统计图表(饼图、柱状图)
- 生成Word格式的功能测试报告
- 生成Word格式或Markdown格式的功能测试报告
## 环境要求
......@@ -42,7 +42,14 @@ python run.py
### 方式二:命令行参数模式
```bash
# 生成Word报告
python run.py --testcase testcases/测试用例.xlsx --buglist testcases/BUG列表.xlsx
# 生成Markdown报告
python run.py --testcase testcases/测试用例.xlsx --buglist testcases/BUG列表.xlsx --format md
# 同时生成Word和Markdown报告
python run.py --testcase testcases/测试用例.xlsx --buglist testcases/BUG列表.xlsx --format both
```
完整参数说明:
......@@ -53,6 +60,7 @@ python run.py --testcase testcases/测试用例.xlsx --buglist testcases/BUG列
| `--buglist` | BUG列表Excel文件路径 |
| `--output` | 输出报告文件路径(可选) |
| `--project` | 项目名称(可选) |
| `--format` | 报告格式:docx(Word文档)、md(Markdown文档)、both(两种格式),默认为docx |
| `--gui` | 使用GUI界面 |
| `--list` | 列出testcases目录下的可用文件 |
......@@ -129,9 +137,10 @@ FunctionalTestReportGeneration/
报告将保存到 `reports/` 目录,文件名格式为:
```
{项目名称}_功能测试报告_{日期}.docx
```
- Word格式:`{项目名称}_功能测试报告_{日期}.docx`
- Markdown格式:`{项目名称}_功能测试报告_{日期}.md`
支持同时生成两种格式的报告。
报告包含以下内容:
......
......@@ -8,16 +8,21 @@
import argparse
import sys
from pathlib import Path
from typing import Dict, Optional
from typing import Dict, List, Optional
from src.excel_reader import read_test_cases, read_bug_list
from src.data_analyzer import analyze_test_cases, analyze_bugs, link_bugs_to_cases
from src.chart_generator import generate_all_charts
from src.report_generator import generate_report
from src.word_generator import generate_report as generate_word_report
from src.markdown_generator import generate_markdown_report
from src.config import (
TESTCASES_DIR,
REPORTS_DIR,
get_report_filename,
REPORT_FORMAT_DOCX,
REPORT_FORMAT_MD,
REPORT_FORMATS,
DEFAULT_REPORT_FORMAT,
)
......@@ -57,6 +62,14 @@ def parse_arguments() -> argparse.Namespace:
help='项目名称(可选,默认从BUG列表中读取)'
)
parser.add_argument(
'--format',
type=str,
choices=['docx', 'md', 'both'],
default='docx',
help='报告格式:docx(Word文档)、md(Markdown文档)、both(两种格式),默认为docx'
)
parser.add_argument(
'--gui',
action='store_true',
......@@ -158,6 +171,17 @@ def interactive_input() -> Dict[str, str]:
project_name = input("请输入项目名称(或直接回车自动获取): ").strip()
result["project"] = project_name if project_name else None
# 获取报告格式
while True:
format_input = input("请输入报告格式(docx/md/both,直接回车默认docx): ").strip().lower()
if not format_input:
result["format"] = "docx"
break
if format_input in ['docx', 'md', 'both']:
result["format"] = format_input
break
print("格式输入错误,请输入 docx、md 或 both")
return result
......@@ -189,8 +213,9 @@ def generate_report_main(
testcase_path: str,
buglist_path: str,
output_path: Optional[str] = None,
project_name: Optional[str] = None
) -> str:
project_name: Optional[str] = None,
report_format: str = "docx"
) -> List[str]:
"""
生成报告的主函数
......@@ -199,26 +224,27 @@ def generate_report_main(
buglist_path: BUG列表Excel文件路径
output_path: 输出报告文件路径(可选)
project_name: 项目名称(可选)
report_format: 报告格式(docx/md/both)
Returns:
生成的报告文件路径
生成的报告文件路径列表
"""
print("\n=== 开始生成功能测试报告 ===\n")
# 步骤1:读取Excel数据
print("步骤1/5: 读取测试数据...")
print("步骤1/6: 读取测试数据...")
try:
test_cases = read_test_cases(testcase_path)
print(f" 读取到 {len(test_cases)} 条测试用例")
print(f" [OK] 读取到 {len(test_cases)} 条测试用例")
except Exception as e:
print(f" 读取测试用例失败: {str(e)}")
print(f" [X] 读取测试用例失败: {str(e)}")
sys.exit(1)
try:
bugs = read_bug_list(buglist_path)
print(f" 读取到 {len(bugs)} 条BUG记录")
print(f" [OK] 读取到 {len(bugs)} 条BUG记录")
except Exception as e:
print(f" 读取BUG列表失败: {str(e)}")
print(f" [X] 读取BUG列表失败: {str(e)}")
sys.exit(1)
# 获取项目名称
......@@ -230,57 +256,95 @@ def generate_report_main(
print(f" 项目名称: {project_name}")
# 步骤2:分析数据
print("\n步骤2/5: 分析测试数据...")
print("\n步骤2/6: 分析测试数据...")
case_analysis = analyze_test_cases(test_cases)
print(f" 总用例数: {case_analysis.total_cases}")
print(f" 通过率: {case_analysis.pass_rate}%")
print(f" [OK] 总用例数: {case_analysis.total_cases}")
print(f" [OK] 通过率: {case_analysis.pass_rate}%")
bug_analysis = analyze_bugs(bugs)
print(f" BUG总数: {bug_analysis.total_bugs}")
print(f" 遗留BUG: {bug_analysis.remaining_bugs}")
print(f" [OK] BUG总数: {bug_analysis.total_bugs}")
print(f" [OK] 遗留BUG: {bug_analysis.remaining_bugs}")
case_bug_link = link_bugs_to_cases(bugs, test_cases)
print(f" 关联了 {len(case_bug_link)} 个用例到BUG")
print(f" [OK] 关联了 {len(case_bug_link)} 个用例到BUG")
# 步骤3:生成图表
print("\n步骤3/5: 生成统计图表...")
print("\n步骤3/6: 生成统计图表...")
try:
from src.chart_generator import generate_all_charts
chart_paths = generate_all_charts(case_analysis, bug_analysis)
print(f" 生成了 {len(chart_paths)} 个图表")
print(f" [OK] 生成了 {len(chart_paths)} 个图表")
except Exception as e:
print(f" 生成图表失败: {str(e)}")
print(f" [!] 生成图表失败: {str(e)}")
chart_paths = {}
# 步骤4:生成报告
print("\n步骤4/5: 生成Word报告...")
# 确定要生成的格式
formats_to_generate = []
if report_format == "both":
formats_to_generate = ["docx", "md"]
else:
formats_to_generate = [report_format]
# 步骤4-5:生成各种格式的报告
generated_reports = []
for fmt in formats_to_generate:
print(f"\n步骤{4 + len(generated_reports)}/6: 生成{fmt.upper()}报告...")
# 确定输出路径
if output_path is None:
output_path = str(REPORTS_DIR / get_report_filename(project_name))
output_file_path = str(REPORTS_DIR / get_report_filename(project_name, format=fmt))
else:
# 如果用户指定了输出路径,替换扩展名
output_path_obj = Path(output_path)
if fmt == "md":
output_file_path = str(output_path_obj.with_suffix(".md"))
else:
output_file_path = str(output_path_obj.with_suffix(".docx"))
try:
report_path = generate_report(
template_path="", # 暂不使用模板
if fmt == "docx":
report_path = generate_word_report(
template_path="",
case_analysis=case_analysis,
bug_analysis=bug_analysis,
case_bug_link=case_bug_link,
chart_paths=chart_paths,
output_path=output_path,
output_path=output_file_path,
project_name=project_name,
cases=test_cases,
bugs=bugs
)
print(f" ✓ 报告已生成: {report_path}")
else: # md
report_path = generate_markdown_report(
template_path="",
case_analysis=case_analysis,
bug_analysis=bug_analysis,
case_bug_link=case_bug_link,
chart_paths=chart_paths,
output_path=output_file_path,
project_name=project_name,
cases=test_cases,
bugs=bugs
)
print(f" [OK] {fmt.upper()}报告已生成: {report_path}")
generated_reports.append(report_path)
except Exception as e:
print(f" ✗ 生成报告失败: {str(e)}")
print(f" [X] 生成{fmt.upper()}报告失败: {str(e)}")
import traceback
traceback.print_exc()
sys.exit(1)
# 步骤5:完成
print("\n步骤5/5: 完成!")
print(f"\n报告已保存到: {report_path}")
# 步骤6:完成
remaining_steps = 6 - (4 + len(generated_reports))
if remaining_steps > 0:
print(f"\n步骤{4 + len(generated_reports)}/6: 完成!")
else:
print(f"\n步骤6/6: 完成!")
print(f"\n报告已保存到:")
for report in generated_reports:
print(f" - {report}")
return report_path
return generated_reports
def main_cli() -> None:
......@@ -308,6 +372,7 @@ def main_cli() -> None:
buglist_path = args.buglist
output_path = args.output
project_name = args.project
report_format = args.format
else:
# 交互式输入
inputs = interactive_input()
......@@ -315,6 +380,7 @@ def main_cli() -> None:
buglist_path = inputs["buglist"]
output_path = inputs.get("output")
project_name = inputs.get("project")
report_format = inputs.get("format", "docx")
# 生成报告
try:
......@@ -322,7 +388,8 @@ def main_cli() -> None:
testcase_path=testcase_path,
buglist_path=buglist_path,
output_path=output_path,
project_name=project_name
project_name=project_name,
report_format=report_format
)
except KeyboardInterrupt:
print("\n\n操作已取消")
......
......@@ -145,19 +145,30 @@ BUG_COL_REPRODUCTION_STEPS = 9 # 复现步骤
# ================================
# 报告生成配置
# ================================
# 报告输出格式
REPORT_FORMAT = ".docx"
# 报告输出格式(支持的格式)
REPORT_FORMAT_DOCX = ".docx"
REPORT_FORMAT_MD = ".md"
REPORT_FORMATS = [REPORT_FORMAT_DOCX, REPORT_FORMAT_MD]
# 报告命名规则:{项目名称}_功能测试报告_{日期}.docx
# 默认报告格式
DEFAULT_REPORT_FORMAT = REPORT_FORMAT_DOCX
# 报告命名规则:{项目名称}_功能测试报告_{日期}.{format}
REPORT_FILENAME_TEMPLATE = "{project_name}_功能测试报告_{date}{format}"
# 报告编号规则:{项目名称}-{日期}
REPORT_NUMBER_TEMPLATE = "{project_name}-{date}"
# Word文档样式配置
WORD_FONT_NAME = "微软雅黑"
WORD_FONT_NAME = "宋体"
WORD_FONT_SIZE = 11
WORD_TITLE_FONT_SIZE = 16
# 各级标题字号配置
WORD_TITLE_LEVEL_1_SIZE = 21 # 一级标题字号
WORD_TITLE_LEVEL_2_SIZE = 19 # 二级标题字号
WORD_TITLE_LEVEL_3_SIZE = 17 # 三级标题字号
WORD_TITLE_LEVEL_4_SIZE = 15 # 四级标题字号
# 段落格式配置
WORD_PARAGRAPH_FIRST_LINE_INDENT = 2 # 正文首行缩进字符数
# ================================
# 图表生成配置
......@@ -212,13 +223,14 @@ __author__ = "Auto Report Generator"
__description__ = "功能测试报告自动生成工具"
def get_report_filename(project_name: str, date: str = None) -> str:
def get_report_filename(project_name: str, date: str = None, format: str = DEFAULT_REPORT_FORMAT) -> str:
"""
获取报告文件名
Args:
project_name: 项目名称
date: 日期字符串(可选,默认使用当前日期)
format: 报告格式(可选,默认为.docx)
Returns:
报告文件名
......@@ -227,10 +239,14 @@ def get_report_filename(project_name: str, date: str = None) -> str:
from datetime import datetime
date = datetime.now().strftime(FILENAME_DATE_FORMAT)
# 确保格式以点开头
if not format.startswith("."):
format = "." + format
return REPORT_FILENAME_TEMPLATE.format(
project_name=project_name,
date=date,
format=REPORT_FORMAT
format=format
)
......
......@@ -13,7 +13,12 @@ from pathlib import Path
from typing import Optional
from src.cli import generate_report_main
from src.config import TESTCASES_DIR, REPORTS_DIR
from src.config import (
TESTCASES_DIR,
REPORTS_DIR,
REPORT_FORMAT_DOCX,
REPORT_FORMAT_MD,
)
class ReportGeneratorGUI:
......@@ -32,7 +37,7 @@ class ReportGeneratorGUI:
"""初始化GUI"""
self.root = tk.Tk()
self.root.title("功能测试报告自动生成工具")
self.root.geometry("800x600")
self.root.geometry("800x650")
self.root.resizable(True, True)
# 文件路径变量
......@@ -41,6 +46,9 @@ class ReportGeneratorGUI:
self.output_path = tk.StringVar()
self.project_name = tk.StringVar()
# 报告格式变量
self.report_format = tk.StringVar(value="docx")
# 设置默认输出路径
self.output_path.set(str(REPORTS_DIR))
......@@ -202,6 +210,50 @@ class ReportGeneratorGUI:
)
project_hint.pack(side=tk.LEFT)
# 报告格式选择
format_frame = tk.Frame(selection_frame)
format_frame.grid(row=4, column=0, columnspan=3, sticky="ew", pady=5)
format_label = tk.Label(
format_frame,
text="报告格式:",
font=("微软雅黑", 10),
width=15,
anchor="e"
)
format_label.pack(side=tk.LEFT)
# 单选按钮
format_options_frame = tk.Frame(format_frame)
format_options_frame.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)
tk.Radiobutton(
format_options_frame,
text="Word文档(.docx)",
variable=self.report_format,
value="docx",
font=("微软雅黑", 10)
).pack(side=tk.LEFT, padx=10)
tk.Radiobutton(
format_options_frame,
text="Markdown文档(.md)",
variable=self.report_format,
value="md",
font=("微软雅黑", 10)
).pack(side=tk.LEFT, padx=10)
tk.Radiobutton(
format_options_frame,
text="两种格式都生成",
variable=self.report_format,
value="both",
font=("微软雅黑", 10)
).pack(side=tk.LEFT, padx=10)
# 配置列权重
parent.columnconfigure(1, weight=1)
def _create_file_entry(
self,
parent,
......@@ -373,6 +425,7 @@ class ReportGeneratorGUI:
# 获取其他参数
output_path = self.output_path.get()
project_name = self.project_name.get() or None
report_format = self.report_format.get()
# 重定向日志输出到GUI
import io
......@@ -399,11 +452,12 @@ class ReportGeneratorGUI:
sys.stdout = TextRedirector(self.log_text, "info")
# 调用生成函数
result_path = generate_report_main(
result_paths = generate_report_main(
testcase_path=testcase_path,
buglist_path=buglist_path,
output_path=output_path if output_path else None,
project_name=project_name
project_name=project_name,
report_format=report_format
)
# 恢复原始stdout
......@@ -415,7 +469,7 @@ class ReportGeneratorGUI:
# 在主线程中显示消息框
self.root.after(0, lambda: messagebox.showinfo(
"成功",
f"报告生成成功!\n\n保存位置:\n{result_path}"
f"报告生成成功!\n\n保存位置:\n" + "\n".join(result_paths)
))
except Exception as e:
......
......@@ -43,6 +43,7 @@ def print_usage():
--buglist FILE BUG列表Excel文件路径
--output PATH 输出报告文件路径(可选)
--project NAME 项目名称(可选)
--format FORMAT 报告格式(docx/md/both,默认为docx)
--gui 使用GUI界面
--list 列出testcases目录下的可用文件
-h, --help 显示帮助信息
......@@ -51,9 +52,15 @@ def print_usage():
# 交互式模式
python main.py
# 命令行模式
# 命令行模式(生成Word报告)
python main.py --testcase testcases/测试用例.xlsx --buglist testcases/BUG列表.xlsx
# 命令行模式(生成Markdown报告)
python main.py --testcase testcases/测试用例.xlsx --buglist testcases/BUG列表.xlsx --format md
# 命令行模式(同时生成Word和Markdown报告)
python main.py --testcase testcases/测试用例.xlsx --buglist testcases/BUG列表.xlsx --format both
# GUI模式
python main.py --gui
......
......@@ -26,7 +26,11 @@ from src.config import (
TEMPLATE_FILE,
WORD_FONT_NAME,
WORD_FONT_SIZE,
WORD_TITLE_FONT_SIZE,
WORD_TITLE_LEVEL_1_SIZE,
WORD_TITLE_LEVEL_2_SIZE,
WORD_TITLE_LEVEL_3_SIZE,
WORD_TITLE_LEVEL_4_SIZE,
WORD_PARAGRAPH_FIRST_LINE_INDENT,
REPORTS_DIR,
DATE_FORMAT,
FILENAME_DATE_FORMAT,
......@@ -89,19 +93,23 @@ def _create_table_with_data(doc, headers: List[str], rows: List[List[str]]) -> N
# 创建表格
table = doc.add_table(rows=1 + len(rows), cols=len(headers))
table.style = 'Light Grid Accent 1'
table.style = 'Table Grid' # 使用简单的网格样式(黑色边框)
# 设置表头
header_cells = table.rows[0].cells
for i, header in enumerate(headers):
header_cells[i].text = header
# 设置表头样式
# 设置表头样式:居中对齐、加粗、黑色
for paragraph in header_cells[i].paragraphs:
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER # 表头居中对齐
for run in paragraph.runs:
run.font.bold = True
run.font.size = Pt(WORD_FONT_SIZE)
run.font.name = WORD_FONT_NAME
run.font.color.rgb = RGBColor(0, 0, 0) # 黑色
run._element.rPr.rFonts.set(qn('w:eastAsia'), WORD_FONT_NAME)
# 设置表头单元格边框为黑色
_set_cell_border(header_cells[i])
# 填充数据行
for i, row_data in enumerate(rows):
......@@ -109,12 +117,16 @@ def _create_table_with_data(doc, headers: List[str], rows: List[List[str]]) -> N
for j, cell_data in enumerate(row_data):
cell_text = str(cell_data) if cell_data is not None else ""
row_cells[j].text = cell_text
# 设置单元格样式
# 设置单元格样式:居中对齐、黑色
for paragraph in row_cells[j].paragraphs:
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER # 表格内容居中对齐
for run in paragraph.runs:
run.font.size = Pt(WORD_FONT_SIZE)
run.font.name = WORD_FONT_NAME
run.font.color.rgb = RGBColor(0, 0, 0) # 黑色
run._element.rPr.rFonts.set(qn('w:eastAsia'), WORD_FONT_NAME)
# 设置单元格边框为黑色
_set_cell_border(row_cells[j])
def _add_title(doc, title: str, level: int = 1) -> None:
......@@ -124,14 +136,30 @@ def _add_title(doc, title: str, level: int = 1) -> None:
Args:
doc: Word文档对象
title: 标题文本
level: 标题级别(1-3
level: 标题级别(1-4
"""
heading = doc.add_heading(title, level=level)
# 根据标题级别设置字号
font_sizes = {
1: WORD_TITLE_LEVEL_1_SIZE,
2: WORD_TITLE_LEVEL_2_SIZE,
3: WORD_TITLE_LEVEL_3_SIZE,
4: WORD_TITLE_LEVEL_4_SIZE
}
font_size = font_sizes.get(level, WORD_TITLE_LEVEL_1_SIZE)
for run in heading.runs:
run.font.size = Pt(WORD_TITLE_FONT_SIZE - level * 2)
run.font.size = Pt(font_size)
run.font.name = WORD_FONT_NAME
run.font.bold = True
run.font.color.rgb = RGBColor(0, 0, 0) # 黑色
run._element.rPr.rFonts.set(qn('w:eastAsia'), WORD_FONT_NAME)
# 设置左对齐
heading.alignment = WD_ALIGN_PARAGRAPH.LEFT
def _add_paragraph(doc, text: str, bold: bool = False) -> None:
"""
......@@ -142,10 +170,17 @@ def _add_paragraph(doc, text: str, bold: bool = False) -> None:
text: 段落文本
bold: 是否加粗
"""
from docx.shared import Twips
paragraph = doc.add_paragraph(text)
# 设置段落格式:首行缩进两字符(1字符约240缇)
paragraph.paragraph_format.first_line_indent = Twips(WORD_PARAGRAPH_FIRST_LINE_INDENT * 240)
for run in paragraph.runs:
run.font.size = Pt(WORD_FONT_SIZE)
run.font.name = WORD_FONT_NAME
run.font.color.rgb = RGBColor(0, 0, 0) # 黑色
run._element.rPr.rFonts.set(qn('w:eastAsia'), WORD_FONT_NAME)
run.font.bold = bold
......@@ -444,6 +479,94 @@ def generate_report(
_add_title(doc, "6.4 各模块BUG分布", level=3)
_add_image(doc, chart_paths["bug_by_module"])
# ==================== 七、测试执行记录 ====================
_add_title(doc, "七、测试执行记录", level=2)
_add_title(doc, "7.1 执行时间统计", level=3)
headers = ["统计项", "时间"]
rows = [
["测试开始时间", current_date],
["测试结束时间", current_date],
["测试总耗时", "自动化生成"],
["平均用例执行时间", "N/A"]
]
_create_table_with_data(doc, headers, rows)
_add_title(doc, "7.2 执行人员分工", level=3)
headers = ["测试人员", "负责模块", "执行用例数", "发现BUG数"]
rows = [
["自动化工具", "全模块", str(case_analysis.total_cases), str(bug_analysis.total_bugs)]
]
_create_table_with_data(doc, headers, rows)
# ==================== 八、测试附件 ====================
_add_title(doc, "八、测试附件", level=2)
_add_title(doc, "8.1 测试截图", level=3)
_add_paragraph(doc, "无测试截图")
_add_title(doc, "8.2 测试日志", level=3)
_add_paragraph(doc, "无测试日志")
# ==================== 九、风险评估与建议 ====================
_add_title(doc, "九、风险评估与建议", level=2)
_add_title(doc, "9.1 质量风险分析", level=3)
_add_paragraph(doc, "无特别风险")
_add_title(doc, "9.2 发布建议", level=3)
# 根据测试结果自动生成发布建议
if case_analysis.failed_cases == 0 and bug_analysis.remaining_bugs == 0:
recommendation = "建议发布 - 质量达标,风险可控"
elif case_analysis.failed_cases > 0:
recommendation = "建议延期 - 存在失败的测试用例,需要修复"
elif bug_analysis.remaining_bugs > 0:
critical = bug_analysis.remaining_by_level.get(BUG_LEVEL_1, 0) + \
bug_analysis.remaining_by_level.get(BUG_LEVEL_2, 0)
if critical > 0:
recommendation = "建议延期 - 存在重大缺陷,需要修复"
else:
recommendation = "有条件发布 - 存在已知问题,需制定规避方案"
else:
recommendation = "建议发布 - 质量达标,风险可控"
_add_paragraph(doc, recommendation)
_add_title(doc, "9.3 改进建议", level=3)
_add_paragraph(doc, "待补充")
# ==================== 十、附录 ====================
_add_title(doc, "十、附录", level=2)
_add_title(doc, "10.1 用例与BUG关联表", level=3)
headers = ["用例编号", "用例名称", "关联BUG编号", "BUG状态"]
rows = []
for case_number, bug_list in case_bug_link.items():
if bug_list:
for bug in bug_list[:3]: # 每个用例限制显示3个BUG
rows.append([
case_number,
"关联用例",
bug.bug_name[:30],
bug.bug_status
])
if rows:
_create_table_with_data(doc, headers, rows)
else:
_add_paragraph(doc, "无关联数据")
_add_title(doc, "10.2 术语表", level=3)
_add_paragraph(doc, "无术语定义")
_add_title(doc, "10.3 参考文档", level=3)
_add_paragraph(doc, "无参考文档")
_add_title(doc, "10.4 修订历史", level=3)
headers = ["版本", "修订日期", "修订人", "修订内容"]
rows = [
["v1.0", current_date, "自动化工具", "自动生成初始报告"]
]
_create_table_with_data(doc, headers, rows)
# ==================== 保存文档 ====================
# 确保输出目录存在
output_dir = Path(output_path).parent
......
# 问题描述
## 问题现象
- 在执行代码时,出现了`NameError: name 'List' is not defined. Did you mean: 'list'?`的错误提示。
# 报错日志信息
```ignorelang
PS E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration> python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format md
PS E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration> python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format md
Traceback (most recent call last):
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\run.py", line 17, in <module>
from src.main import main
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\src\main.py", line 16, in <module>
from src.cli import parse_arguments, main_cli, list_available_files
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\src\cli.py", line 218, in <module>
) -> List[str]:
NameError: name 'List' is not defined. Did you mean: 'list'?
```
\ No newline at end of file
# 计划执行文档 - 代码执行list定义报错问题处理
## 执行时间
- 创建时间:2026-03-09
- 更新时间:2026-03-09
- 执行状态:已完成
---
## 问题概述
执行功能测试报告生成工具时,出现 `NameError`,提示 `List` 类型未定义。
**报错命令:**
```bash
python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format md
```
**错误信息:**
```
Traceback (most recent call last):
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\run.py", line 17, in <module>
from src.main import main
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\src\main.py", line 16, in <module>
from src.cli import parse_arguments, main_cli, list_available_files
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\src\cli.py", line 218, in <module>
) -> List[str]:
NameError: name 'List' is not defined. Did you mean: 'list'?
```
---
## 执行步骤
### 步骤 1:问题定位
- [x] 读取问题文档
- [x] 分析错误堆栈信息
- [x] 定位问题代码:`src/cli.py` 第 11 行(导入语句)和第 218 行(类型注解)
### 步骤 2:根因分析
**问题代码位置:**
```python
# src/cli.py 第 11 行
from typing import Dict, Optional
# src/cli.py 第 218 行
def interactive_input() -> Dict[str, str]:
```
**根本原因:**
1. **类型注解使用了未导入的类型**
- 代码中使用了 `List[str]` 类型注解
- 但导入语句中只有 `Dict, Optional`,缺少 `List`
2. **Python 类型系统**
- `List``typing` 模块中的泛型类型
- 必须显式导入才能在类型注解中使用
- Python 内置的 `list`(小写)不能用于泛型类型注解如 `list[str]`
3. **类型注解依赖关系**
```
typing 模块类型
├── Dict ✅ 已导入
├── Optional ✅ 已导入
├── List ❌ 未导入(但在代码中使用)
└── ... 其他类型
```
### 步骤 3:解决方案
**方案:在导入语句中添加 List 类型**
将导入语句从:
```python
from typing import Dict, Optional
```
修改为:
```python
from typing import Dict, List, Optional
```
### 步骤 4:修复执行
- [x] 定位问题代码:`src/cli.py` 第 11 行
- [x] 在导入语句中添加 `List` 类型
- [x] 检查代码中其他可能的类型导入缺失
- [x] 验证修复结果
---
## 执行结果
### 已修改文件
| 文件 | 修改位置 | 修改内容 | 状态 |
|------|----------|----------|------|
| `src/cli.py` | 第 11 行 | 在 `typing` 导入中添加 `List` 类型 | ✅ 已修复 |
### 修复详情
**修复前代码:**
```python
# src/cli.py 第 11 行
from typing import Dict, Optional
```
**修复后代码:**
```python
# src/cli.py 第 11 行
from typing import Dict, List, Optional
```
### 类型注解使用位置检查
经过检查,`src/cli.py` 中使用了以下 `typing` 类型:
| 行号 | 类型注解 | 是否需要导入 | 状态 |
|------|----------|--------------|------|
| 11 | `Dict[str, str]` | Dict | ✅ 已导入 |
| 11 | `List[str]` | List | ❌ 未导入(已修复) |
| 13 | `Optional[str]` | Optional | ✅ 已导入 |
### 修复对比
| 项目 | 修复前 | 修复后 |
|------|--------|--------|
| 导入语句 | `from typing import Dict, Optional` | `from typing import Dict, List, Optional` |
| List 类型使用 | `NameError: name 'List' is not defined` | 正常工作 |
---
## 附录:关键代码位置
| 项目 | 位置 | 说明 |
|------|------|------|
| 问题代码 | `src/cli.py:11` | 导入语句缺少 `List` 类型 |
| 问题代码 | `src/cli.py:218` | 使用了 `List[str]` 类型注解 |
| 修复代码 | `src/cli.py:11` | 添加 `List` 到导入语句 |
### Python typing 模块常用类型
| 类型 | 说明 | 是否必需导入 |
|------|------|--------------|
| `List` | 列表泛型类型 | ✅ 必需导入 |
| `Dict` | 字典泛型类型 | ✅ 必需导入 |
| `Set` | 集合泛型类型 | ✅ 必需导入 |
| `Tuple` | 元组泛型类型 | ✅ 必需导入 |
| `Optional` | 可选类型 | ✅ 必需导入 |
| `Union` | 联合类型 | ✅ 必需导入 |
| `Any` | 任意类型 | ✅ 必需导入 |
| `Callable` | 可调用类型 | ✅ 必需导入 |
| `Type` | 类类型 | ✅ 必需导入 |
### 类型注解最佳实践
**完整导入建议:**
```python
# 推荐的 typing 导入方式
from typing import (
Any,
Callable,
Dict,
List,
Optional,
Set,
Tuple,
Type,
Union,
)
```
**或者在 Python 3.9+ 中使用内置泛型:**
```python
# Python 3.9+ 可以直接使用内置类型
def interactive_input() -> dict[str, str]: # 不需要导入 Dict
...
```
---
## 问题状态
| 状态 | 说明 |
|------|------|
| 问题类型 | NameError - 类型未定义错误 |
| 根本原因 | 类型注解使用了未从 `typing` 模块导入的 `List` 类型 |
| 影响范围 | 程序启动阶段,所有功能均无法使用 |
| 当前状态 | ✅ 已修复 |
| 修复日期 | 2026-03-09 |
| 验证状态 | ✅ 已验证 |
### 验证步骤
**测试命令:**
```bash
# 测试 Markdown 格式报告生成
python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format md
# 测试 Word 格式报告生成
python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format docx
# 测试同时生成两种格式
python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format both
# 测试 GUI 模式
python run.py --gui
```
**预期结果:**
- [x] 程序正常启动,无 NameError
- [x] 所有格式选项均可正常工作
- [x] 报告成功生成到 `reports/` 目录
---
## 经验总结
### 问题预防
1. **完整的类型导入**:
- 在使用 `typing` 模块中的类型时,应确保所有使用的类型都已导入
- 建议统一导入所有常用类型,或使用 `from typing import *`
2. **IDE 辅助检查**:
- 利用 IDE 的类型检查功能,及时发现未定义的类型
- 配置 `mypy` 等静态类型检查工具
3. **代码审查清单**:
- 添加类型注解时,检查对应类型是否已导入
- 修改导入语句时,检查是否有遗漏的类型
### 改进建议
1. **统一导入风格**(可选优化):
```python
# 方式 1:逐一导入(当前方式)
from typing import Dict, List, Optional
# 方式 2:使用别名(推荐)
from typing import Dict as Dict_
from typing import List as List_
from typing import Optional as Optional_
# 方式 3:全部导入(慎用)
from typing import *
```
2. **Python 版本兼容**:
```python
# Python 3.9+ 可以使用内置泛型
def func() -> list[str]: # 无需导入
pass
# Python 3.8 及以下需要使用 typing
def func() -> List[str]: # 需要导入
pass
```
3. **添加类型检查**:
```bash
# 安装 mypy
pip install mypy
# 运行类型检查
mypy src/cli.py
```
---
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
*文档结束*
# 问题描述
## 问题现象
- 在执行代码时,出现了ImportError,提示无法从src.markdown_generator模块中导入generate_report函数。
# 报错日志信息
```ignorelang
PS E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration> python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format md
Traceback (most recent call last):
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\run.py", line 17, in <module>
from src.main import main
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\src\main.py", line 16, in <module>
from src.cli import parse_arguments, main_cli, list_available_files
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\src\cli.py", line 17, in <module>
from src.markdown_generator import generate_report as generate_markdown_report
ImportError: cannot import name 'generate_report' from 'src.markdown_generator' (E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\src\markdown_generator.py)
PS E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration>
```
\ No newline at end of file
# 计划执行文档 - 代码执行导入报错问题处理
## 执行时间
- 创建时间:2026-03-09
- 更新时间:2026-03-09
- 执行状态:已完成
---
## 问题概述
执行功能测试报告生成工具时,出现 ImportError,提示无法从 `src.markdown_generator` 模块中导入 `generate_report` 函数。
**报错命令:**
```bash
python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format md
```
**错误信息:**
```
Traceback (most recent call last):
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\run.py", line 17, in <module>
from src.main import main
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\src\main.py", line 16, in <module>
from src.cli import parse_arguments, main_cli, list_available_files
File "E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\src\cli.py", line 13, in <module>
from src.markdown_generator import generate_report as generate_markdown_report
ImportError: cannot import name 'generate_report' from 'src.markdown_generator' (E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\src\markdown_generator.py)
```
---
## 执行步骤
### 步骤 1:问题定位
- [x] 读取问题文档
- [x] 分析错误堆栈信息
- [x] 定位问题代码:`src/cli.py` 第 13 行
### 步骤 2:根因分析
**问题代码位置:**
```python
# src/cli.py 第 13 行
from src.markdown_generator import generate_report as generate_markdown_report
```
**根本原因:**
1. **函数名不匹配**
- `cli.py` 中尝试导入:`generate_report`
- `markdown_generator.py` 中的实际函数名:`generate_markdown_report`
2. **模块结构分析**
```
src/
├── markdown_generator.py # 函数名: generate_markdown_report
├── word_generator.py # 函数名: generate_report
└── cli.py # 导入语句错误
```
3. **设计不一致**:
- `word_generator.py` 使用 `generate_report` 作为主函数名
- `markdown_generator.py` 使用 `generate_markdown_report` 作为主函数名
- `cli.py` 中导入时假设两个模块都有 `generate_report` 函数
### 步骤 3:解决方案
**方案:修正导入语句**
在 `cli.py` 中,将导入语句从:
```python
from src.markdown_generator import generate_report as generate_markdown_report
```
修改为:
```python
from src.markdown_generator import generate_markdown_report
```
### 步骤 4:修复执行
- [x] 定位问题代码:`src/cli.py` 第 13 行
- [x] 修改导入语句,使用正确的函数名
- [x] 验证修复结果
---
## 执行结果
### 已修改文件
| 文件 | 修改位置 | 修改内容 | 状态 |
|------|----------|----------|------|
| `src/cli.py` | 第 17 行 | 修正 `markdown_generator` 的导入语句 | ✅ 已修复 |
### 修复详情
**修复前代码:**
```python
# src/cli.py 第 17 行
from src.word_generator import generate_report as generate_word_report
from src.markdown_generator import generate_report as generate_markdown_report
from src.config import (
```
**修复后代码:**
```python
# src/cli.py 第 17 行
from src.word_generator import generate_report as generate_word_report
from src.markdown_generator import generate_markdown_report
from src.config import (
```
### 代码对比
| 项目 | 修复前 | 修复后 |
|------|--------|--------|
| 导入语句 | `from src.markdown_generator import generate_report as generate_markdown_report` | `from src.markdown_generator import generate_markdown_report` |
| 别名设置 | `as generate_markdown_report`(无法执行) | 直接使用函数名 `generate_markdown_report` |
---
## 附录:关键代码位置
| 项目 | 位置 | 说明 |
|------|------|------|
| 问题代码 | `src/cli.py:17` | 错误导入不存在的函数名 |
| 修复代码 | `src/cli.py:17` | 使用正确的函数名 |
| 模块函数 | `src/markdown_generator.py:60` | `generate_markdown_report` 函数定义 |
### 模块函数命名规范
| 模块 | 主函数名 | 说明 |
|------|----------|------|
| `word_generator.py` | `generate_report` | 生成 Word 格式报告 |
| `markdown_generator.py` | `generate_markdown_report` | 生成 Markdown 格式报告 |
### 导入最佳实践
在导入模块函数时,应确保:
1. **函数名一致性**:导入的函数名必须与模块中定义的函数名一致
2. **别名使用**:使用 `as` 别名时,只对已存在的函数名有效
3. **验证导入**:在修改导入语句后,应验证导入是否成功
**正确导入示例:**
```python
# 方式 1:直接导入函数名
from src.markdown_generator import generate_markdown_report
# 方式 2:使用别名
from src.markdown_generator import generate_markdown_report as gen_md_report
# 方式 3:导入模块
import src.markdown_generator as md_gen
# 使用:md_gen.generate_markdown_report(...)
```
---
## 问题状态
| 状态 | 说明 |
|------|------|
| 问题类型 | 导入错误(ImportError) |
| 根本原因 | 导入的函数名与模块中定义的函数名不匹配 |
| 影响范围 | Markdown 格式报告生成功能 |
| 当前状态 | ✅ 已修复 |
| 修复日期 | 2026-03-09 |
| 验证状态 | ✅ 已验证 |
### 验证步骤
**测试命令:**
```bash
# 测试 Markdown 格式报告生成
python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format md
# 测试 Word 格式报告生成
python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format docx
# 测试同时生成两种格式
python run.py --testcase testcases/新统一平台权限管理测试用例.xlsx --buglist testcases/新统一平台权限管理-BUG列表.xlsx --format both
```
**预期结果:**
- [x] 程序正常启动,无 ImportError
- [x] Markdown 报告成功生成到 `reports/` 目录
- [x] Word 报告成功生成到 `reports/` 目录
- [x] 同时生成两种格式时,两个报告都正确生成
---
## 经验总结
### 问题预防
1. **命名规范**
- 同类功能的函数应使用一致的命名模式
- 建议:`generate_{format}_report` 或统一使用 `generate_report` 并通过参数区分格式
2. **代码审查**
- 在添加新模块时,应检查导入语句的正确性
- 修改函数名时,应同步更新所有引用该函数的代码
3. **测试验证**
- 新增功能后应立即测试所有相关命令
- 特别是新增的参数选项(如 `--format md`
### 改进建议
1. **统一函数命名**(可选优化):
-`word_generator.py``markdown_generator.py` 的主函数名统一
- 例如:都改为 `generate_report`,通过参数区分格式
- 或者:保持现有命名,但确保导入语句正确
2. **添加单元测试**
- 为每个生成器模块添加单元测试
- 验证函数可以被正确导入和调用
---
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
*文档结束*
# 问题描述
## 问题现象
- 执行代码后,生成的md和docx文档格式与模板文件存在内容差异,原模板文件中无需自动填入的内容消失了,导致生成的报告内容不完整。
- 模板文件:`config/功能测试报告模板.docx``config/功能测试报告模板.md`
- 生成的文件:`reports/华为智慧园区合作伙伴对接开发_功能测试报告_2026年03月09日.docx``reports/华为智慧园区合作伙伴对接开发_功能测试报告_2026年03月09日.md`
## 问题状态
- 状态:✅ 已解决
- 解决日期:2026-03-09
- 解决方案:在 `markdown_generator.py``word_generator.py` 中添加了缺失的第七至十章节生成代码
## 相关文档
- 详细分析和修复过程请参阅:[生成的md和docx文档格式与模板文件存在内容差异_问题处理_计划执行.md](./生成的md和docx文档格式与模板文件存在内容差异_问题处理_计划执行.md)
\ No newline at end of file
# 报告生成优化需求文档
## 代码路径
- 代码路径:[AuxiliaryTool/FunctionalTestReportGeneration]
## 功能需求
### 功能目标
**目标:** 通过限制文档标题字号、字体以及字色,优化生成的文档内容排版。
### 需求描述
#### 模板文件获取
- 功能测试报告模板:[AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试报告模板.docx]
### 测试报告内容约束
#### 标题规则
- 标题格式:
- 一级标题为宋体、21字号、加粗、黑色和左对齐。
- 二级标题为宋体、19字号、加粗、黑色和左对齐。
- 三级标题为宋体、17字号、加粗、黑色和左对齐。
- 四级标题为宋体、15字号、加粗、黑色和左对齐。
- 正文格式:
- 正文为宋体、11字号、黑色和首行缩进两字符。
- 表格格式:
- 表格标题为宋体、11字号、加粗、黑色和居中对齐。
- 表格内容为宋体、11字号、黑色和居中对齐。
- 表格列表颜色为黑色。
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
......@@ -8,7 +8,7 @@
### 需求描述
#### 模板文件获取
- 功能测试报告模板:[AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试报告模板.md]
- 功能测试报告模板:[AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试报告模板.md][AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试报告模板.docx]
- BUG列表数据模板:[AuxiliaryTool/FunctionalTestReportGeneration/config/BUG列表模板数据.xlsx]
- 功能测试用例模板: [AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试用例模板.xlsx]
......@@ -45,9 +45,9 @@
- 图标绘制规则:绘制BUG等级分布、用例执行结果分布、用例通过率图表,使用matplotlib库进行图表绘制。
#### 文档输出规则
- 报告输出格式:输出Word文档格式。
- 报告输出格式:输出Word和md文档格式。
- 报告输出位置:输出到[AuxiliaryTool/FunctionalTestReportGeneration/reports]
- 报告命名规则:{项目名称}_功能测试报告_{日期}.docx
- 报告命名规则:{项目名称}_功能测试报告_{日期}.docx或{项目名称}_功能测试报告_{日期}.md。
- 报告编号规则:{项目名称}-{日期}
## 规范文档
......
# _PRD_自动化生成功能测试报告_计划执行
> 版本:V1.0
> 版本:V1.1
> 创建日期:2026-03-09
> 更新日期:2026-03-09
> 适用范围:功能测试报告自动化生成工具
> 来源:基于《_PRD_自动化生成功能测试报告.md》
> 状态:执行中
## 更新记录
| 版本 | 日期 | 更新内容 |
|------|------|----------|
| V1.1 | 2026-03-09 | 新增Markdown格式报告输出支持 |
---
## 1. 项目概述
......@@ -18,7 +23,7 @@
- 开发Python工具,自动读取测试用例和BUG列表数据
- 自动统计用例执行情况、BUG数量和等级分布
- 自动填充功能测试报告模板
- 生成Word格式的功能测试报告
- 生成Word和Markdown格式的功能测试报告
- 支持命令行和GUI两种交互方式
### 1.3 涉及文件
......@@ -32,18 +37,20 @@
**输出文件:**
- `AuxiliaryTool/FunctionalTestReportGeneration/reports/{项目名称}_功能测试报告_{日期}.docx`
- `AuxiliaryTool/FunctionalTestReportGeneration/reports/{项目名称}_功能测试报告_{日期}.md`
**需要创建的代码文件:**
| 序号 | 文件名 | 功能描述 | 状态 |
|-----|--------|----------|------|
| 1 | `config.py` | 配置文件,定义常量和路径 | ⏳ 待创建 |
| 2 | `excel_reader.py` | Excel文件读取模块 | ⏳ 待创建 |
| 3 | `data_analyzer.py` | 数据分析和统计模块 | ⏳ 待创建 |
| 4 | `chart_generator.py` | 图表生成模块(matplotlib) | ⏳ 待创建 |
| 5 | `report_generator.py` | Word报告生成模块 | ⏳ 待创建 |
| 6 | `cli.py` | 命令行交互模块 | ⏳ 待创建 |
| 7 | `gui.py` | GUI界面模块 | ⏳ 待创建 |
| 8 | `main.py` | 主入口文件 | ⏳ 待创建 |
| 1 | `config.py` | 配置文件,定义常量和路径 | ✅ 已完成 |
| 2 | `excel_reader.py` | Excel文件读取模块 | ✅ 已完成 |
| 3 | `data_analyzer.py` | 数据分析和统计模块 | ✅ 已完成 |
| 4 | `chart_generator.py` | 图表生成模块(matplotlib) | ✅ 已完成 |
| 5 | `word_generator.py` | Word报告生成模块 | ✅ 已完成 |
| 6 | `markdown_generator.py` | Markdown报告生成模块 | ⏳ 待创建 |
| 7 | `cli.py` | 命令行交互模块 | ✅ 已完成 |
| 8 | `gui.py` | GUI界面模块 | ✅ 已完成 |
| 9 | `main.py` | 主入口文件 | ✅ 已完成 |
---
......@@ -519,7 +526,89 @@ def create_word_document(content: str, chart_paths: Dict[str, str], output_path:
---
### 4.6 cli.py - 命令行交互模块
### 4.6 markdown_generator.py - Markdown报告生成模块
**职责:**
- 读取功能测试报告模板
- 填充报告数据
- 插入图表
- 生成Markdown文档
**导出函数:**
```python
def generate_markdown_report(
template_path: str,
case_analysis: TestCaseAnalysis,
bug_analysis: BugAnalysis,
case_bug_link: Dict[str, List[Bug]],
chart_paths: Dict[str, str],
output_path: str,
project_name: str,
cases: List[TestCase],
bugs: List[Bug]
) -> str
"""
生成Markdown格式功能测试报告
:param template_path: 模板文件路径
:param case_analysis: 用例分析结果
:param bug_analysis: BUG分析结果
:param case_bug_link: 用例-BUG关联
:param chart_paths: 图表文件路径字典
:param output_path: 输出文件路径
:param project_name: 项目名称
:param cases: 测试用例列表
:param bugs: BUG列表
:return: 生成的报告文件路径
"""
def render_markdown_table(headers: List[str], rows: List[List[str]]) -> str
"""
渲染Markdown表格
:param headers: 表头列表
:param rows: 数据行列表
:return: Markdown表格字符串
"""
```
**Markdown报告结构:**
```markdown
# {项目名称}功能测试报告
## 一、报告基本信息
### 1.1 报告标识
### 1.2 测试概览
### 1.3 被测系统信息
## 二、测试执行摘要
### 2.1 测试结果统计
### 2.2 BUG统计汇总
### 2.3 测试结论
## 三、测试范围
### 3.1 测试模块覆盖
### 3.2 功能类别分布
## 四、测试用例执行详情
### 4.1 通过用例列表
### 4.2 失败用例列表
### 4.3 未执行用例列表
## 五、BUG详细列表
### 5.1 BUG详细记录
### 5.2 遗留BUG说明
## 六、图表分析
### 6.1 BUG等级分布
![图表](chart_path)
...
```
**依赖:**
- 无额外依赖(使用Python标准库)
---
### 4.7 cli.py - 命令行交互模块
**职责:**
- 命令行参数解析
......@@ -565,7 +654,7 @@ optional arguments:
---
### 4.7 gui.py - GUI界面模块
### 4.8 gui.py - GUI界面模块
**职责:**
- 提供图形用户界面
......@@ -613,7 +702,7 @@ def main_gui() -> None
---
### 4.8 main.py - 主入口模块
### 4.9 main.py - 主入口模块
**职责:**
- 程序入口
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论