【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.pswp.cn/pingmian/77340.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77340.shtml
英文地址,請注明出處:http://en.pswp.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的架構設計與核心模…