init rep
This commit is contained in:
196
modules/test_standard_manager.py
Normal file
196
modules/test_standard_manager.py
Normal file
@@ -0,0 +1,196 @@
|
||||
# @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]
|
||||
Reference in New Issue
Block a user