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

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

- 新增数据提取模块,支持从Excel数据文件自动提取测试概览和系统信息
- 添加关键字配置,支持服务器信息、部署环境、版本信息等标签识别
- 实现测试负责人、测试人员、测试环境等字段的自动填充功能
- 集成到Word和Markdown报告生成器,确保两种格式的一致性
- 添加默认值配置,处理数据缺失情况的优雅降级
- 更新需求文档,完善自动填充规则和执行计划说明
上级 4c9131ba
......@@ -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
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论