Files
test_item_gen/modules/test_standard_manager.py

197 lines
6.8 KiB
Python
Raw Permalink Normal View History

2026-02-04 14:38:52 +08:00
# @line_count 250
"""测试规范管理器整合规范加载、选择和Prompt构建"""
from typing import List, Dict, Any, Optional, TYPE_CHECKING
from .test_standard_loader import TestStandardLoader
from .standard_selector import StandardSelector
if TYPE_CHECKING:
from .api_client import APIClient
class TestStandardManager:
"""测试规范管理器负责管理测试规范、选择适用规范、构建Prompt"""
def __init__(self, loader: Optional[TestStandardLoader] = None,
selector: Optional[StandardSelector] = None,
api_client: Optional['APIClient'] = None):
"""
初始化测试规范管理器
Args:
loader: 测试规范加载器如果为None则创建新实例
selector: 规范选择器如果为None则创建新实例
api_client: API客户端用于AI辅助选择
"""
self.loader = loader or TestStandardLoader()
self.api_client = api_client
self.selector = selector or StandardSelector(self.loader, api_client)
def get_applicable_standards(self, requirement: Dict[str, Any],
use_ai: bool = True) -> List[str]:
"""
为需求获取适用的测试规范
Args:
requirement: 需求字典
use_ai: 是否使用AI辅助选择
Returns:
测试规范ID列表
"""
return self.selector.select_standards(requirement, use_ai=use_ai)
def build_prompt(self, requirement: Dict[str, Any],
standard_ids: Optional[List[str]] = None,
include_full_content: bool = False) -> str:
"""
构建包含测试规范的分层Prompt
Args:
requirement: 需求字典
standard_ids: 测试规范ID列表如果为None则自动选择
include_full_content: 是否包含完整规范内容默认只包含摘要
Returns:
格式化后的Prompt文本
"""
# 如果没有指定规范,自动选择
if standard_ids is None:
standard_ids = self.get_applicable_standards(requirement)
# Level 1: 测试规范摘要
standards_summary = self._build_standards_summary(standard_ids, include_full_content)
# Level 2: 需求信息
requirement_info = self._format_requirement(requirement)
# 构建完整Prompt
prompt = f"""你是一位资深的软件测试专家,请严格按照以下测试规范生成测试用例。
适用的测试规范
根据需求类型"{requirement.get('requirement_type', '未知')}"以下测试规范适用
{standards_summary}
需求信息
{requirement_info}
生成要求
1. 必须覆盖上述测试规范中的所有关键测试点
2. 每个适用的测试规范至少生成1个测试项
3. 测试用例要详细可执行包含
- 前置条件
- 详细测试步骤编号清晰
- 预期结果
- 优先级//
4. 确保覆盖正常功能异常情况边界条件
5. 每个测试项应标注引用的测试规范standard_reference字段
输出格式
以JSON格式输出格式如下
{{
"test_items": [
{{
"name": "测试项名称",
"test_type": "功能测试",
"priority": "",
"test_objective": "测试目标",
"standard_reference": "功能测试",
"test_cases": [
{{
"name": "测试用例名称",
"preconditions": "前置条件",
"test_steps": ["步骤1", "步骤2", "步骤3"],
"expected_result": "预期结果",
"priority": "",
"test_type": "功能测试"
}}
]
}}
]
}}"""
return prompt
def _build_standards_summary(self, standard_ids: List[str],
include_full: bool = False) -> str:
"""
构建测试规范摘要
Args:
standard_ids: 测试规范ID列表
include_full: 是否包含完整内容
Returns:
格式化后的规范摘要
"""
if not standard_ids:
return "无适用的测试规范"
return self.loader.format_standards_summary(standard_ids)
def _format_requirement(self, requirement: Dict[str, Any]) -> str:
"""
格式化需求信息
Args:
requirement: 需求字典
Returns:
格式化后的需求信息文本
"""
lines = []
lines.append(f"需求编号:{requirement.get('requirement_id', 'N/A')}")
lines.append(f"需求类型:{requirement.get('requirement_type', 'N/A')}")
lines.append(f"需求描述:{requirement.get('description', 'N/A')}")
module_name = requirement.get('module_name', '')
if module_name:
lines.append(f"所属模块:{module_name}")
# 接口信息(如果有)
interface_info = requirement.get('interface_info')
if interface_info:
lines.append("\n【接口信息】")
if interface_info.get('接口名称'):
lines.append(f"接口名称:{interface_info['接口名称']}")
if interface_info.get('接口类型'):
lines.append(f"接口类型:{interface_info['接口类型']}")
if interface_info.get('来源'):
lines.append(f"来源:{interface_info['来源']}")
if interface_info.get('目的地'):
lines.append(f"目的地:{interface_info['目的地']}")
return "\n".join(lines)
def get_standards_summary(self, standard_ids: List[str]) -> str:
"""
获取测试规范摘要便捷方法
Args:
standard_ids: 测试规范ID列表
Returns:
规范摘要文本
"""
return self.loader.format_standards_summary(standard_ids)
def confirm_test_types(self, requirement: Dict[str, Any],
candidate_standards: List[str]) -> List[str]:
"""
确认最终使用的测试类型两阶段生成策略的阶段1
Args:
requirement: 需求字典
candidate_standards: 候选测试规范ID列表
Returns:
确认后的测试规范ID列表
"""
# 如果候选类型不多(<=3直接使用
if len(candidate_standards) <= 3:
return candidate_standards
# 如果候选类型较多,可以进一步筛选
# 这里简化处理直接返回前5个
return candidate_standards[:5]