162 lines
4.8 KiB
Python
162 lines
4.8 KiB
Python
|
|
# @line_count 150
|
|||
|
|
"""测试规范加载器"""
|
|||
|
|
import yaml
|
|||
|
|
from pathlib import Path
|
|||
|
|
from typing import List, Dict, Any, Optional
|
|||
|
|
|
|||
|
|
|
|||
|
|
class TestStandardLoader:
|
|||
|
|
"""测试规范加载器,负责从配置文件加载测试规范"""
|
|||
|
|
|
|||
|
|
def __init__(self, config_path: Optional[str] = None):
|
|||
|
|
"""
|
|||
|
|
初始化测试规范加载器
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
config_path: 配置文件路径,默认为config/test_standards.yaml
|
|||
|
|
"""
|
|||
|
|
if config_path is None:
|
|||
|
|
current_dir = Path(__file__).parent.parent
|
|||
|
|
config_path = current_dir / "config" / "test_standards.yaml"
|
|||
|
|
|
|||
|
|
self.config_path = Path(config_path)
|
|||
|
|
self.standards: List[Dict[str, Any]] = []
|
|||
|
|
self.mapping_rules: Dict[str, Any] = {}
|
|||
|
|
self.keyword_mapping: Dict[str, List[str]] = {}
|
|||
|
|
self.load_config()
|
|||
|
|
|
|||
|
|
def load_config(self):
|
|||
|
|
"""加载配置文件"""
|
|||
|
|
if not self.config_path.exists():
|
|||
|
|
raise FileNotFoundError(f"测试规范配置文件不存在: {self.config_path}")
|
|||
|
|
|
|||
|
|
with open(self.config_path, 'r', encoding='utf-8') as f:
|
|||
|
|
config = yaml.safe_load(f)
|
|||
|
|
|
|||
|
|
self.standards = config.get('test_standards', [])
|
|||
|
|
self.mapping_rules = config.get('requirement_mapping', {})
|
|||
|
|
self.keyword_mapping = config.get('keyword_mapping', {})
|
|||
|
|
|
|||
|
|
def get_all_standards(self) -> List[Dict[str, Any]]:
|
|||
|
|
"""
|
|||
|
|
获取所有测试规范
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
测试规范列表
|
|||
|
|
"""
|
|||
|
|
return self.standards
|
|||
|
|
|
|||
|
|
def get_standard_by_id(self, standard_id: str) -> Optional[Dict[str, Any]]:
|
|||
|
|
"""
|
|||
|
|
根据ID获取测试规范
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
standard_id: 测试规范ID
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
测试规范字典,如果不存在返回None
|
|||
|
|
"""
|
|||
|
|
for standard in self.standards:
|
|||
|
|
if standard.get('id') == standard_id:
|
|||
|
|
return standard
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
def get_standards_by_ids(self, standard_ids: List[str]) -> List[Dict[str, Any]]:
|
|||
|
|
"""
|
|||
|
|
根据ID列表获取多个测试规范
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
standard_ids: 测试规范ID列表
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
测试规范列表
|
|||
|
|
"""
|
|||
|
|
result = []
|
|||
|
|
for standard_id in standard_ids:
|
|||
|
|
standard = self.get_standard_by_id(standard_id)
|
|||
|
|
if standard:
|
|||
|
|
result.append(standard)
|
|||
|
|
return result
|
|||
|
|
|
|||
|
|
def get_standard_summary(self, standard_id: str) -> str:
|
|||
|
|
"""
|
|||
|
|
获取测试规范的摘要
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
standard_id: 测试规范ID
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
规范摘要文本
|
|||
|
|
"""
|
|||
|
|
standard = self.get_standard_by_id(standard_id)
|
|||
|
|
if standard:
|
|||
|
|
return standard.get('summary', '')
|
|||
|
|
return ''
|
|||
|
|
|
|||
|
|
def get_standard_key_points(self, standard_id: str) -> List[str]:
|
|||
|
|
"""
|
|||
|
|
获取测试规范的关键测试点
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
standard_id: 测试规范ID
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
关键测试点列表
|
|||
|
|
"""
|
|||
|
|
standard = self.get_standard_by_id(standard_id)
|
|||
|
|
if standard:
|
|||
|
|
return standard.get('key_points', [])
|
|||
|
|
return []
|
|||
|
|
|
|||
|
|
def get_requirement_mapping(self) -> Dict[str, Any]:
|
|||
|
|
"""
|
|||
|
|
获取需求类型到测试规范的映射规则
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
映射规则字典
|
|||
|
|
"""
|
|||
|
|
return self.mapping_rules
|
|||
|
|
|
|||
|
|
def get_keyword_mapping(self) -> Dict[str, List[str]]:
|
|||
|
|
"""
|
|||
|
|
获取关键词到测试规范的映射规则
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
关键词映射字典
|
|||
|
|
"""
|
|||
|
|
return self.keyword_mapping
|
|||
|
|
|
|||
|
|
def format_standards_summary(self, standard_ids: List[str]) -> str:
|
|||
|
|
"""
|
|||
|
|
格式化多个测试规范的摘要,用于Prompt
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
standard_ids: 测试规范ID列表
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
格式化后的摘要文本
|
|||
|
|
"""
|
|||
|
|
if not standard_ids:
|
|||
|
|
return ""
|
|||
|
|
|
|||
|
|
lines = []
|
|||
|
|
for standard_id in standard_ids:
|
|||
|
|
standard = self.get_standard_by_id(standard_id)
|
|||
|
|
if not standard:
|
|||
|
|
continue
|
|||
|
|
|
|||
|
|
name = standard.get('name', standard_id)
|
|||
|
|
summary = standard.get('summary', '').strip()
|
|||
|
|
key_points = standard.get('key_points', [])
|
|||
|
|
|
|||
|
|
lines.append(f"【{name}】")
|
|||
|
|
if summary:
|
|||
|
|
lines.append(summary)
|
|||
|
|
if key_points:
|
|||
|
|
lines.append("关键测试点:")
|
|||
|
|
for i, point in enumerate(key_points, 1):
|
|||
|
|
lines.append(f" {i}. {point}")
|
|||
|
|
lines.append("") # 空行分隔
|
|||
|
|
|
|||
|
|
return "\n".join(lines)
|