智能测试用例生成工具设计

发布于:2025-08-15 ⋅ 阅读:(18) ⋅ 点赞:(0)

设计一个结合公司历史测试用例和AI能力的智能测试用例生成工具

工具架构设计

核心组件实现

1. 历史用例集成模块

class HistoricalCaseRetriever:
    def __init__(self, case_db_path):
        # 加载用例数据库
        self.case_db = self._load_case_database(case_db_path)
        # 创建语义检索索引
        self.index = self._create_semantic_index()
    
    def _load_case_database(self, path):
        """加载公司历史测试用例库"""
        # 支持多种格式:Excel, TestRail, JIRA, 自定义JSON等
        if path.endswith('.xlsx'):
            return pd.read_excel(path).to_dict('records')
        elif path.endswith('.json'):
            with open(path, 'r') as f:
                return json.load(f)
        # 其他格式处理...
    
    def _create_semantic_index(self):
        """创建语义检索索引"""
        from sentence_transformers import SentenceTransformer, util
        model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
        
        # 提取用例关键信息
        case_texts = [
            f"{case['module']}: {case['title']} | {case['steps']}" 
            for case in self.case_db
        ]
        
        # 生成嵌入向量
        case_embeddings = model.encode(case_texts, convert_to_tensor=True)
        return {'model': model, 'embeddings': case_embeddings, 'cases': self.case_db}
    
    def retrieve_similar_cases(self, new_requirement, top_k=5):
        """检索相似历史用例"""
        # 编码新需求
        query_embedding = self.index['model'].encode(new_requirement, convert_to_tensor=True)
        
        # 计算相似度
        cos_scores = util.pytorch_cos_sim(query_embedding, self.index['embeddings'])[0]
        top_results = torch.topk(cos_scores, k=top_k)
        
        # 返回最相关的用例
        return [{
            'score': score.item(),
            'case': self.index['cases'][idx]
        } for score, idx in zip(top_results[0], top_results[1])]

2. AI生成引擎

class TestCaseGenerator:
    def __init__(self, api_key, company_rules):
        self.llm = ChatOpenAI(
            model="gpt-4-turbo",
            api_key=api_key,
            temperature=0.7
        )
        self.rules = company_rules  # 公司测试规范
        
    def generate_with_context(self, requirement, similar_cases):
        """结合历史用例生成新用例"""
        # 构建提示词
        prompt = self._build_prompt(requirement, similar_cases)
        
        # 调用AI生成
        response = self.llm.invoke(prompt)
        return self._parse_output(response.content)
    
    def _build_prompt(self, requirement, similar_cases):
        """构建包含公司规范和历史用例的提示词"""
        prompt = f"""
        # 角色
        你是{self.rules['company_name']}的高级测试工程师,需根据需求生成符合公司规范的测试用例。
        
        # 公司测试规范
        {self.rules['testing_standards']}
        
        # 需求描述
        {requirement}
        
        # 相关历史用例参考
        {self._format_similar_cases(similar_cases)}
        
        # 生成要求
        1. 使用Gherkin语法:Feature, Scenario, Given, When, Then
        2. 包含正向、逆向和边界测试场景
        3. 每个场景包含至少3个测试步骤
        4. 输出格式:
            ## 功能: [功能名称]
            ### 场景: [场景描述]
            - 当 [条件]
            - 并且 [条件] (可选)
            - 那么 [预期结果]
        5. 生成3-5个核心场景
        """
        return prompt
    
    def _format_similar_cases(self, cases):
        """格式化历史用例参考"""
        return "\n".join([
            f"参考用例 {i+1} (相似度:{case['score']:.2f}):\n" 
            f"模块: {case['case']['module']}\n"
            f"标题: {case['case']['title']}\n"
            f"步骤: {case['case']['steps']}\n"
            for i, case in enumerate(cases)
        ])
    
    def _parse_output(self, text):
        """解析AI输出为结构化用例"""
        # 使用正则提取结构化信息
        pattern = r"## 功能: (.+?)\n### 场景: (.+?)\n- 当 (.+?)\n(?:- 并且 (.+?)\n)?- 那么 (.+?)(?:\n\n|$)"
        matches = re.findall(pattern, text, re.DOTALL)
        
        test_cases = []
        for match in matches:
            feature, scenario, given, and_condition, then = match
            test_cases.append({
                "feature": feature.strip(),
                "scenario": scenario.strip(),
                "steps": {
                    "given": given.strip(),
                    "and": and_condition.strip() if and_condition else "",
                    "then": then.strip()
                }
            })
        return test_cases

