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

feat(testing): 添加功能测试报告自动生成工具

- 创建功能测试报告自动生成工具(AuxiliaryTool/FunctionalTestReportGeneration)
- 添加PRD文档定义功能需求、数据结构和程序架构
- 设计测试用例和BUG列表Excel文件的数据结构
- 实现模块化架构包含配置、数据读取、分析、图表生成和报告生成组件
- 定义命令行和GUI两种交互方式
- 添加功能测试报告模板和数据模板文件
- 更新Claude设置添加mkdir权限
- 创建详细的执行计划和测试计划文档
上级 2d320395
......@@ -123,7 +123,8 @@
"mcp__chrome-devtools__close_page",
"mcp__chrome-devtools__list_pages",
"mcp__chrome-devtools__fill_form",
"Bash(grep:*)"
"Bash(grep:*)",
"Bash(mkdir:*)"
]
}
}
# 功能测试报告自动生成工具
## 功能简介
本工具通过读取测试用例Excel文件和BUG列表Excel文件,自动生成功能测试报告(Word格式)。
### 主要功能
- 自动读取测试用例和BUG列表数据
- 统计用例执行情况、BUG数量和等级分布
- 自动关联用例与BUG
- 生成统计图表(饼图、柱状图)
- 生成Word格式的功能测试报告
## 环境要求
- Python 3.7+
- 依赖包见 `requirements.txt`
## 安装
### 1. 安装依赖
```bash
pip install -r requirements.txt
```
### 2. 准备测试数据
将测试用例Excel文件和BUG列表Excel文件放入 `testcases/` 目录。
## 使用方法
### 方式一:交互式命令行模式
```bash
python run.py
```
按照提示输入文件路径即可。
### 方式二:命令行参数模式
```bash
python run.py --testcase testcases/测试用例.xlsx --buglist testcases/BUG列表.xlsx
```
完整参数说明:
| 参数 | 说明 |
|------|------|
| `--testcase` | 测试用例Excel文件路径 |
| `--buglist` | BUG列表Excel文件路径 |
| `--output` | 输出报告文件路径(可选) |
| `--project` | 项目名称(可选) |
| `--gui` | 使用GUI界面 |
| `--list` | 列出testcases目录下的可用文件 |
### 方式三:GUI界面模式
```bash
python run.py --gui
```
## 文件说明
### 目录结构
```
FunctionalTestReportGeneration/
├── src/ # 源代码目录
│ ├── config.py # 配置模块
│ ├── excel_reader.py # Excel读取模块
│ ├── data_analyzer.py # 数据分析模块
│ ├── chart_generator.py # 图表生成模块
│ ├── report_generator.py # 报告生成模块
│ ├── cli.py # 命令行交互模块
│ ├── gui.py # GUI界面模块
│ └── main.py # 主入口模块
├── config/ # 配置文件目录
│ ├── 功能测试报告模板.md
│ ├── BUG列表模板数据.xlsx
│ └── 功能测试用例模板.xlsx
├── testcases/ # 测试数据目录
├── reports/ # 报告输出目录
├── temp/ # 临时文件目录(图表等)
├── run.py # 入口脚本
├── requirements.txt # 依赖包列表
└── README.md # 本文档
```
## 数据格式说明
### 测试用例Excel文件格式
| 列号 | 列名 | 必填 | 说明 |
|------|------|------|------|
| 1 | 序列号 | ✅ | 用例序号 |
| 2 | 功能模块 | ✅ | 功能模块名称 |
| 3 | 功能类别 | ✅ | 功能类别 |
| 4 | 用例编号 | ✅ | 用例编号(如:XTY-001) |
| 5 | 功能描述 | ✅ | 功能描述 |
| 6 | 用例等级 | ✅ | 用例等级(1-4级) |
| 7 | 功能编号 | ✅ | 功能编号 |
| 8 | 用例名称 | ✅ | 用例名称 |
| 9 | 预置条件 | ✅ | 预置条件 |
| 10 | STEP | ✅ | 测试步骤 |
| 13 | 测试结果 | ✅ | 测试结果(通过/失败/未验证/未开发) |
**注意:** 表头在第3行,数据从第4行开始。
### BUG列表Excel文件格式
| 列号 | 列名 | 必填 | 说明 |
|------|------|------|------|
| 1 | 项目名称 | ✅ | 项目名称 |
| 2 | BUG类型 | ✅ | BUG类型 |
| 3 | BUG等级 | ✅ | BUG等级(1级/2级/3级/4级) |
| 4 | BUG状态 | ✅ | BUG状态(激活/已解决/已关闭) |
| 5 | BUG名称 | ✅ | BUG名称 |
| 6 | 提单人员 | ✅ | 提单人员 |
| 7 | 主负责人员 | ✅ | 主负责人员 |
| 8 | 截止日期 | ✅ | 截止日期 |
| 9 | 复现步骤 | ✅ | 复现步骤(包含用例编号) |
**注意:** 表头在第1行,数据从第2行开始。
## 输出报告
报告将保存到 `reports/` 目录,文件名格式为:
```
{项目名称}_功能测试报告_{日期}.docx
```
报告包含以下内容:
1. 报告基本信息
2. 测试执行摘要
3. 测试范围
4. 测试用例执行详情
5. BUG详细列表
6. 图表分析
## 常见问题
### Q1: 提示"未安装python-docx库"
**解决方案:**
```bash
pip install python-docx
```
### Q2: 提示"未安装matplotlib库"
**解决方案:**
```bash
pip install matplotlib
```
### Q3: 中文显示乱码
**解决方案:**
- Windows系统:确保已安装微软雅黑字体
- Linux系统:安装中文字体包 `fonts-wqy-microhei``fonts-wqy-zenhei`
### Q4: 图表无法显示
**解决方案:**
检查matplotlib是否正确安装,并确保系统有可用的中文字体。
## 版本历史
| 版本 | 日期 | 说明 |
|------|------|------|
| v1.0.0 | 2026-03-09 | 初始版本 |
## 联系方式
如有问题或建议,请联系开发团队。
# 功能测试报告自动生成工具 - 依赖包列表
# Excel文件读取
openpyxl>=3.1.0
# Word文档操作
python-docx>=1.0.0
# 图表生成
matplotlib>=3.7.0
# 进度条显示(可选)
tqdm>=4.65.0
# -*- coding: utf-8 -*-
"""
功能测试报告自动生成工具 - 入口脚本
本脚本是程序的主入口,位于项目根目录
"""
import sys
import os
# 添加src目录到Python路径
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
SRC_DIR = os.path.join(ROOT_DIR, "src")
sys.path.insert(0, SRC_DIR)
sys.path.insert(0, ROOT_DIR)
from src.main import main
if __name__ == "__main__":
main()
# -*- coding: utf-8 -*-
"""
功能测试报告自动生成工具
本工具通过读取测试用例Excel文件和BUG列表Excel文件,
自动生成功能测试报告(Word格式)
"""
__version__ = "1.0.0"
from src.config import *
# -*- coding: utf-8 -*-
"""
功能测试报告自动生成工具 - 命令行交互模块
本模块负责命令行参数解析、用户输入获取、进度显示
"""
import argparse
import sys
from pathlib import Path
from typing import Dict, 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.config import (
TESTCASES_DIR,
REPORTS_DIR,
get_report_filename,
)
def parse_arguments() -> argparse.Namespace:
"""
解析命令行参数
Returns:
参数对象
"""
parser = argparse.ArgumentParser(
prog='功能测试报告生成工具',
description='通过测试用例和BUG列表自动生成功能测试报告(Word格式)'
)
parser.add_argument(
'--testcase',
type=str,
help='测试用例Excel文件路径'
)
parser.add_argument(
'--buglist',
type=str,
help='BUG列表Excel文件路径'
)
parser.add_argument(
'--output',
type=str,
help='输出报告文件路径(可选,默认为reports目录)'
)
parser.add_argument(
'--project',
type=str,
help='项目名称(可选,默认从BUG列表中读取)'
)
parser.add_argument(
'--gui',
action='store_true',
help='使用GUI界面'
)
parser.add_argument(
'--list',
action='store_true',
help='列出testcases目录下的可用文件'
)
return parser.parse_args()
def list_available_files() -> None:
"""
列出testcases目录下的可用文件
"""
print("\n=== 测试用例文件 ===")
case_files = list(TESTCASES_DIR.glob("*测试用例*.xlsx"))
if case_files:
for i, f in enumerate(case_files, 1):
print(f" {i}. {f.name}")
else:
print(" 未找到测试用例文件")
print("\n=== BUG列表文件 ===")
bug_files = list(TESTCASES_DIR.glob("*BUG*.xlsx"))
if bug_files:
for i, f in enumerate(bug_files, 1):
print(f" {i}. {f.name}")
else:
print(" 未找到BUG列表文件")
print()
def interactive_input() -> Dict[str, str]:
"""
交互式输入
Returns:
输入数据字典
"""
print("\n=== 功能测试报告生成工具 ===\n")
# 列出可用文件
list_available_files()
result = {}
# 获取测试用例文件路径
while True:
testcase_path = input("请输入测试用例Excel文件路径(或直接回车使用默认): ").strip()
if not testcase_path:
# 尝试使用默认文件
case_files = list(TESTCASES_DIR.glob("*测试用例*.xlsx"))
if case_files:
testcase_path = str(case_files[0])
print(f"使用默认文件: {testcase_path}")
break
else:
print("未找到默认测试用例文件,请输入有效路径")
elif Path(testcase_path).exists():
break
else:
print(f"文件不存在: {testcase_path}")
result["testcase"] = testcase_path
# 获取BUG列表文件路径
while True:
buglist_path = input("请输入BUG列表Excel文件路径(或直接回车使用默认): ").strip()
if not buglist_path:
# 尝试使用默认文件
bug_files = list(TESTCASES_DIR.glob("*BUG*.xlsx"))
if bug_files:
buglist_path = str(bug_files[0])
print(f"使用默认文件: {buglist_path}")
break
else:
print("未找到默认BUG列表文件,请输入有效路径")
elif Path(buglist_path).exists():
break
else:
print(f"文件不存在: {buglist_path}")
result["buglist"] = buglist_path
# 获取输出路径
output_path = input(f"请输入输出报告路径(或直接回车保存到{REPORTS_DIR}目录): ").strip()
if not output_path:
result["output"] = None # 使用默认路径
else:
result["output"] = output_path
# 获取项目名称
project_name = input("请输入项目名称(或直接回车自动获取): ").strip()
result["project"] = project_name if project_name else None
return result
def show_progress(current: int, total: int, message: str = "") -> None:
"""
显示进度
Args:
current: 当前进度
total: 总数
message: 进度消息
"""
if total == 0:
percent = 100
else:
percent = int(current / total * 100)
bar_length = 50
filled = int(bar_length * current / total) if total > 0 else bar_length
bar = '█' * filled + '░' * (bar_length - filled)
print(f"\r[{bar}] {percent}% {message}", end='', flush=True)
if current >= total:
print() # 换行
def generate_report_main(
testcase_path: str,
buglist_path: str,
output_path: Optional[str] = None,
project_name: Optional[str] = None
) -> str:
"""
生成报告的主函数
Args:
testcase_path: 测试用例Excel文件路径
buglist_path: BUG列表Excel文件路径
output_path: 输出报告文件路径(可选)
project_name: 项目名称(可选)
Returns:
生成的报告文件路径
"""
print("\n=== 开始生成功能测试报告 ===\n")
# 步骤1:读取Excel数据
print("步骤1/5: 读取测试数据...")
try:
test_cases = read_test_cases(testcase_path)
print(f" ✓ 读取到 {len(test_cases)} 条测试用例")
except Exception as e:
print(f" ✗ 读取测试用例失败: {str(e)}")
sys.exit(1)
try:
bugs = read_bug_list(buglist_path)
print(f" ✓ 读取到 {len(bugs)} 条BUG记录")
except Exception as e:
print(f" ✗ 读取BUG列表失败: {str(e)}")
sys.exit(1)
# 获取项目名称
if not project_name and bugs:
project_name = bugs[0].project_name
if not project_name:
project_name = "未命名项目"
print(f" 项目名称: {project_name}")
# 步骤2:分析数据
print("\n步骤2/5: 分析测试数据...")
case_analysis = analyze_test_cases(test_cases)
print(f" ✓ 总用例数: {case_analysis.total_cases}")
print(f" ✓ 通过率: {case_analysis.pass_rate}%")
bug_analysis = analyze_bugs(bugs)
print(f" ✓ BUG总数: {bug_analysis.total_bugs}")
print(f" ✓ 遗留BUG: {bug_analysis.remaining_bugs}")
case_bug_link = link_bugs_to_cases(bugs, test_cases)
print(f" ✓ 关联了 {len(case_bug_link)} 个用例到BUG")
# 步骤3:生成图表
print("\n步骤3/5: 生成统计图表...")
try:
from src.chart_generator import generate_all_charts
chart_paths = generate_all_charts(case_analysis, bug_analysis)
print(f" ✓ 生成了 {len(chart_paths)} 个图表")
except Exception as e:
print(f" ⚠ 生成图表失败: {str(e)}")
chart_paths = {}
# 步骤4:生成报告
print("\n步骤4/5: 生成Word报告...")
if output_path is None:
output_path = str(REPORTS_DIR / get_report_filename(project_name))
try:
report_path = generate_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,
project_name=project_name,
cases=test_cases,
bugs=bugs
)
print(f" ✓ 报告已生成: {report_path}")
except Exception as e:
print(f" ✗ 生成报告失败: {str(e)}")
import traceback
traceback.print_exc()
sys.exit(1)
# 步骤5:完成
print("\n步骤5/5: 完成!")
print(f"\n报告已保存到: {report_path}")
return report_path
def main_cli() -> None:
"""
命令行主函数
"""
# 解析参数
args = parse_arguments()
# 处理--list参数
if args.list:
list_available_files()
return
# 处理--gui参数
if args.gui:
from src.gui import main_gui
main_gui()
return
# 获取输入参数
if args.testcase and args.buglist:
# 使用命令行参数
testcase_path = args.testcase
buglist_path = args.buglist
output_path = args.output
project_name = args.project
else:
# 交互式输入
inputs = interactive_input()
testcase_path = inputs["testcase"]
buglist_path = inputs["buglist"]
output_path = inputs.get("output")
project_name = inputs.get("project")
# 生成报告
try:
generate_report_main(
testcase_path=testcase_path,
buglist_path=buglist_path,
output_path=output_path,
project_name=project_name
)
except KeyboardInterrupt:
print("\n\n操作已取消")
sys.exit(0)
except Exception as e:
print(f"\n错误: {str(e)}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main_cli()
# -*- coding: utf-8 -*-
"""
功能测试报告自动生成工具 - 配置模块
本模块定义程序的所有常量、路径配置和数据枚举值
"""
from pathlib import Path
from typing import List
# ================================
# 路径配置
# ================================
# 项目根目录
BASE_DIR = Path(__file__).parent.parent
# 源代码目录
SRC_DIR = BASE_DIR / "src"
# 配置文件目录
CONFIG_DIR = BASE_DIR / "config"
# 测试用例数据目录
TESTCASES_DIR = BASE_DIR / "testcases"
# 报告输出目录
REPORTS_DIR = BASE_DIR / "reports"
# 临时文件目录(存放图表等)
TEMP_DIR = BASE_DIR / "temp"
# 模板文件路径
TEMPLATE_FILE = CONFIG_DIR / "功能测试报告模板.md"
BUG_TEMPLATE_FILE = CONFIG_DIR / "BUG列表模板数据.xlsx"
CASE_TEMPLATE_FILE = CONFIG_DIR / "功能测试用例模板.xlsx"
# ================================
# 测试结果枚举值
# ================================
TEST_RESULT_PASS = "通过"
TEST_RESULT_FAIL = "失败"
TEST_RESULT_UNVERIFIED = "未验证"
TEST_RESULT_UNDEVELOPED = "未开发"
# 所有测试结果枚举
TEST_RESULT_VALUES = [
TEST_RESULT_PASS,
TEST_RESULT_FAIL,
TEST_RESULT_UNVERIFIED,
TEST_RESULT_UNDEVELOPED
]
# ================================
# BUG状态枚举值
# ================================
BUG_STATUS_ACTIVE = "激活"
BUG_STATUS_RESOLVED = "已解决"
BUG_STATUS_CLOSED = "已关闭"
# 所有BUG状态枚举
BUG_STATUS_VALUES = [
BUG_STATUS_ACTIVE,
BUG_STATUS_RESOLVED,
BUG_STATUS_CLOSED
]
# 遗留BUG状态(未关闭的BUG)
REMAINING_BUG_STATUS: List[str] = [
BUG_STATUS_ACTIVE,
BUG_STATUS_RESOLVED
]
# ================================
# BUG等级枚举值
# ================================
BUG_LEVEL_1 = "1级" # 致命
BUG_LEVEL_2 = "2级" # 严重
BUG_LEVEL_3 = "3级" # 一般
BUG_LEVEL_4 = "4级" # 轻微
# 所有BUG等级枚举
BUG_LEVEL_VALUES = [
BUG_LEVEL_1,
BUG_LEVEL_2,
BUG_LEVEL_3,
BUG_LEVEL_4
]
# BUG等级描述映射
BUG_LEVEL_DESCRIPTION = {
BUG_LEVEL_1: "致命",
BUG_LEVEL_2: "严重",
BUG_LEVEL_3: "一般",
BUG_LEVEL_4: "轻微"
}
# ================================
# 日期格式配置
# ================================
# 日期格式(用于报告生成)
DATE_FORMAT = "%Y年%m月%d日"
# 报告文件名中的日期格式
FILENAME_DATE_FORMAT = "%Y年%m月%d日"
# ================================
# Excel数据读取配置
# ================================
# 测试用例Excel数据起始行(表头在第3行,数据从第4行开始)
CASE_DATA_START_ROW = 4
# BUG列表Excel数据起始行(表头在第1行,数据从第2行开始)
BUG_DATA_START_ROW = 2
# 测试用例Excel列索引(从1开始)
CASE_COL_SERIAL_NUMBER = 1 # 序列号
CASE_COL_MODULE = 2 # 功能模块
CASE_COL_CATEGORY = 3 # 功能类别
CASE_COL_CASE_NUMBER = 4 # 用例编号
CASE_COL_DESCRIPTION = 5 # 功能描述
CASE_COL_LEVEL = 6 # 用例等级
CASE_COL_FUNCTION_NUMBER = 7 # 功能编号
CASE_COL_NAME = 8 # 用例名称
CASE_COL_PRE_CONDITION = 9 # 预置条件
CASE_COL_STEPS = 10 # STEP(测试步骤)
CASE_COL_JSON = 11 # JSON配置
CASE_COL_EXPECTED_RESULT = 12 # 预期结果
CASE_COL_TEST_RESULT = 13 # 测试结果
CASE_COL_TEST_FREQUENCY = 14 # 测试频次
CASE_COL_LOGS_SCREENSHOTS = 15 # 日志/截图/照片
CASE_COL_SCREENSHOT2 = 16 # 截图二
CASE_COL_REMARKS = 17 # 备注
# BUG列表Excel列索引(从1开始)
BUG_COL_PROJECT_NAME = 1 # 项目名称
BUG_COL_BUG_TYPE = 2 # BUG类型
BUG_COL_BUG_LEVEL = 3 # BUG等级
BUG_COL_BUG_STATUS = 4 # BUG状态
BUG_COL_BUG_NAME = 5 # BUG名称
BUG_COL_REPORTER = 6 # 提单人员
BUG_COL_OWNER = 7 # 主负责人员
BUG_COL_DEADLINE = 8 # 截止日期
BUG_COL_REPRODUCTION_STEPS = 9 # 复现步骤
# ================================
# 报告生成配置
# ================================
# 报告输出格式
REPORT_FORMAT = ".docx"
# 报告命名规则:{项目名称}_功能测试报告_{日期}.docx
REPORT_FILENAME_TEMPLATE = "{project_name}_功能测试报告_{date}{format}"
# 报告编号规则:{项目名称}-{日期}
REPORT_NUMBER_TEMPLATE = "{project_name}-{date}"
# Word文档样式配置
WORD_FONT_NAME = "微软雅黑"
WORD_FONT_SIZE = 11
WORD_TITLE_FONT_SIZE = 16
# ================================
# 图表生成配置
# ================================
# 图表输出格式
CHART_FORMAT = ".png"
# 图表DPI(分辨率)
CHART_DPI = 300
# 图表尺寸(英寸)
CHART_FIGURE_SIZE = (10, 6)
# 中文字体配置
CHINESE_FONT = "Microsoft YaHei"
# 图表颜色配置
CHART_COLORS = {
"pass": "#04AA6D", # 绿色 - 通过
"fail": "#bb4069", # 红色 - 失败
"unverified": "#f0c040",# 黄色 - 未验证
"undeveloped": "#dcbdbd",# 灰色 - 未开发
"bug_1": "#d32f2f", # 深红 - 1级BUG
"bug_2": "#f57c00", # 橙色 - 2级BUG
"bug_3": "#fbc02d", # 黄色 - 3级BUG
"bug_4": "#388e3c", # 绿色 - 4级BUG
}
# ================================
# 交互配置
# ================================
# 默认超时时间(秒)
DEFAULT_TIMEOUT = 30
# 进度条显示配置
SHOW_PROGRESS_BAR = True
# ================================
# 日志配置
# ================================
# 日志级别
LOG_LEVEL = "INFO"
# 日志格式
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
# ================================
# 版本信息
# ================================
__version__ = "1.0.0"
__author__ = "Auto Report Generator"
__description__ = "功能测试报告自动生成工具"
def get_report_filename(project_name: str, date: str = None) -> str:
"""
获取报告文件名
Args:
project_name: 项目名称
date: 日期字符串(可选,默认使用当前日期)
Returns:
报告文件名
"""
if date is None:
from datetime import datetime
date = datetime.now().strftime(FILENAME_DATE_FORMAT)
return REPORT_FILENAME_TEMPLATE.format(
project_name=project_name,
date=date,
format=REPORT_FORMAT
)
def get_report_number(project_name: str, date: str = None) -> str:
"""
获取报告编号
Args:
project_name: 项目名称
date: 日期字符串(可选,默认使用当前日期)
Returns:
报告编号
"""
if date is None:
from datetime import datetime
date = datetime.now().strftime(FILENAME_DATE_FORMAT)
return REPORT_NUMBER_TEMPLATE.format(
project_name=project_name,
date=date
)
def ensure_directories() -> None:
"""
确保所有必要的目录存在
"""
REPORTS_DIR.mkdir(parents=True, exist_ok=True)
TEMP_DIR.mkdir(parents=True, exist_ok=True)
# 模块导入时自动创建目录
ensure_directories()
此差异已折叠。
# -*- coding: utf-8 -*-
"""
功能测试报告自动生成工具 - 主入口模块
本模块是程序的主入口,根据参数选择CLI或GUI模式,
协调各模块调用完成报告生成
"""
import sys
import os
# 添加项目根目录到Python路径
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, ROOT_DIR)
from src.cli import parse_arguments, main_cli, list_available_files
from src.gui import main_gui
from src.config import __version__, __description__
def print_banner():
"""打印程序欢迎信息"""
banner = f"""
╔═══════════════════════════════════════════════════════════╗
║ ║
║ 功能测试报告自动生成工具 v{__version__} ║
║ ║
║ {__description__:<55} ║
║ ║
╚═══════════════════════════════════════════════════════════╝
"""
print(banner)
def print_usage():
"""打印使用说明"""
print("""
使用方法:
python main.py [选项]
选项:
--testcase FILE 测试用例Excel文件路径
--buglist FILE BUG列表Excel文件路径
--output PATH 输出报告文件路径(可选)
--project NAME 项目名称(可选)
--gui 使用GUI界面
--list 列出testcases目录下的可用文件
-h, --help 显示帮助信息
示例:
# 交互式模式
python main.py
# 命令行模式
python main.py --testcase testcases/测试用例.xlsx --buglist testcases/BUG列表.xlsx
# GUI模式
python main.py --gui
# 列出可用文件
python main.py --list
""")
def main():
"""
主函数
程序入口,根据参数决定运行模式
"""
# 打印欢迎信息
print_banner()
# 解析命令行参数
args = parse_arguments()
# 处理--list参数
if args.list:
list_available_files()
return
# 处理--gui参数
if args.gui:
try:
main_gui()
except ImportError as e:
print(f"错误: 无法启动GUI界面 - {str(e)}")
print("请确保已安装tkinter库")
sys.exit(1)
except Exception as e:
print(f"错误: {str(e)}")
sys.exit(1)
return
# CLI模式
try:
main_cli()
except KeyboardInterrupt:
print("\n\n操作已取消")
sys.exit(0)
except Exception as e:
print(f"\n错误: {str(e)}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()
## 自动化生成测试报告
# 自动化生成测试报告
## 代码路径
- 代码路径:[AuxiliaryTool/FunctionalTestReportGeneration]
## 功能需求
### 功能目标
**目标:** 通过测试用例+BUG列表+功能测试报告模板生成项目功能测试报告。
### 需求描述
#### 模板文件获取
- 功能测试报告模板:[AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试报告模板.md]
- BUG列表数据模板:[AuxiliaryTool/FunctionalTestReportGeneration/config/BUG列表模板数据.xlsx]
- 功能测试用例模板: [AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试用例模板.xlsx]
#### 测试数据获取
-[AuxiliaryTool/FunctionalTestReportGeneration/testcases]路径下获取测试用例与BUG列表数据,可通过用户输入指定。
#### 测试报告生成
- 根据测试执行结果,自动填充功能测试报告模板,生成完整的测试报告。
- 根据BUG列表数据,自动统计BUG数量和等级分布,并填充到测试报告中。
- 根据功能测试用例,自动统计用例执行情况,并填充到测试报告中。
### 测试报告生成逻辑
#### 交互方式
- 程序交互方式:通过命令行窗口、命令行参数进行交互输入执行。
### 规范文档
#### 数据格式获取
- 数据格式确认:通过读取BUG列表模板文件与功能测试用例模板文件,确认数据格式。
- 数据获取:通过用户输入指定测试数据路径,获取测试数据,测试用例文件与BUG列表文件。测试用例文件数据从第4行开始读取,BUG列表数据从第2行开始读取。
- 批量测试执行(暂不实现):通过批量执行功能测试用例,批量生成功能测试报告。
- 项目名称获取:通过读取BUG列表中'项目名称'字段,获取项目名称。
#### 数据定义
- 测试用例文件中定义用例执行结果状态分为:通过、失败、未验证与未开发。
- BUG列表文件中定义BUG状态分为:激活、已解决与已关闭。
- 日期格式定义:日期格式统一为YYYY年MM月DD日。
#### 统计与关联规则
- 用例-BUG关联规则:通过获取BUG列表复现步骤中的用例编号,关联BUG列表数据,获取关联的BUG信息。
- 遗留BUG定义:BUG列表文件中,状态为激活与已解决的BUG定义为遗留BUG。
- 通过率计算规则:通过用例数量 / 总用例数量 * 100%,保留两位小数。
#### 报告内容
- 自动填充规则:测试概览、被测系统信息、测试结论、测试建议、测试环境信息为空,在报告中显示“未填写”,其余为必填字段。
- 图标绘制规则:绘制BUG等级分布、用例执行结果分布、用例通过率图表,使用matplotlib库进行图表绘制。
#### 文档输出规则
- 报告输出格式:输出Word文档格式。
- 报告输出位置:输出到[AuxiliaryTool/FunctionalTestReportGeneration/reports]
- 报告命名规则:{项目名称}_功能测试报告_{日期}.docx
- 报告编号规则:{项目名称}-{日期}
## 规范文档
- 代码规范: `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
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论