# @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]