当前位置: 首页 > news >正文

【day5】调用AI接口,生成自动化测试用例

1、项目结构建议

project/
├── api_docs/ # 存放接口文档
│ └── XX系统.swagger.json
├── ai_generator/ # AI测试用例生成模块
│ └── test_case_generator.py
├── tests/ # 生成的测试用例
│ └── test_user_api.py
├── conftest.py # pytest配置
├── url/ # 存放url
│ └── xx模块url.py
└── requirements.txt

XX系统.swagger.json来源
在这里插入图片描述

2、新增空的xx模块url.py

在这里插入图片描述

3、编写自动化封装api的脚本,自动化生成测试用例

这里需要安装第三方库zhipuai
可以借鉴:https://blog.csdn.net/weixin_41665637/article/details/147113443?

from zhipuai import ZhipuAI
import json
import re
import logging
from pathlib import Path
from typing import Dict, Listclass TestCaseGenerator:def __init__(self, api_key: str):self.client = ZhipuAI(api_key=api_key)self.logger = logging.getLogger(__name__)# pytest测试用例模板self.test_template = """import pytest
import requests
import logging
import certifi
from faker import Faker
from {url_module} import URLManager
from test_data.auth_params import valid_credentials, invalid_credentials# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)# 全局配置
fake = Faker('zh_CN')class TestBase:\"\"\"测试基类\"\"\"@pytest.fixture(scope="session")def url_manager(self):\"\"\"URL管理器\"\"\"return URLManager(base_url="{base_url}")@pytest.fixture(scope="session")def auth_token(self, url_manager):\"\"\"获取认证令牌\"\"\"try:response = requests.post(url_manager.login,json=valid_credentials,verify=certifi.where(),timeout=10)response.raise_for_status()return response.json().get("token")except Exception as e:logger.error(f"登录失败: {{e}}")pytest.fail("认证失败")@pytest.fixturedef headers(self, auth_token):\"\"\"请求头\"\"\"return {{"Authorization": f"Bearer {{auth_token}}","Content-Type": "application/json"}}@pytest.fixturedef test_data(self):\"\"\"生成测试数据\"\"\"return {{"id": fake.random_int(min=1000, max=9999),"name": fake.word(),"description": fake.sentence()}}class TestAPIs(TestBase):\"\"\"自动生成的API测试用例\"\"\"
{test_cases}
"""def generate_test_cases(self, swagger_data: Dict, output_path: str, base_url: str):"""生成完整的测试用例文件:param swagger_data: Swagger文档数据:param output_path: 测试文件输出路径:param base_url: API基础地址"""try:# 生成测试用例内容test_cases = self._generate_test_methods(swagger_data)# 填充模板(修复括号问题)final_code = self.test_template.format(  # <-- 这里添加完整括号url_module="api.urlservice1",base_url=base_url,test_cases="\n".join(test_cases))  # <-- 添加闭合括号# 保存文件self._save_to_file(output_path, final_code)self.logger.info(f"测试用例已生成:{output_path}")except Exception as e:self.logger.error(f"生成测试用例失败:{str(e)}")raisedef _generate_test_methods(self, swagger_data: Dict) -> List[str]:"""生成所有测试方法"""test_methods = []for path, methods in swagger_data["paths"].items():for method, details in methods.items():# 生成单个测试方法test_case = self._create_test_case(path=path,method=method.upper(),summary=details.get("summary", ""),parameters=details.get("parameters", []))test_methods.append(test_case)return test_methodsdef _create_test_case(self, path: str, method: str, summary: str, parameters: List) -> str:"""创建单个测试用例模板"""# 处理方法名method_name = self._generate_method_name(path, method)# 处理路径参数path_params = self._parse_path_params(path)url_expression = self._generate_url_expression(path)# 生成请求模板request_template = self._generate_request_template(method, parameters)return f'''@pytest.mark.{method.lower()}def {method_name}(self, url_manager, headers, test_data):\"\"\"{summary}\"\"\"try:# 构造请求url = {url_expression}response = requests.{method.lower()}(url,headers=headers,{request_template}timeout=10)# 验证响应self._validate_response(response)except requests.exceptions.RequestException as e:logger.error(f"请求失败:{{str(e)}}")pytest.fail(f"接口请求异常:{{str(e)}}")except json.JSONDecodeError:logger.error("响应数据解析失败")pytest.fail("响应数据格式错误")
'''def _generate_method_name(self, path: str, method: str) -> str:"""生成测试方法名"""clean_path = re.sub(r"[{}]", "", path)return f"test_{method.lower()}_{clean_path.strip('/').replace('/', '_')}"def _parse_path_params(self, path: str) -> List[str]:"""解析路径参数"""return re.findall(r"{(\w+)}", path)def _generate_url_expression(self, path: str) -> str:"""生成URL表达式"""return f'f"{path}".format(**test_data)'def _generate_request_template(self, method: str, parameters: List) -> str:"""生成请求模板"""if method.upper() in ["POST", "PUT", "PATCH"]:return "json=test_data,"return ""def _validate_response(self, response) -> str:"""生成响应验证代码"""return """# 基础断言assert 200 <= response.status_code < 300, f"无效状态码:{response.status_code}"# 验证数据结构response_data = response.json()assert isinstance(response_data, (dict, list)), "响应数据结构无效"# 动态验证字段if isinstance(response_data, dict):assert "id" in response_data, "响应缺少ID字段""""def _save_to_file(self, path: str, content: str):"""保存到文件"""output_path = Path(path)output_path.parent.mkdir(parents=True, exist_ok=True)with open(output_path, "w", encoding="utf-8") as f:f.write(content)# 使用示例
if __name__ == "__main__":# 初始化生成器test_gen = TestCaseGenerator(api_key="your_api_key")# 读取Swagger文件swagger_path = "D:/python_test/pythonProject/project/api_docs/123..swagger.json"with open(swagger_path, encoding="utf-8") as f:swagger_data = json.load(f)# 生成测试用例test_gen.generate_test_cases(swagger_data=swagger_data,output_path="D:/python_test/pythonProject/project/tests/test_apis.py",base_url="https://staging.bu.xa.com/api/")

