【day8】调用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?

import requests
from zhipuai import ZhipuAI
import json
import re
import logging
from pathlib import Path
from typing import Dict, List, Optional, Any
from dataclasses import dataclass
from faker import Fakerlogging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)@dataclass
class APIEndpoint:path: strmethod: strsummary: strparameters: List[Dict[str, Any]]operation_id: Optional[str] = Noneclass TestCaseGenerator:def __init__(self, api_key: str, base_url: str = ""):self.client = ZhipuAI(api_key=api_key)self.faker = Faker('zh_CN')self.base_url = base_url.strip('/')self.test_template = """import pytest
import requests
import logging
from faker import Faker
from api.urls import AuthUrls
from api.merchant_urls import MerchantUrls
from test_data.auth_params import valid_credentials
from config.settings import get_base_urllogging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class TestGeneratedCases:@pytest.fixture(scope="class")def auth_token(self):url = AuthUrls().loginresponse = requests.post(url, json=valid_credentials)assert response.status_code == 200return response.json()["token"]{test_methods}
"""def generate_test_cases(self, swagger_data: Dict, output_path: str):"""生成完整测试用例文件"""endpoints = self._parse_swagger(swagger_data)test_methods = "\n\n    ".join([self._generate_test_method(endpoint) for endpoint in endpoints])test_file = self.test_template.format(test_methods=test_methods)self._save_to_file(output_path, test_file)def _parse_swagger(self, swagger_data: Dict) -> List[APIEndpoint]:"""解析Swagger文档"""endpoints = []for path, methods in swagger_data["paths"].items():for method, details in methods.items():endpoint = APIEndpoint(path=path,method=method.upper(),summary=details.get("summary", "No description"),parameters=details.get("parameters", []),operation_id=details.get("operationId"))endpoints.append(endpoint)return endpointsdef _generate_test_method(self, endpoint: APIEndpoint) -> str:"""生成单个测试方法"""method_name = self._generate_method_name(endpoint)path_params = self._parse_path_params(endpoint.path)query_params = [p["name"] for p in endpoint.parameters if p.get("in") == "query"]body_params = [p["name"] for p in endpoint.parameters if p.get("in") == "body"]# 生成URL(使用正确的方法名和参数)url = self._generate_full_url(base_path=endpoint.path,path_params=path_params)# 生成请求参数(暂时简化处理)request_params = self._build_request_params(method=endpoint.method.lower(),path_params=path_params,query_params=query_params,body_params=body_params)return f'''@pytest.mark.{endpoint.method.lower()}def {method_name}(self, auth_token):"""{endpoint.summary}"""# 生成URLurl =get_base_url()+"{url}"# 生成请求参数request_params ={request_params}headers = {{"Authorization": f"Bearer {{auth_token}}"}}response = requests.{endpoint.method.lower()}(url,headers=headers,json=request_params)assert 200 == response.status_code
'''def _parse_request_body(self, parameters: List) -> Dict:"""深度解析请求体结构"""body_params = next((p for p in parameters if p.get('in') == 'body'), None)if not body_params:return {}schema = body_params.get('schema', {})if '$ref' in schema:return self._resolve_ref(schema['$ref'])return self._parse_schema(schema)def _generate_smart_data(self, schema: Dict) -> Dict:"""生成符合schema的智能数据"""# 实现递归数据生成逻辑passdef _build_request_params(self, method: str, path_params: list, query_params: list, body_params: list) -> dict:"""构建请求参数字典"""params = []# 路径参数处理if path_params:params.append(f"params={{'{path_params[0]}': self.faker.uuid4()}}")if method in ['post', 'put', 'patch'] and body_params:params.append(f"json={{'{body_params[0]}': self.faker.word()}}")return ",\n                ".join(params)def _generate_full_url(self, base_path: str, path_params: list) -> str:"""生成完整URL(示例:/api/devices/{device_id} -> /api/devices/123)"""# 替换路径参数formatted_path = base_pathfor param in path_params:formatted_path = formatted_path.replace(f"{{{param}}}", f"{{self.faker.uuid4()}}")# 拼接基础URLreturn f"{self.base_url}/{formatted_path.lstrip('/')}"def _parse_path_params(self, path: str) -> List[str]:"""解析路径参数"""return re.findall(r"{(\w+)}", path)def _generate_method_name(self, endpoint: APIEndpoint) -> str:"""生成测试方法名"""clean_path = re.sub(r"[{}]", "", endpoint.path)return f"test_{endpoint.method.lower()}_{clean_path.strip('/').replace('/', '_')}"def _path_to_method(self, path: str) -> str:"""路径转方法名"""return re.sub(r"\W+", "_", path).strip("_")def _save_to_file(self, path: str, content: str):"""保存测试文件"""Path(path).parent.mkdir(parents=True, exist_ok=True)with open(path, "w", encoding="utf-8") as f:f.write(content)if __name__ == "__main__":# 使用示例generator = TestCaseGenerator(api_key="your api_key",base_url="")with open(r"D:\python_test\pythonProject\project\api_docs\你的.json", encoding="utf-8") as f:swagger_data = json.load(f)generator.generate_test_cases(swagger_data=swagger_data,output_path=r"D:\python_test\pythonProject\你的存放测试用例地址")
print("✅自动化测试用例已生成!")

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

生成的用例,目前未取到json值,这里我再检查优化一下
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React应用开发学习指南

AI生成研究报告:关键词 React应用开发 React 已经成为前端 Web 开发领域的主导力量,它是一个免费且开源的 JavaScript 库,主要用于构建用户界面 (UI) 1。其多功能性延伸到为 Web 和原生应用程序创建 UI,使其成为行业内备受追捧的…

MSTP+VRRP+DHCP(ENSP)

下载链接 通过网盘分享的文件&#xff1a;MSTPVRRPDHCP拓扑图 链接: https://pan.baidu.com/s/1ehRwRQ-WzKC8PsUHsTe70Q?pwd345d 提取码: 345d PC1 PC2 PC5 AR1 为AR1各端口配置IP地址 <Huawei>sys [Huawei]un in en [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/…

第一个Qt开发的OpenCV程序

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 下载安装Qt&#xff1a;https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 下载安装OpenCV&#xff1a;https://opencv.org/releases/ 下载安装CMake&#xff1a;Downl…

深入解析 Python 中的装饰器 —— 从基础到实战

1. 装饰器基础 1.1 什么是装饰器&#xff1f; 装饰器本质上是一个 Python 函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象。 1.2 语法糖&#xff1a; 符号 Python 提供了 符号作为装饰器的语法糖&#xff0c…

研究生面试常见问题

研究生面试是考研复试的重要环节&#xff0c;面试表现直接关系到录取结果。以下从面试流程、常见问题分类及回答技巧等方面为您整理了相关内容&#xff0c;帮助您更好地准备面试。 一、研究生面试的基本流程 自我介绍&#xff1a;通常需要准备1分钟左右的中文或英文自我介绍&a…

无人机避障与目标识别技术分析!

一、无人机避障技术 1. 技术实现方式 传感器融合&#xff1a; 视觉传感&#xff08;RGB/双目/红外相机&#xff09;&#xff1a;基于SLAM&#xff08;同步定位与地图构建&#xff09;实现环境建模&#xff0c;但依赖光照条件。 激光雷达&#xff08;LiDAR&#xff09;&…

Facebook隐私保护:从技术到伦理的探索

在这个数字化时代&#xff0c;隐私保护已成为公众关注的焦点。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;其用户隐私保护问题更是引起了广泛的讨论。本文将从技术层面和伦理层面探讨 Facebook 在隐私保护方面的努力和挑战。 技术层面的隐私保护 在技术…

vmware17 虚拟机 ubuntu22.04 桥接模式,虚拟机无法接收组播消息

问题描述&#xff1a; 在一个项目中&#xff0c;宿主机win10中&#xff0c;使用的vmware17pro 虚拟机安装的ubuntu22.04&#xff0c;按照网上的教程使用Qt绑定组播消息&#xff0c;在另外一个Ubuntu工控机上发送用wiresahrk抓包的组播消息 sudo tcpreplay -i enp1s0 --loop0 y…

《Operating System Concepts》阅读笔记:p735-p737

《Operating System Concepts》学习第 62 天&#xff0c;p735-p737 总结&#xff0c;总计 3 页。 一、技术总结 1.distributed system (1)定义 A collection of loosely coupled nodes interconnected by a communication network(一组通过通信网络相互连接的松散耦合节点)…

NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)

一个具有n个顶点的连通图&#xff0c;其⽣成树为包含n-1条边和所有顶点的极⼩连通⼦图。对于⽣成树来说&#xff0c;若砍去⼀条边就会使图不连通图&#xff1b;若增加⼀条边就会形成回路。 ⼀个图的⽣成树可能有多个&#xff0c;将所有⽣成树中权值之和最⼩的树称为最⼩⽣成树…

小白从0学习网站搭建的关键事项和避坑指南(2)

以下是针对小白从零学习网站搭建的 进阶注意事项和避坑指南&#xff08;第二期&#xff09;&#xff0c;覆盖开发中的高阶技巧、常见陷阱及解决方案&#xff0c;帮助你在实战中提升效率和质量&#xff1a; 一、进阶技术选型避坑 1. 前端框架选择 误区&#xff1a;盲目追求最新…

Java的Servlet的监听器Listener 笔记250417

Java的Servlet的监听器Listener 笔记250417 分类1: 一、生命周期监听器 监听容器&#xff08;如 Tomcat&#xff09;中应用、会话或请求的创建与销毁。 监听器接口触发事件典型用途ServletContextListener应用启动 (contextInitialized)、关闭 (contextDestroyed)全局资源管…

网络安全领域的AI战略准备:从概念到实践

网络安全领域的AI准备不仅涉及最新工具和技术的应用&#xff0c;更是一项战略必需。许多企业若因目标不明确、数据准备不足或与业务重点脱节而未能有效利用AI技术&#xff0c;可能面临严重后果&#xff0c;包括高级网络威胁数量的激增。 AI准备的核心要素 构建稳健的网络安全…

[数据结构]2. 顺序表

顺序表 1. 介绍基本概念存储方式优点缺点应用场景 2. 顺序表操作SeqList.hSeqlist.c 1. 介绍 基本概念 顺序表是用一组地址连续的存储单元依次存储线性表的数据元素。线性表是具有相同数据类型的 n 个数据元素的有限序列&#xff0c;在顺序表中&#xff0c;元素之间的逻辑顺序…

o3和o4-mini的升级有哪些亮点?

ChatGPT是基于OpenAI GPT系列的高性能对话生成AI&#xff0c;经过多代迭代不断提升自然语言理解和生成能力。 在过去的一年中&#xff0c;OpenAI先后发布了GPT-4、GPT‑4.1及多种mini版本&#xff0c;为不同使用场景提供灵活选择。​ 随着用户需求向更高效、更精准的推理和视觉…

Chrome漏洞可窃取数据并获得未经授权的访问权限

在发现两个关键漏洞后,谷歌发布了Chrome浏览器的紧急安全更新。这些漏洞可能允许攻击者窃取敏感数据并未经授权访问用户系统。 这些缺陷被识别为CVE-2025-3619和CVE-2025-3620,在Windows和Mac的135.0.7049.95/.96之前影响Chrome版本,影响Linux的135.0.7049.95/.96。该更新将在…

力扣面试150题--两数之和 和 快乐数

Day 25 题目描述 思路 创建一个hashmap从前向后遍历数组如果存在target-nums[i]在map中&#xff0c;记录它们两个的序号返回即可不存在&#xff0c;就将该元素放入map中&#xff0c;存放序号 注意&#xff1a;题目说的是必然存在唯一解 class Solution {public int[] twoSum…

Flutter_学习记录_状态管理之GetX

Flutter GetX 状态管理框架全面解析 1. 状态管理与 Flutter GetX 介绍 1.1 状态管理 通俗理解&#xff1a;当我们需要在多个页面&#xff08;组件/Widget&#xff09;之间共享状态&#xff08;数据&#xff09;&#xff0c;或者在一个页面中的多个子组件之间共享状态时&…

ASP.NET常见安全漏洞及修复方式

Microsoft IIS 版本信息泄露 查看网页返回的 Header 信息&#xff0c;默认会包含 IIS&#xff0c;ASP.NET 版本信息&#xff1a; 隐藏 Server 标头 编辑 web.config 文件&#xff0c;在 system.webServer 节点中配置 requestFiltering 来移除Server标头&#xff1a; <sec…

深入解析Java日志框架Logback:从原理到最佳实践

Logback作为Java领域最主流的日志框架之一,由Log4j创始人Ceki Glc设计开发,凭借其卓越的性能、灵活的配置以及与SLF4J的无缝集成,成为企业级应用开发的首选日志组件。本文将从架构设计、核心机制、配置优化等维度全面剖析Logback的技术细节。 一、Logback的架构设计与核心模…