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

feat(report): 实现功能测试报告自动填充优化

- 新增数据提取模块,支持从Excel数据文件自动提取测试概览和系统信息
- 添加关键字配置,支持服务器信息、部署环境、版本信息等标签识别
- 实现测试负责人、测试人员、测试环境等字段的自动填充功能
- 集成到Word和Markdown报告生成器,确保两种格式的一致性
- 添加默认值配置,处理数据缺失情况的优雅降级
- 更新需求文档,完善自动填充规则和执行计划说明
上级 4c9131ba
# 华为智慧园区合作伙伴对接开发功能测试报告
## 一、报告基本信息
### 1.1 报告标识
| 项目 | 内容 |
| --- | --- |
| 报告编号 | 华为智慧园区合作伙伴对接开发-2026年03月09日 |
| 报告标题 | 华为智慧园区合作伙伴对接开发功能测试报告 |
| 报告版本 | v1.0 |
| 生成日期 | 2026年03月09日 |
| 报告状态 | 已生成 |
### 1.2 测试概览
| 项目 | 内容 |
| --- | --- |
| 项目名称 | 华为智慧园区合作伙伴对接开发 |
| 测试负责人 | 未填写 |
| 测试人员 | 未填写 |
| 测试环境 | 未填写 |
| 测试类型 | 功能测试 |
### 1.3 被测系统信息
| 项目 | 内容 |
| --- | --- |
| 系统名称 | 华为智慧园区合作伙伴对接开发 |
| 系统版本 | 未填写 |
| 服务器地址 | 未填写 |
| 部署环境 | 未填写 |
## 二、测试执行摘要
### 2.1 测试结果统计
| 统计项 | 数量 | 占比 |
| --- | --- | --- |
| 测试用例总数 | 35 | 100% |
| 执行用例数量 | 28 | 80.0% |
| 通过用例数量 | 28 | 80.0% |
| 失败用例数量 | 0 | 0.0% |
| 未执行用例数量 | 10 | 28.57% |
### 2.2 BUG统计汇总
| BUG等级 | 数量 | 占比 | 已关闭 | 未关闭 |
| --- | --- | --- | --- | --- |
| 测试用例总数 | 35 | 100% | | |
| 执行用例数量 | 28 | 80.0% | | |
| 通过用例数量 | 28 | 80.0% | | |
| 失败用例数量 | 0 | 0.0% | | |
| 未执行用例数量 | 10 | 28.57% | | |
| 致命(1级) | 1 | 9.09% | 1 | 0 |
| 严重(2级) | 3 | 27.27% | 3 | 0 |
| 一般(3级) | 6 | 54.55% | 6 | 0 |
| 轻微(4级) | 1 | 9.09% | 1 | 0 |
### 2.3 测试结论
**测试通过** - 系统功能正常,无致命/严重缺陷,可以发布
## 三、测试范围
### 3.1 测试模块覆盖
| 序号 | 功能模块 | 用例数量 | 通过 | 失败 | 未执行 | 覆盖率 |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | 系统管理_权限管理_初始化测试 | 1 | 0 | 0 | 0 | 0.0% |
| 2 | 系统管理_权限管理_权限组列表 | 4 | 4 | 0 | 0 | 100.0% |
| 3 | 系统管理_权限管理_权限组添加 | 12 | 9 | 0 | 0 | 75.0% |
| 4 | 系统管理_权限管理_权限组编辑 | 5 | 4 | 0 | 0 | 80.0% |
| 5 | 系统管理_权限管理_权限组绑定 | 6 | 6 | 0 | 0 | 100.0% |
| 6 | 系统管理_权限管理_权限组删除 | 3 | 3 | 0 | 0 | 100.0% |
| 7 | 系统管理_权限管理_权限组禁/启用 | 2 | 2 | 0 | 0 | 100.0% |
| 8 | 系统管理_权限管理_接口权限测试 | 2 | 0 | 0 | 2 | 0.0% |
## 四、测试用例执行详情
### 4.1 通过用例列表
| 序号 | 用例编号 | 功能模块 | 用例名称 | 用例等级 | 测试结果 |
| --- | --- | --- | --- | --- | --- |
| 1 | XTY-212 | 系统管理_权限管理_权限组列表 | 【新统一平台】查看权限组列表是否正确回显数据展示 | 1 | 通过 |
| 2 | XTY-213 | 系统管理_权限管理_权限组列表 | 【新统一平台】输入模糊的“权限组名称”进行搜索,查看列表是否正确显示符合条件的数据 | 1 | 通过 |
| 3 | XTY-214 | 系统管理_权限管理_权限组列表 | 【新统一平台】输入精确的“权限组名称”进行搜索,查看列表是否正确显示符合条件的数据 | 1 | 通过 |
| 4 | XTY-215 | 系统管理_权限管理_权限组列表 | 【新统一平台】切换分页后输入“权限组名称”进行搜索,查看列表是否正确显示符合条件的数据 | 1 | 通过 |
| 5 | XTY-216 | 系统管理_权限管理_权限组添加 | 【新统一平台】点击【添加】按钮,查看是否正确进入权限组新增页面 | 1 | 通过 |
| 6 | XTY-219 | 系统管理_权限管理_权限组添加 | 【新统一平台】“权限组名称”正确输入后,不勾选任一模块,点击【确定】按钮,查看是否正确提示“请至少勾 | 1 | 通过 |
| 7 | XTY-220 | 系统管理_权限管理_权限组添加 | 【新统一平台】查看权限配置列表中各个模块以及子模块的数据显示是否正确 | 1 | 通过 |
| 8 | XTY-221 | 系统管理_权限管理_权限组添加 | 【新统一平台】“权限组名称”正确输入后,勾选“用户管理”模块中的用户列表模块。“状态”选择“已启用” | 1 | 通过 |
| 9 | XTY-222 | 系统管理_权限管理_权限组添加 | 【新统一平台】“权限组名称”正确输入后,勾选“用户管理”模块中的用户列表模块,“状态”选择“已禁用” | 1 | 通过 |
| 10 | XTY-223 | 系统管理_权限管理_权限组添加 | 【新统一平台】当前页面输入信息后点击【取消】按钮,查看是否正确不保留任何操作,返回上一级 | 1 | 通过 |
| 11 | XTY-224 | 系统管理_权限管理_权限组添加 | 【新统一平台】“权限配置搜索框”输入模糊的信息,查看列表是否正确显示符合条件的数据 | 1 | 通过 |
| 12 | XTY-225 | 系统管理_权限管理_权限组添加 | 【新统一平台】“权限配置搜索框”输入精确的信息,查看列表是否正确显示符合条件的数据 | 1 | 通过 |
| 13 | XTY-227 | 系统管理_权限管理_权限组添加 | 【新统一平台】查看当前权限配置的模块数据是否与公司授权文件开放的权限模块数据一致 | 1 | 通过 |
| 14 | XTY-229 | 系统管理_权限管理_权限组编辑 | 【新统一平台】“权限组名称”为空,点击【确定】按钮,查看是否存在提示“权限组名称不能为空” | 1 | 通过 |
| 15 | XTY-230 | 系统管理_权限管理_权限组编辑 | 【新统一平台】修改“权限配置”后保存,登录绑定该权限用户查看权限模块是否正确新增或减少 | 1 | 通过 |
| 16 | XTY-231 | 系统管理_权限管理_权限组编辑 | 【新统一平台】修改“状态”为禁用后保存,登录绑定该权限用户查看是否存在提示 | 1 | 通过 |
| 17 | XTY-232 | 系统管理_权限管理_权限组编辑 | 【新统一平台】修改“权限配置”后点击【取消】按钮,查看是否正确不保留任何操作,返回上一级 | 1 | 通过 |
| 18 | XTY-233 | 系统管理_权限管理_权限组绑定 | 【新统一平台】点击列表权限组的【绑定】按钮,查看是否正确进入“权限组绑定”界面 | 1 | 通过 |
| 19 | XTY-234 | 系统管理_权限管理_权限组绑定 | 【新统一平台】当前勾选任一“角色”进行绑定,绑定该角色用户登录系统,查看是否正确可见开放的模块数据, | 1 | 通过 |
| 20 | XTY-235 | 系统管理_权限管理_权限组绑定 | 【新统一平台】当前勾选任一“部门”进行绑定,该部门下用户登录系统,查看是否正确可见开放的模块数据,并 | 1 | 通过 |
| 21 | XTY-236 | 系统管理_权限管理_权限组绑定 | 【新统一平台】当前勾选任一“用户”进行绑定,该用户登录系统,查看是否正确可见开放的模块数据,并且可正 | 1 | 通过 |
| 22 | XTY-237 | 系统管理_权限管理_权限组绑定 | 【新统一平台】组合“角色”、“部门”、“用户”进行绑定,以上角色、部门及用户登录系统,查看是否正确可 | 1 | 通过 |
| 23 | XTY-238 | 系统管理_权限管理_权限组绑定 | 【新统一平台】切换分页后进行“用户名称”筛选,查看列表是否正确显示用户数据 | 1 | 通过 |
| 24 | XTY-239 | 系统管理_权限管理_权限组删除 | 【新统一平台】当前权限组未绑定用户,点击【删除】按钮,再次点击【确定】按钮,查看是否正确提示“删除成 | 1 | 通过 |
| 25 | XTY-240 | 系统管理_权限管理_权限组删除 | 【新统一平台】当前权限组已绑定用户,点击【删除】按钮,再次点击【确定】按钮,查看是否正确提示“当前权 | 1 | 通过 |
| 26 | XTY-241 | 系统管理_权限管理_权限组删除 | 【新统一平台】当前权限组未绑定用户,点击【删除】按钮,再次点击【取消】按钮,查看是否正确不保留任何操 | 1 | 通过 |
| 27 | XTY-242 | 系统管理_权限管理_权限组禁/启用 | 【新统一平台】将当前权限组禁用后,该权限组下的用户登录系统查看是否正确不可见权限模块 | 1 | 通过 |
| 28 | XTY-243 | 系统管理_权限管理_权限组禁/启用 | 【新统一平台】将当前权限组开启后,该权限组下的用户登录系统查看是否正确可见权限模块 | 1 | 通过 |
### 4.2 失败用例列表
*无失败用例*
### 4.3 未执行用例列表
| 序号 | 用例编号 | 功能模块 | 用例名称 | 用例等级 | 未执行原因 |
| --- | --- | --- | --- | --- | --- |
| 1 | XTY-245 | 系统管理_权限管理_接口权限测试 | 【新统一平台】当前权限组用户不存在用户新增模块权限,通过apifox调用接口查看接口是否正确存在权限 | 1 | 未开发 |
| 2 | XTY-246 | 系统管理_权限管理_接口权限测试 | 【新统一平台】为当前权限组新增用户新增模块权限,通过apifox调用接口查看接口是否正确可调用成功 | 1 | 未开发 |
## 五、BUG详细列表
### 5.1 BUG详细记录
| 序号 | BUG等级 | BUG状态 | BUG名称 | BUG类型 | 提单人员 | 负责人员 |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | 1级 | 已关闭 | 【新统一平台-权限管理】权限管理新增数据后接口没有返回数据信息 | 代码错误 | 陈泽键 | 赵嘉诚 |
| 2 | 3级 | 已关闭 | 【新统一平台-权限管理】新增重复名称的权限组数据仍可以成功创建,需要校验是否存在重复的权限名称 | 代码错误 | 陈泽键 | 赵嘉诚 |
| 3 | 4级 | 已关闭 | 【新统一平台-权限管理】权限新增时“权限组名称”为空点击【确定】按钮需要补充弹出提示“权限组名称不能 | 代码错误 | 陈泽键 | 卢培鍠 |
| 4 | 3级 | 已关闭 | 【新统一平台-权限管理】权限配置界面中的“设备管理”模块下的“会议设备”模块不存在“新增”“修改”功 | 代码错误 | 陈泽键 | 卢培鍠 |
| 5 | 3级 | 已关闭 | 【新统一平台-权限管理】更新版本包后,系统信息不显示版本号 | 代码错误 | 彭甘宇 | 赵嘉诚 |
| 6 | 2级 | 已关闭 | 【新统一平台-权限管理】设置仅查看权限并绑定用户,权限控制不生效 | 代码错误 | 彭甘宇 | 卢培鍠 |
| 7 | 2级 | 已关闭 | 【新统一平台-权限管理】用户绑定权限组后,没有移除用户的操作界面 | 设计缺陷 | 彭甘宇 | 卢培鍠 |
| 8 | 2级 | 已关闭 | 【新统一平台-权限管理】删除用户组时,如果存在用户要有二次确认提示或者限制不给删除。 | 设计缺陷 | 彭甘宇 | 赵嘉诚 |
| 9 | 3级 | 已关闭 | 【新统一平台-权限管理】建议增加批量启用或禁用操作 | 界面优化 | 彭甘宇 | 卢培鍠 |
| 10 | 3级 | 已关闭 | 【新统一平台-权限管理】权限组绑定界面需要增加分页条数切换 | 标准规范 | 彭甘宇 | 卢培鍠 |
| 11 | 3级 | 已关闭 | 【新统一平台-权限管理】新增权限组权限组模块只有组织信息模块,关联用户登录系统后台后仍可以看到其他模 | 代码错误 | 陈泽键 | 卢培鍠 |
### 5.2 遗留BUG说明
*无遗留BUG*
## 六、图表分析
### 6.1 BUG等级分布
![BUG等级分布](E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\temp\bug_level_chart.png)
### 6.2 用例执行结果分布
![用例执行结果分布](E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\temp\test_result_chart.png)
### 6.3 用例执行情况统计
![用例执行情况统计](E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\temp\pass_rate_chart.png)
### 6.4 各模块BUG分布
![各模块BUG分布](E:\GithubData\ubains-module-test\AuxiliaryTool\FunctionalTestReportGeneration\temp\bug_by_module_chart.png)
## 七、测试执行记录
### 7.1 执行时间统计
| 统计项 | 时间 |
| --- | --- |
| 测试开始时间 | 2026年03月09日 |
| 测试结束时间 | 2026年03月09日 |
| 测试总耗时 | 自动化生成 |
| 平均用例执行时间 | N/A |
### 7.2 执行人员分工
| 测试人员 | 负责模块 | 执行用例数 | 发现BUG数 |
| --- | --- | --- | --- |
| 自动化工具 | 全模块 | 35 | 11 |
## 八、测试附件
### 8.1 测试截图
*无测试截图*
### 8.2 测试日志
*无测试日志*
## 九、风险评估与建议
### 9.1 质量风险分析
*无特别风险*
### 9.2 发布建议
- [x] **建议发布** - 质量达标,风险可控
### 9.3 改进建议
待补充
## 十、附录
### 10.1 用例与BUG关联表
*无关联数据*
### 10.2 术语表
*无术语定义*
### 10.3 参考文档
*无参考文档*
### 10.4 修订历史
| 版本 | 修订日期 | 修订人 | 修订内容 |
| --- | --- | --- | --- |
| v1.0 | 2026年03月09日 | 自动化工具 | 自动生成初始报告 |
......@@ -142,6 +142,29 @@ BUG_COL_OWNER = 7 # 主负责人员
BUG_COL_DEADLINE = 8 # 截止日期
BUG_COL_REPRODUCTION_STEPS = 9 # 复现步骤
# ================================
# 自动填充关键字配置
# ================================
# 测试用例预置条件中的关键字(使用【】标签格式)
KEYWORD_SERVER_INFO = "【服务器信息】"
KEYWORD_DEPLOYMENT_ENV = "【部署环境】"
# BUG列表复现步骤中的关键字(使用【】标签格式)
KEYWORD_VERSION_INFO = "【版本信息】"
# ================================
# 自动填充默认值配置
# ================================
# 测试概览默认值
DEFAULT_TEST_LEAD = "未填写"
DEFAULT_TESTER = "未填写"
DEFAULT_TEST_ENV = "未填写"
# 被测系统信息默认值
DEFAULT_SYSTEM_VERSION = "未填写"
DEFAULT_SERVER_ADDRESS = "未填写"
DEFAULT_DEPLOYMENT_ENV = "未填写"
# ================================
# 报告生成配置
# ================================
......
# -*- coding: utf-8 -*-
"""
功能测试报告自动生成工具 - 数据提取模块
本模块负责从测试用例和BUG列表中提取关键信息,
用于自动填充报告中的测试概览和被测系统信息部分
"""
import re
from typing import List, Optional
from src.excel_reader import TestCase, Bug
from src.config import (
# 关键字配置
KEYWORD_SERVER_INFO,
KEYWORD_VERSION_INFO,
KEYWORD_DEPLOYMENT_ENV,
# 默认值配置
DEFAULT_TEST_LEAD,
DEFAULT_TESTER,
DEFAULT_TEST_ENV,
DEFAULT_SYSTEM_VERSION,
DEFAULT_SERVER_ADDRESS,
DEFAULT_DEPLOYMENT_ENV,
)
# IP地址正则表达式
IP_ADDRESS_PATTERN = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'
def extract_ip_address(text: str) -> str:
"""
从文本中提取IP地址
Args:
text: 源文本
Returns:
提取的IP地址,如果未找到则返回空字符串
Examples:
>>> extract_ip_address("服务器:192.168.5.44 root Ubains@4321")
"192.168.5.44"
>>> extract_ip_address("服务器信息:192.168.5.44")
"192.168.5.44"
"""
if not text:
return ""
# 使用正则表达式查找IP地址
match = re.search(IP_ADDRESS_PATTERN, text)
if match:
return match.group()
return ""
def extract_keyword_value(text: str, keyword: str) -> str:
"""
从文本中提取关键字后的内容(多行支持)
Args:
text: 源文本
keyword: 关键字(如"【服务器信息】")
Returns:
提取的内容,如果未找到则返回空字符串
Examples:
>>> extract_keyword_value("【部署环境】UOS操作系统", "【部署环境】")
"UOS操作系统"
"""
if not text:
return ""
# 查找关键字位置
keyword_index = text.find(keyword)
if keyword_index == -1:
return ""
# 提取关键字后的内容
start_index = keyword_index + len(keyword)
extracted_content = text[start_index:].strip()
# 处理换行符(提取到下一个标签或空行为止,最多取N行)
lines = extracted_content.split("\n")
result_lines = []
for line in lines:
line = line.strip()
if not line:
break
# 如果遇到下一个【】标签,停止提取
if line.startswith("【") and "】" in line and line != keyword:
break
result_lines.append(line)
return "\n".join(result_lines) if result_lines else ""
def extract_version_info(text: str, keyword: str = None) -> str:
"""
从文本中提取关键字后的多行版本信息
Args:
text: 源文本
keyword: 关键字(默认从配置获取)
Returns:
提取的多行版本信息,如果未找到则返回空字符串
Examples:
>>> text = '''【版本信息】
... 对内服务:target_integration2.1.2611.762 2026-03-09 09:47:20
... 对外服务:target_integration2.1.2611.762 2026-03-09 09:47:20
... 预定前台:2.0.2605.1443-2026-02-04'''
>>> extract_version_info(text)
'对内服务:target_integration2.1.2611.762 2026-03-09 09:47:20\\n对外服务:...'
"""
if keyword is None:
keyword = KEYWORD_VERSION_INFO
if not text:
return ""
# 查找关键字位置
keyword_index = text.find(keyword)
if keyword_index == -1:
return ""
# 提取关键字后的所有内容
start_index = keyword_index + len(keyword)
extracted_content = text[start_index:].strip()
# 按行分割,提取所有非空行
lines = extracted_content.split("\n")
version_lines = []
for line in lines:
line = line.strip()
# 跳过空行
if not line:
continue
# 如果遇到下一个【】标签,停止提取
if line.startswith("【") and "】" in line:
break
# 识别版本信息的行特征:
# 1. 包含冒号的行
# 2. 以常见版本关键字开头的行
if ":" in line or line.startswith(("对内服务", "对外服务", "MQTT", "定时任务",
"信息发布", "预定前台", "后台管理", "前端", "后端")):
version_lines.append(line)
return "\n".join(version_lines) if version_lines else ""
def extract_testers(bug_list: List[Bug]) -> str:
"""
从BUG列表中提取提单人员(去重合并)
Args:
bug_list: BUG对象列表
Returns:
人员列表字符串,用"、"分隔,如果未找到则返回默认值
Examples:
>>> extract_testers([Bug(reporter="张三"), Bug(reporter="李四"), Bug(reporter="张三")])
"张三、李四"
"""
if not bug_list:
return DEFAULT_TESTER
# 提取所有提单人员
reporters = [bug.reporter for bug in bug_list if bug.reporter]
if not reporters:
return DEFAULT_TESTER
# 去重并保持顺序
unique_reporters = list(dict.fromkeys(reporters))
# 用"、"连接
return "、".join(unique_reporters)
def extract_info_from_cases(cases: List[TestCase], keyword: str, default: str = "") -> str:
"""
从测试用例列表的预置条件中提取指定关键字的信息
Args:
cases: 测试用例列表
keyword: 要查找的关键字(支持多种格式)
default: 默认值
Returns:
提取的信息
"""
if not cases:
return default
# 遍历所有用例的预置条件
for case in cases:
if case.pre_condition:
value = extract_keyword_value(case.pre_condition, keyword)
if value:
return value
return default
def extract_server_info(cases: List[TestCase]) -> str:
"""
从测试用例中提取服务器IP地址
支持多种格式:
- 【服务器信息】192.168.5.44
- 服务器信息:192.168.5.44
- 1、服务器信息:192.168.5.44
Args:
cases: 测试用例列表
Returns:
服务器IP地址,如果未找到则返回默认值
"""
if not cases:
return DEFAULT_SERVER_ADDRESS
# 支持的多种关键字格式
keywords = [
KEYWORD_SERVER_INFO, # 【服务器信息】
"服务器信息:", # 带冒号
"服务器信息:", # 中文冒号
]
# 遍历所有用例的预置条件
for case in cases:
if case.pre_condition:
for keyword in keywords:
if keyword in case.pre_condition:
# 提取关键字后的内容
server_info = extract_keyword_value(case.pre_condition, keyword)
# 从服务器信息中提取IP地址
ip_address = extract_ip_address(server_info)
if ip_address:
return ip_address
return DEFAULT_SERVER_ADDRESS
def extract_deployment_env(cases: List[TestCase]) -> str:
"""
从测试用例中提取部署环境
支持多种格式:
- 【部署环境】UOS操作系统
- 部署环境:UOS操作系统
- 2、部署环境:uos2060e
Args:
cases: 测试用例列表
Returns:
部署环境,如果未找到则返回默认值
"""
if not cases:
return DEFAULT_DEPLOYMENT_ENV
# 支持的多种关键字格式
keywords = [
KEYWORD_DEPLOYMENT_ENV, # 【部署环境】
"部署环境:", # 带冒号
"部署环境:", # 中文冒号
]
# 遍历所有用例的预置条件
for case in cases:
if case.pre_condition:
for keyword in keywords:
if keyword in case.pre_condition:
# 提取关键字后的内容
env_info = extract_keyword_value(case.pre_condition, keyword)
if env_info:
# 清理可能的换行符和多余空格,只取第一行
return env_info.split("\n")[0].strip()
return DEFAULT_DEPLOYMENT_ENV
def extract_version_info_from_bug_list(bug_list: List[Bug]) -> str:
"""
从BUG列表的复现步骤中提取版本信息
支持多种格式:
- 【版本信息】对内服务:xxx
- 版本信息:对内服务:xxx
Args:
bug_list: BUG对象列表
Returns:
版本信息字符串(多行格式),如果未找到则返回默认值
Examples:
>>> extract_version_info_from_bug_list(bugs)
'对内服务:target_integration2.1.2611.762 2026-03-09 09:47:20\\n对外服务:...'
"""
if not bug_list:
return DEFAULT_SYSTEM_VERSION
# 支持的多种关键字格式
keywords = [
KEYWORD_VERSION_INFO, # 【版本信息】
"版本信息:", # 带冒号
"版本信息:", # 中文冒号
]
# 遍历BUG列表,查找包含版本信息的复现步骤
for bug in bug_list:
if bug.reproduction_steps:
for keyword in keywords:
if keyword in bug.reproduction_steps:
version_info = extract_version_info(bug.reproduction_steps, keyword)
if version_info:
return version_info
return DEFAULT_SYSTEM_VERSION
def extract_test_lead(bug_list: List[Bug]) -> str:
"""
从BUG列表中提取测试负责人(第一个提单人员)
Args:
bug_list: BUG对象列表
Returns:
测试负责人,如果未找到则返回默认值
"""
if not bug_list:
return DEFAULT_TEST_LEAD
# 获取第一个有提单人员的BUG
for bug in bug_list:
if bug.reporter:
return bug.reporter
return DEFAULT_TEST_LEAD
......@@ -12,6 +12,13 @@ from datetime import datetime
from src.data_analyzer import TestCaseAnalysis, BugAnalysis, ModuleStat
from src.excel_reader import TestCase, Bug
from src.data_extractor import (
extract_testers,
extract_test_lead,
extract_server_info,
extract_version_info_from_bug_list,
extract_deployment_env,
)
from src.config import (
TEMPLATE_FILE,
DATE_FORMAT,
......@@ -35,6 +42,13 @@ from src.config import (
REMAINING_BUG_STATUS,
# BUG等级描述
BUG_LEVEL_DESCRIPTION,
# 自动填充默认值
DEFAULT_TEST_LEAD,
DEFAULT_TESTER,
DEFAULT_TEST_ENV,
DEFAULT_SYSTEM_VERSION,
DEFAULT_SERVER_ADDRESS,
DEFAULT_DEPLOYMENT_ENV,
)
......@@ -128,20 +142,31 @@ def generate_markdown_report(
headers = ["项目", "内容"]
rows = [
["项目名称", project_name],
["测试负责人", "未填写"],
["测试人员", "未填写"],
["测试环境", "未填写"],
["测试负责人", extract_test_lead(bugs) if bugs else DEFAULT_TEST_LEAD],
["测试人员", extract_testers(bugs) if bugs else DEFAULT_TESTER],
["测试环境", extract_server_info(cases) if cases else DEFAULT_TEST_ENV],
["测试类型", "功能测试"],
]
content_parts.append(render_markdown_table(headers, rows) + "\n")
content_parts.append("### 1.3 被测系统信息\n")
headers = ["项目", "内容"]
# 提取自动填充数据
system_version = extract_version_info_from_bug_list(bugs) if bugs else DEFAULT_SYSTEM_VERSION
server_address = extract_server_info(cases) if cases else DEFAULT_SERVER_ADDRESS
deployment_env = extract_deployment_env(cases) if cases else DEFAULT_DEPLOYMENT_ENV
# Markdown支持多行显示,将版本信息格式化为代码块
if "\n" in system_version:
system_version_display = f"```\n{system_version}\n```"
else:
system_version_display = system_version
rows = [
["系统名称", project_name],
["系统版本", "未填写"],
["服务器地址", "未填写"],
["部署环境", "未填写"],
["系统版本", system_version_display],
["服务器地址", server_address],
["部署环境", deployment_env],
]
content_parts.append(render_markdown_table(headers, rows) + "\n")
......
......@@ -22,6 +22,13 @@ except ImportError:
from src.data_analyzer import TestCaseAnalysis, BugAnalysis, ModuleStat
from src.excel_reader import TestCase, Bug
from src.data_extractor import (
extract_testers,
extract_test_lead,
extract_server_info,
extract_version_info_from_bug_list,
extract_deployment_env,
)
from src.config import (
TEMPLATE_FILE,
WORD_FONT_NAME,
......@@ -53,6 +60,13 @@ from src.config import (
REMAINING_BUG_STATUS,
# BUG等级描述
BUG_LEVEL_DESCRIPTION,
# 自动填充默认值
DEFAULT_TEST_LEAD,
DEFAULT_TESTER,
DEFAULT_TEST_ENV,
DEFAULT_SYSTEM_VERSION,
DEFAULT_SERVER_ADDRESS,
DEFAULT_DEPLOYMENT_ENV,
)
......@@ -264,20 +278,33 @@ def generate_report(
headers = ["项目", "内容"]
rows = [
["项目名称", project_name],
["测试负责人", "未填写"],
["测试人员", "未填写"],
["测试环境", "未填写"],
["测试负责人", extract_test_lead(bugs) if bugs else DEFAULT_TEST_LEAD],
["测试人员", extract_testers(bugs) if bugs else DEFAULT_TESTER],
["测试环境", extract_server_info(cases) if cases else DEFAULT_TEST_ENV],
["测试类型", "功能测试"],
]
_create_table_with_data(doc, headers, rows)
_add_title(doc, "1.3 被测系统信息", level=3)
headers = ["项目", "内容"]
# 提取自动填充数据
system_version = extract_version_info_from_bug_list(bugs) if bugs else DEFAULT_SYSTEM_VERSION
server_address = extract_server_info(cases) if cases else DEFAULT_SERVER_ADDRESS
deployment_env = extract_deployment_env(cases) if cases else DEFAULT_DEPLOYMENT_ENV
# 处理多行版本信息,在Word表格中需要特殊处理
# 如果版本信息包含换行符,需要分段显示
if "\n" in system_version:
# 将多行版本信息合并为一行显示(用空格分隔)
system_version_display = " ".join(system_version.split("\n"))
else:
system_version_display = system_version
rows = [
["系统名称", project_name],
["系统版本", "未填写"],
["服务器地址", "未填写"],
["部署环境", "未填写"],
["系统版本", system_version_display],
["服务器地址", server_address],
["部署环境", deployment_env],
]
_create_table_with_data(doc, headers, rows)
......
......@@ -11,7 +11,7 @@
- 功能测试报告模板:[AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试报告模板.docx]
### 测试报告内容约束
#### 标题规则
#### 内容规则
- 标题格式:
- 一级标题为宋体、21字号、加粗、黑色和左对齐。
- 二级标题为宋体、19字号、加粗、黑色和左对齐。
......
# 报告生成优化需求文档
## 代码路径
- 代码路径:[AuxiliaryTool/FunctionalTestReportGeneration]
## 功能需求
### 功能目标
**目标:** 补充新的自动填充内容,实现运行代码后自动根据数据文件进行填充到报告对应部分中。
### 需求描述
#### 模板文件获取
- 功能测试报告模板:[AuxiliaryTool/FunctionalTestReportGeneration/config/功能测试报告模板.docx]
- 测试数据文件:[AuxiliaryTool/FunctionalTestReportGeneration/config/BUG列表模板数据.xlsx]
#### 测试数据文件获取
- 测试数据文件:[AuxiliaryTool/FunctionalTestReportGeneration/config/BUG列表模板数据.xlsx]
- 测试用例数据文件:[AuxiliaryTool/FunctionalTestReportGeneration/config/测试用例数据文件.xlsx]
### 自动填充内容
#### 内容规则
- 测试概览
- 测试负责人:通过获取`BUG列表测试数据文件``提单人员`列获取。
- 测试人员:通过获取`BUG列表测试数据文件``提单人员`列获取。
- 测试环境:通过获取`测试用例数据文件``预置条件`列中的关键字`服务器信息:`获取。例如,`服务器信息:192.168.5.44`,则测试环境为`192.168.5.44`
- 【服务器信息】
服务器:192.168.5.44 root Ubains@4321
管理员:admin@xty Ubains@4321
- 被测系统信息:
- 系统版本:通过获取`BUG列表测试数据文件``复现步骤`列中的关键字`版本信息`获取。如下所示:
- 【版本信息】
对内服务:target_integration2.1.2611.762 2026-03-09 09:47:20
对外服务:target_integration2.1.2611.762 2026-03-09 09:47:20
MQTT服务:target_integration_mqtt2.1.2549.2 2025-12-01 14:17:56
定时任务:target_integration_quartz2.1.2549.5 2025-12-01 14:16:52
信息发布:target_integration_scheduling2.1.2549.2 2025-12-01 14:18:24
预定前台:2.0.2605.1443-2026-02-04
后台管理:2.0.2610.1401-2026-03-05
- 服务器地址:通过获取`测试用例数据文件``复现步骤`列中的关键字`服务器信息:`获取。例如,`服务器信息:192.168.5.44`,则服务器地址为`192.168.5.44`
- 【服务器信息】
服务器:192.168.5.44 root Ubains@4321
管理员:admin@xty Ubains@4321
- 部署环境:通过获取`测试用例数据文件``复现步骤`列中的关键字`部署环境:`获取。例如,`部署环境:UOS操作系统`,则部署环境为`UOS操作系统`
## 规范文档
- 代码规范: `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
# 自动填充优化需求文档 - 计划执行文档
## 文档信息
- **需求文档**: `_PRD_自动填充优化需求文档.md`
- **代码路径**: `AuxiliaryTool/FunctionalTestReportGeneration`
- **创建日期**: 2026年03月10日
- **执行状态**: 待执行
---
## 一、需求概述
### 功能目标
补充新的自动填充内容,实现运行代码后自动根据数据文件进行填充到报告对应部分中。
### 涉及文件
- 模板文件:`config/功能测试报告模板.docx`
- BUG列表数据:`config/BUG列表模板数据.xlsx`
- 测试用例数据:`config/测试用例数据文件.xlsx`
---
## 二、自动填充规则分析
### 2.1 测试概览自动填充
| 字段 | 数据来源 | 提取规则 |
|------|----------|----------|
| 测试负责人 | BUG列表数据文件 | 从`提单人员`列获取(去重合并) |
| 测试人员 | BUG列表数据文件 | 从`提单人员`列获取(去重合并) |
| 测试环境 | 测试用例数据文件 | 从`预置条件`列中提取【服务器信息】标签后的服务器IP地址 |
**示例**
- 预置条件内容:
```
【服务器信息】
服务器:192.168.5.44 root Ubains@4321
管理员:admin@xty Ubains@4321
```
- 提取结果:`192.168.5.44`(只提取IP地址)
### 2.2 被测系统信息自动填充
| 字段 | 数据来源 | 提取规则 |
|------|----------|----------|
| 系统版本 | BUG列表数据文件 | 从`复现步骤`列中提取【版本信息】标签后的多行内容(保留格式) |
| 服务器地址 | 测试用例数据文件 | 从`预置条件`列中提取【服务器信息】标签后的服务器IP地址 |
| 部署环境 | 测试用例数据文件 | 从`预置条件`列中提取【部署环境】标签后的内容 |
**系统版本示例**:
- 复现步骤内容:
```
【版本信息】
对内服务:target_integration2.1.2611.762 2026-03-09 09:47:20
对外服务:target_integration2.1.2611.762 2026-03-09 09:47:20
MQTT服务:target_integration_mqtt2.1.2549.2 2025-12-01 14:17:56
定时任务:target_integration_quartz2.1.2549.5 2025-12-01 14:16:52
信息发布:target_integration_scheduling2.1.2549.2 2025-12-01 14:18:24
预定前台:2.0.2605.1443-2026-02-04
后台管理:2.0.2610.1401-2026-03-05
```
- 提取结果:保留上述多行格式(用于Word报告中的表格填充)
**服务器地址示例**:
- 预置条件内容:
```
【服务器信息】
服务器:192.168.5.44 root Ubains@4321
管理员:admin@xty Ubains@4321
```
- 提取结果:`192.168.5.44`(只提取IP地址)
---
## 三、执行计划
### 阶段一:数据提取函数开发
#### 3.1.1 创建数据提取工具模块
- **文件**: `src/data_extractor.py`(新建)
- **功能**:
- 从文本中提取关键字后的内容
- 合并去重提单人员列表
- 提取服务器信息、部署环境、版本信息等
**核心函数设计**:
```python
def extract_keyword_value(text: str, keyword: str) -> str:
"""从文本中提取关键字后的内容(单行)"""
def extract_version_info(text: str, keyword: str = "版本信息") -> str:
"""从文本中提取关键字后的多行版本信息"""
def extract_version_info_from_bug_list(bug_list: List[Bug]) -> str:
"""从BUG列表中提取版本信息"""
def extract_testers(bug_list: List[Bug]) -> str:
"""从BUG列表中提取提单人员(去重合并)"""
def extract_server_info(test_cases: List[TestCase]) -> str:
"""从测试用例中提取服务器信息"""
def extract_deployment_env(test_cases: List[TestCase]) -> str:
"""从测试用例中提取部署环境"""
```
#### 3.1.2 任务列表
- [ ] 创建`data_extractor.py`模块
- [ ] 实现`extract_keyword_value`函数
- [ ] 实现`extract_testers`函数
- [ ] 实现`extract_server_info`函数
- [ ] 实现`extract_version_info`函数
- [ ] 实现`extract_deployment_env`函数
- [ ] 添加单元测试
---
### 阶段二:配置模块更新
#### 3.2.1 更新配置文件
- **文件**: `src/config.py`
- **更新内容**:
- 添加关键字常量配置
- 添加默认值配置
**新增配置项**:
```python
# 自动填充关键字配置
KEYWORD_SERVER_INFO = "服务器信息:"
KEYWORD_VERSION_INFO = "版本信息"
KEYWORD_DEPLOYMENT_ENV = "部署环境:"
# 默认值配置
DEFAULT_TEST_LEAD = "未填写"
DEFAULT_TESTER = "未填写"
DEFAULT_TEST_ENV = "未填写"
DEFAULT_SYSTEM_VERSION = "未填写"
DEFAULT_SERVER_ADDRESS = "未填写"
DEFAULT_DEPLOYMENT_ENV = "未填写"
```
#### 3.2.2 任务列表
- [ ] 在`config.py`中添加关键字配置
- [ ] 在`config.py`中添加默认值配置
---
### 阶段三:报告生成模块更新
#### 3.3.1 更新报告生成函数
- **文件**: `src/word_generator.py`
- **更新位置**: `generate_report`函数中的"1.2 测试概览"和"1.3 被测系统信息"部分
**当前代码位置**(第263-282行):
```python
_add_title(doc, "1.2 测试概览", level=3)
headers = ["项目", "内容"]
rows = [
["项目名称", project_name],
["测试负责人", "未填写"], # 需要修改
["测试人员", "未填写"], # 需要修改
["测试环境", "未填写"], # 需要修改
["测试类型", "功能测试"],
]
_create_table_with_data(doc, headers, rows)
_add_title(doc, "1.3 被测系统信息", level=3)
headers = ["项目", "内容"]
rows = [
["系统名称", project_name],
["系统版本", "未填写"], # 需要修改
["服务器地址", "未填写"], # 需要修改
["部署环境", "未填写"], # 需要修改
]
_create_table_with_data(doc, headers, rows)
```
**修改后代码**:
```python
# 导入数据提取模块
from src.data_extractor import (
extract_testers,
extract_server_info,
extract_version_info_from_bug_list,
extract_deployment_env
)
# 提取自动填充数据
testers = extract_testers(bugs) if bugs else DEFAULT_TESTER
test_env = extract_server_info(cases) if cases else DEFAULT_TEST_ENV
system_version = extract_version_info_from_bug_list(bugs) if bugs else DEFAULT_SYSTEM_VERSION
server_address = extract_server_info(cases) if cases else DEFAULT_SERVER_ADDRESS
deployment_env = extract_deployment_env(cases) if cases else DEFAULT_DEPLOYMENT_ENV
_add_title(doc, "1.2 测试概览", level=3)
headers = ["项目", "内容"]
rows = [
["项目名称", project_name],
["测试负责人", testers],
["测试人员", testers],
["测试环境", test_env],
["测试类型", "功能测试"],
]
_create_table_with_data(doc, headers, rows)
_add_title(doc, "1.3 被测系统信息", level=3)
headers = ["项目", "内容"]
rows = [
["系统名称", project_name],
["系统版本", system_version],
["服务器地址", server_address],
["部署环境", deployment_env],
]
_create_table_with_data(doc, headers, rows)
```
#### 3.3.2 任务列表
- [ ] 在`word_generator.py`中导入数据提取模块
- [ ] 更新`generate_report`函数签名(如需要)
- [ ] 修改"1.2 测试概览"表格填充逻辑
- [ ] 修改"1.3 被测系统信息"表格填充逻辑
- [ ] 添加错误处理和默认值处理
---
### 阶段四:Markdown生成模块更新(同步更新)
#### 3.4.1 更新Markdown报告生成
- **文件**: `src/markdown_generator.py`
- **更新内容**: 与Word报告生成保持一致的自动填充逻辑
#### 3.4.2 任务列表
- [ ] 在`markdown_generator.py`中导入数据提取模块
- [ ] 更新Markdown报告中的测试概览部分
- [ ] 更新Markdown报告中的被测系统信息部分
---
### 阶段五:测试与验证
#### 3.5.1 单元测试
- **文件**: `tests/test_data_extractor.py`(新建)
- **测试内容**:
- 关键字提取功能测试
- 人员去重合并测试
- 空值处理测试
- 边界情况测试
#### 3.5.2 集成测试
- **测试数据**: 使用`config/BUG列表模板数据.xlsx`和`config/测试用例数据文件.xlsx`
- **验证内容**:
- 验证提取的数据是否正确
- 验证报告生成后的填充结果
- 验证各种边界情况
#### 3.5.3 任务列表
- [ ] 创建单元测试文件
- [ ] 编写关键字提取测试用例
- [ ] 编写人员去重测试用例
- [ ] 编写空值处理测试用例
- [ ] 执行集成测试
- [ ] 验证生成的报告文档
---
## 四、关键实现细节
### 4.1 关键字提取函数设计
#### 4.1.1 基础关键字提取函数
```python
def extract_keyword_value(text: str, keyword: str) -> str:
"""
从文本中提取关键字后的内容(单行)
Args:
text: 源文本
keyword: 关键字(如"服务器信息:")
Returns:
提取的内容,如果未找到则返回空字符串
Examples:
>>> extract_keyword_value("服务器信息:192.168.5.44", "服务器信息:")
"192.168.5.44"
"""
if not text:
return ""
# 查找关键字位置
keyword_index = text.find(keyword)
if keyword_index == -1:
return ""
# 提取关键字后的内容
start_index = keyword_index + len(keyword)
extracted_content = text[start_index:].strip()
# 处理换行符(只取第一行)
if "\n" in extracted_content:
extracted_content = extracted_content.split("\n")[0].strip()
return extracted_content
```
#### 4.1.2 多行版本信息提取函数
```python
def extract_version_info(text: str, keyword: str = "版本信息") -> str:
"""
从文本中提取关键字后的多行版本信息
Args:
text: 源文本
keyword: 关键字(默认为"版本信息")
Returns:
提取的多行版本信息,如果未找到则返回空字符串
Examples:
>>> text = '''版本信息:
... 对内服务:target_integration2.1.2611.762 2026-03-09 09:47:20
... 对外服务:target_integration2.1.2611.762 2026-03-09 09:47:20
... 预定前台:2.0.2605.1443-2026-02-04'''
>>> extract_version_info(text)
'对内服务:target_integration2.1.2611.762 2026-03-09 09:47:20\\n对外服务:target_integration2.1.2611.762 2026-03-09 09:47:20\\n预定前台:2.0.2605.1443-2026-02-04'
"""
if not text:
return ""
# 查找关键字位置
keyword_index = text.find(keyword)
if keyword_index == -1:
return ""
# 提取关键字后的所有内容
start_index = keyword_index + len(keyword)
extracted_content = text[start_index:].strip()
# 按行分割,提取所有非空行
lines = extracted_content.split("\n")
version_lines = []
for line in lines:
line = line.strip()
# 跳过空行和明显不是版本信息的行
if line and (line.startswith("对") or line.startswith("预") or line.startswith("后") or
line.startswith("前") or line.startswith("MQ") or line.startswith("定") or
line.startswith("信") or ":" in line):
version_lines.append(line)
return "\n".join(version_lines) if version_lines else ""
```
#### 4.1.3 从BUG列表中提取版本信息
```python
def extract_version_info_from_bug_list(bug_list: List[Bug]) -> str:
"""
从BUG列表中提取版本信息
Args:
bug_list: BUG对象列表
Returns:
版本信息字符串(多行格式),如果未找到则返回默认值
Examples:
>>> extract_version_info_from_bug_list(bugs)
'对内服务:target_integration2.1.2611.762 2026-03-09 09:47:20\\n对外服务:...'
"""
if not bug_list:
return DEFAULT_SYSTEM_VERSION
# 遍历BUG列表,查找包含版本信息的复现步骤
for bug in bug_list:
if bug.reproduction_steps:
version_info = extract_version_info(bug.reproduction_steps, "版本信息")
if version_info:
return version_info
return DEFAULT_SYSTEM_VERSION
```
### 4.2 人员去重合并函数设计
```python
def extract_testers(bug_list: List[Bug]) -> str:
"""
从BUG列表中提取提单人员(去重合并)
Args:
bug_list: BUG对象列表
Returns:
人员列表字符串,用"、"分隔
Examples:
>>> extract_testers([Bug(reporter="张三"), Bug(reporter="李四"), Bug(reporter="张三")])
"张三、李四"
"""
if not bug_list:
return DEFAULT_TESTER
# 提取所有提单人员
reporters = [bug.reporter for bug in bug_list if bug.reporter]
if not reporters:
return DEFAULT_TESTER
# 去重并保持顺序
unique_reporters = list(dict.fromkeys(reporters))
# 用"、"连接
return "、".join(unique_reporters)
```
### 4.4 从BUG列表中提取版本信息
```python
def extract_info_from_bug_list(bug_list: List[Bug], keyword: str, default: str = "", multi_line: bool = False) -> str:
"""
从BUG列表的复现步骤中提取指定关键字的信息
Args:
bug_list: BUG对象列表
keyword: 要查找的关键字
default: 默认值
multi_line: 是否提取多行内容(用于版本信息)
Returns:
提取的信息
"""
if not bug_list:
return default
# 遍历所有BUG的复现步骤
for bug in bug_list:
if bug.reproduction_steps:
if multi_line:
# 多行提取模式(用于版本信息)
value = extract_version_info(bug.reproduction_steps, keyword)
else:
# 单行提取模式
value = extract_keyword_value(bug.reproduction_steps, keyword)
if value:
return value
return default
```
### 4.5 从测试用例中提取信息
```python
def extract_info_from_cases(cases: List[TestCase], keyword: str, default: str = "") -> str:
"""
从测试用例列表中提取指定关键字的信息
Args:
cases: 测试用例列表
keyword: 要查找的关键字
default: 默认值
Returns:
提取的信息
"""
if not cases:
return default
# 遍历所有用例的预置条件
for case in cases:
if case.pre_condition:
value = extract_keyword_value(case.pre_condition, keyword)
if value:
return value
return default
```
---
## 五、风险评估
| 风险项 | 风险等级 | 应对措施 |
|--------|----------|----------|
| 关键字格式不统一 | 中 | 支持多种关键字变体,增加模糊匹配 |
| 版本信息多行格式解析 | 中 | 使用行识别规则,提取包含版本特征的行 |
| 数据为空或缺失 | 低 | 提供默认值,确保程序不中断 |
| 多个值冲突 | 中 | 优先使用第一个找到的值,可配置优先级 |
| 编码问题 | 低 | 统一使用UTF-8编码处理 |
---
## 六、验收标准
### 6.1 功能验收
- [ ] 从BUG列表中正确提取提单人员(去重合并)
- [ ] 从测试用例中正确提取服务器信息
- [ ] 从BUG列表中正确提取多行版本信息(保留格式)
- [ ] 从测试用例中正确提取部署环境
- [ ] 数据为空时显示默认值
### 6.2 报告验收
- [ ] Word报告的"1.2 测试概览"表格正确填充
- [ ] Word报告的"1.3 被测系统信息"表格正确填充
- [ ] Markdown报告的相应部分正确填充
### 6.3 代码质量
- [ ] 代码符合`代码规范`要求
- [ ] 所有函数有中文注释
- [ ] 单元测试覆盖率>80%
---
## 七、进度跟踪
| 阶段 | 任务 | 预计时间 | 状态 | 完成日期 |
|------|------|----------|------|----------|
| 阶段一 | 数据提取函数开发 | 2小时 | 待执行 | - |
| 阶段二 | 配置模块更新 | 0.5小时 | 待执行 | - |
| 阶段三 | 报告生成模块更新 | 1小时 | 待执行 | - |
| 阶段四 | Markdown生成模块更新 | 0.5小时 | 待执行 | - |
| 阶段五 | 测试与验证 | 1小时 | 待执行 | - |
| **总计** | - | **5小时** | - | - |
---
## 八、相关文档
- 需求文档:`Docs/PRD/自动化生成功能测试报告/需求文档/_PRD_自动填充优化需求文档.md`
- 代码规范:`Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 文档规范:`Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
---
## 九、附录:优化功能回填
> 本节用于记录实际执行过程中的优化和改进
| 日期 | 优化内容 | 影响文件 | 说明 |
|------|----------|----------|------|
| 2026-03-10 | 实现自动填充功能 | `src/data_extractor.py`<br>`src/config.py`<br>`src/word_generator.py`<br>`src/markdown_generator.py` | 完成数据提取模块创建,实现测试概览和被测系统信息的自动填充 |
| 2026-03-10 | 优化数据提取逻辑 | `src/data_extractor.py`<br>`src/config.py` | 支持多种关键字格式(【】标签和:冒号格式),优化IP地址提取,只提取关键信息 |
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论