备注:目前生成的用例并不能直接调用使用,需要再手动调整脚本

相关文章:

  • JVM 垃圾回收
  • 一个简单的Python文件MCP服务器
  • OpenAI 最新发布的 GPT-4.1 系列在 API 中正式上线
  • Google-Tensorflow-NLP
  • NLP高频面试题(四十三)——什么是人类偏好对齐中的「对齐税」(Alignment Tax)?如何缓解?
  • 什么样的游戏需要用到游戏盾SDK呢?
  • vue 表格某列超出显示...,悬浮tip
  • 【HarmonyOS 5】AttributeModifier和AttributeUpdater详解
  • 【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8
  • MAC-​​需求​​:10万订单异步执行库存扣减、短信通知。
  • #include<bits/stdc++.h>
  • macos下 ~/.zshrc~ 和 ~/.zshrc
  • WEB安全--蓝队日志--RCE数据包分析
  • 系统架构设计师:系统架构概述知识体系、考点详解、高效记忆要点、练习题并提供答案与解析
  • LeetCode面试热题150中12-18题学习笔记(用Java语言描述)
  • Java项目之基于ssm的QQ村旅游网站的设计(源码+文档)
  • Redis 适合作为微服务架构中的哪些组件?
  • 树莓派_利用Ubuntu搭建gitlab
  • 深入理解 Nacos 服务发现机制
  • RabbitMQ demo案例
  • 碧桂园服务:拟向杨惠妍全资持有的公司提供10亿元贷款,借款将转借给碧桂园用作保交楼
  • 金融监管总局将推出8项增量政策:涉房地产金融、险资入市、稳外贸等
  • 繁荣活跃!“五一”假期全国重点零售和餐饮企业销售额同比增长6.3%
  • 日本政府强烈反对美关税政策并要求其取消
  • 菏泽家长“付费查成绩”风波调查:免费功能被误读
  • 玉渊谭天:美方多渠道主动接触中方希望谈关税