3. 完整工作流

class SmartTestCaseGenerator:
    def __init__(self, case_db_path, api_key, company_rules):
        self.retriever = HistoricalCaseRetriever(case_db_path)
        self.generator = TestCaseGenerator(api_key, company_rules)
        self.validator = TestCaseValidator(company_rules)  # 验证模块
    
    def generate_test_cases(self, requirement):
        # 检索相似用例
        similar_cases = self.retriever.retrieve_similar_cases(requirement)
        
        # AI生成新用例
        generated_cases = self.generator.generate_with_context(requirement, similar_cases)
        
        # 验证和优化
        validated_cases = self.validator.validate(generated_cases)
        
        return {
            "similar_cases": similar_cases,
            "generated_cases": validated_cases
        }
    
    def save_to_database(self, cases, requirement):
        """将新生成的用例存入数据库"""
        # 实现数据库存储逻辑
        pass

公司规范集成示例

{
  "company_name": "TechCorp",
  "testing_standards": {
    "priority_levels": ["P0-阻断", "P1-高", "P2-中", "P3-低"],
    "required_fields": ["模块", "标题", "前置条件", "测试步骤", "预期结果", "优先级"],
    "gherkin_standard": "必须使用Given-When-Then格式",
    "boundary_rules": "所有数值输入必须测试边界值±1",
    "error_handling": "每个功能必须包含至少1个异常场景",
    "data_driven": "支持参数化的测试数据"
  }
}

使用示例

# 初始化工具
generator = SmartTestCaseGenerator(
    case_db_path="company_test_cases.json",
    api_key="sk-你的API密钥",
    company_rules=load_company_rules("techcorp_rules.json")
)

# 输入新需求
requirement = """
用户注册功能需求:
1. 支持手机号+验证码注册
2. 密码要求:8-16位,包含大小写字母和数字
3. 需要同意用户协议
4. 注册成功后自动登录
"""

# 生成测试用例
result = generator.generate_test_cases(requirement)

# 输出结果
print("检索到的相似用例:")
for i, case in enumerate(result['similar_cases']):
    print(f"{i+1}. [{case['case']['module']}] {case['case']['title']} (相似度: {case['score']:.2f})")

print("\n生成的测试用例:")
for i, case in enumerate(result['generated_cases']):
    print(f"## {case['feature']}")
    print(f"### {case['scenario']}")
    print(f"- 当 {case['steps']['given']}")
    if case['steps']['and']:
        print(f"- 并且 {case['steps']['and']}")
    print(f"- 那么 {case['steps']['then']}\n")

# 保存到数据库
generator.save_to_database(result['generated_cases'], requirement)

生成用例示例输出

## 功能: 用户注册功能
### 场景: 成功注册新用户
- 当 用户输入符合格式要求的手机号
- 并且 输入正确的验证码
- 并且 设置符合规则的密码(8-16位含大小写字母和数字)
- 并且 勾选用户协议
- 那么 系统创建新账户并自动登录

## 功能: 用户注册功能
### 场景: 手机号格式验证
- 当 用户输入不符合格式的手机号(如不足11位)
- 那么 系统提示"手机号格式错误"

## 功能: 用户注册功能
### 场景: 密码强度验证
- 当 用户设置纯数字密码
- 那么 系统提示"密码必须包含大小写字母和数字"

关键优势

  1. ​知识传承​​:将历史测试用例转化为可检索的知识库

  2. ​规范遵循​​:通过提示词确保符合公司测试标准

  3. ​智能生成​​:AI创造新场景 + 规则引擎保证覆盖率

  4. ​持续优化​​:新生成的用例可反馈到知识库

  5. ​效率提升​​:减少重复工作,聚焦创新性测试场景

部署建议

  1. ​私有化部署​​:使用开源LLM(如Llama3)确保数据安全

  2. ​版本控制​​:用例库与生成模型版本绑定

  3. ​人工审核​​:关键系统用例必须人工验证

  4. ​质量评估​​:添加生成用例的质量评分机制

  5. ​集成CI/CD​​:与测试管理系统(TestRail/JIRA)对接

这个设计将公司历史资产与AI能力有机结合,既保证了测试用例的规范性和覆盖率,又通过AI生成了创新性测试场景,大幅提升测试设计效率。


网站公告

今日签到

点亮在社区的每一天
去签到