国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

調(diào)教了一個(gè)AI Agent,全天自動(dòng)寫測試用例:準(zhǔn)確率提升70%+

0
分享至

一、FastAPI框架簡介

1.1 FastAPI框架簡介

FastAPI是一個(gè)用于構(gòu)建API的現(xiàn)代、快速(高性能)的Web框架,基于Python 3.7+的類型提示,建立在Starlette和Pydantic基礎(chǔ)之上。

FastAPI框架有以下特性:

Starlette:輕量級的 ASGI 框架/工具包,是構(gòu)建高性能 Asyncio 服務(wù)的理想選擇

Pydantic:基于 Python 類型提示來定義數(shù)據(jù)驗(yàn)證、序列化和文檔的庫

FastAPI 的核心特性:

1.快速:可與 NodeJS 和 Go 比肩的極高性能,是最快的 Python Web 框架之一

2.智能:極佳的編輯器支持,處處皆可自動(dòng)補(bǔ)全,減少調(diào)試時(shí)間

3.簡單:設(shè)計(jì)的易于使用和學(xué)習(xí),閱讀文檔的時(shí)間更短

4.簡短:使代碼重復(fù)最小化,通過不同的參數(shù)聲明實(shí)現(xiàn)豐富功能

5.健壯:生產(chǎn)可用級別的代碼,還有自動(dòng)生成的交互式文檔

6.標(biāo)準(zhǔn)化:基于(并完全兼容)API 的相關(guān)開放標(biāo)準(zhǔn):OpenAPI 和 JSON Schema



1.2 為什么選擇FastAPI框架

讓我們從多個(gè)維度詳細(xì)對比 FastAPI、Flask 和 Django REST Framework框架:



FastAPI 的性能優(yōu)勢:

●基于 ASGI(異步服務(wù)器網(wǎng)關(guān)接口),而非傳統(tǒng)的 WSGI

●原生支持 async/await,充分利用 Python 異步特性

●使用 Uvicorn 作為 ASGI 服務(wù)器,性能接近 Go 和 Node.js

選擇 FastAPI 框架的理由:

1.原生異步支持:完美支持 async/await,適合 I/O 密集型應(yīng)用

2.自動(dòng)數(shù)據(jù)驗(yàn)證:基于 Pydantic,自動(dòng)驗(yàn)證請求數(shù)據(jù)并生成清晰的錯(cuò)誤信息

3.自動(dòng)文檔生成:無需額外配置即可生成交互式 API 文檔(Swagger UI 和 ReDoc)

4.類型安全:完整的類型提示支持,IDE 自動(dòng)補(bǔ)全和類型檢查

5.高性能:基于 ASGI,性能接近 Go 和 Node.js

6.現(xiàn)代化設(shè)計(jì):充分利用 Python 3.7+ 的新特性

二、FastAPI開發(fā)環(huán)境配置

2.1 環(huán)境準(zhǔn)備

系統(tǒng)要求:

●建議使用Python 3.12

●pip 包管理器

2.2 安裝依賴

# 創(chuàng)建虛擬環(huán)境(推薦)
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或
venv\Scripts\activate # Windows
# 安裝 FastAPI 和 Uvicorn
pip install fastapi uvicorn[standard]
# 安裝項(xiàng)目依賴
pip install tortoise-orm aiosqlite # ORM 和數(shù)據(jù)庫
pip install pydantic pydantic-settings # 數(shù)據(jù)驗(yàn)證和配置
pip install chromadb # 向量數(shù)據(jù)庫
pip install crewai # Agent 框架
pip install python-multipart # 文件上傳支持

2.3 項(xiàng)目結(jié)構(gòu)

FastAPI項(xiàng)目有這著其簡潔清晰和可維護(hù)的項(xiàng)目結(jié)構(gòu),強(qiáng)烈推薦的最佳實(shí)踐的項(xiàng)目結(jié)構(gòu)如下:

XMaster/
├── backend/ # 后端項(xiàng)目
│ ├── main.py # FastAPI 應(yīng)用入口
│ ├── base/ # 基礎(chǔ)模塊
│ │ ├── config.py # 配置管理
│ │ ├── db_action.py # 數(shù)據(jù)庫操作
│ │ ├── embedding_vector.py # 向量嵌入
│ │ └── logger_config.py # 日志配置
│ ├── models/ # 數(shù)據(jù)模型
│ │ ├── user.py
│ │ ├── knowledge.py
│ │ └── test_case.py
│ ├── schemas/ # Pydantic 模式
│ ├── api/ # API 路由
│ ├── agents/ # Agent 智能體
│ │ ├── case_generator_agent.py
│ │ └── rag_retrieval_agent.py
│ ├── services/ # 業(yè)務(wù)邏輯
│ └── data/ # 數(shù)據(jù)存儲(chǔ)
│ ├── sys-sqlite.db # SQLite 數(shù)據(jù)庫
│ └── vector_db/ # ChromaDB 向量庫
└── vue-front/ # 前端項(xiàng)目
├── src/
│ ├── views/ # 頁面組件
│ ├── components/ # 通用組件
│ ├── stores/ # Pinia 狀態(tài)管理
│ └── api/ # API 接口
└── package.json



三、FastAPI實(shí)戰(zhàn)

3.1 最簡FastAPI應(yīng)用示例

import uvicorn
# 導(dǎo)入FastAPI類
from fastapi import FastAPI
# 創(chuàng)建FastAPI實(shí)例,實(shí)例名自定義
FastApp = FastAPI()
@FastApp.get("/")
async def root():
return {"message": "Hello World"}
@FastApp.get("/hello/{name}")
async def say_hello(name: str):
return {"message": f"Hello {name}"}
if __name__ == "__main__":
uvicorn.run("main:FastApp", host="0.0.0.0", port=8000, reload=True)

運(yùn)行應(yīng)用:

python main.py

訪問http://localhost:8000,我們會(huì)看到:

{"message": "Hello World"}

訪問http://localhost:8000/hello/FastAPI,我們會(huì)看到:

{"message": "Hello FastAPI"}

FastAPI 的核心特性解析:

1. 自動(dòng)生成交互式 API 文檔

●訪問http://localhost:8000/docs,我們會(huì)看到自動(dòng)生成的Swagger UI文檔:



●訪問http://localhost:8000/redoc,會(huì)看到ReDoc風(fēng)格的文檔。

2. 類型提示和自動(dòng)驗(yàn)證

@FastApp.get("/hello/{name}")
async def say_hello(name: str): # 類型提示:name 必須是字符串
return {"message": f"Hello {name}"}

FastAPI 會(huì)自動(dòng)完成下述事務(wù):

●驗(yàn)證 name 是否為字符串

●在文檔中顯示參數(shù)類型

●提供編輯器自動(dòng)補(bǔ)全

3. 異步支持

@FastApp.get("/")
async def root(): # 使用 async 關(guān)鍵字
return {"message": "Hello World"}

●使用 async def 定義異步路由

●支持 await 調(diào)用異步函數(shù)

●充分利用 Python 異步特性,提升并發(fā)性能

4. 自動(dòng) JSON 序列化

FastAPI 自動(dòng)將 Python 字典轉(zhuǎn)換為 JSON 響應(yīng),無需手動(dòng)序列化。

3.2 FastAPI 應(yīng)用類

FastAPI 應(yīng)用類是整個(gè)應(yīng)用的核心,負(fù)責(zé)路由注冊、中間件配置、生命周期管理等。

創(chuàng)建 FastAPI 實(shí)例
from fastapi import FastAPI
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app: FastAPI):
"""應(yīng)用生命周期管理"""
# 啟動(dòng)時(shí)執(zhí)行
print("應(yīng)用啟動(dòng)中...")
await init_database() # 初始化數(shù)據(jù)庫
yield # 應(yīng)用運(yùn)行中
# 關(guān)閉時(shí)執(zhí)行
print("應(yīng)用關(guān)閉中...")
await close_database() # 關(guān)閉數(shù)據(jù)庫連接
# 創(chuàng)建 FastAPI 應(yīng)用實(shí)例
app = FastAPI(
title="XAuto智能體平臺(tái)",
version="1.0.0",
description="基于 FastAPI + CrewAI 的測試用例生成平臺(tái)",
lifespan=lifespan # 生命周期管理
)

FastAPI 實(shí)例參數(shù)說明:



配置 CORS 中間件

from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 允許的源
allow_credentials=True,
allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"],
allow_headers=["*"],
)

全局異常處理

from fastapi import Request, HTTPException
from fastapi.responses import JSONResponse
@app.exception_handler(HTTPException)
async def http_exception_handler(request: Request, exc: HTTPException):
"""HTTP 異常處理器"""
returnJSONResponse(
status_code=exc.status_code,
content={"message": exc.detail}
)
@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
"""全局異常處理器"""
returnJSONResponse(
status_code=500,
content={"message": f"服務(wù)器內(nèi)部錯(cuò)誤: {str(exc)}"}
)

3.3 FastAPI的請求路由系統(tǒng)

3.3.1 路由參數(shù)

路由參數(shù)(Path Parameters)是 URL 路徑的一部分。

from fastapi import Path
@app.get("/items/{item_id}")
async def read_item(
item_id: int = Path(..., title="商品ID", ge=1, le=1000)
):
"""
獲取商品信息
- item_id: 商品ID,范圍 1-1000
"""
return{"item_id": item_id, "name": f"商品{item_id}"}

路徑參數(shù)驗(yàn)證:



3.3.2 查詢參數(shù)

查詢參數(shù)(Query Parameters)是URL中?后面的參數(shù)。

from fastapi import Query
from typing import Optional, List
@app.get("/search")
async def search_items(
q: str = Query(..., min_length=1, max_length=50, description="搜索關(guān)鍵詞"),
page: int = Query(1, ge=1, description="頁碼"),
size: int = Query(10, ge=1, le=100, description="每頁數(shù)量"),
tags: Optional[List[str]] = Query(None, description="標(biāo)簽列表")
):
"""
搜索商品
- q: 搜索關(guān)鍵詞(必填)
- page: 頁碼(默認(rèn) 1)
- size: 每頁數(shù)量(默認(rèn) 10,最大 100)
- tags: 標(biāo)簽列表(可選)
"""
return{
"query": q,
"page": page,
"size": size,
"tags": tags or []
}

示例請求:

GET /search?q=FastAPI&page=1&size=20&tags=python&tags=web

3.3.3 請求體

使用 Pydantic 模型定義請求體。

from pydantic import BaseModel, Field
from typing import Optional
class Item(BaseModel):
"""商品模型"""
name: str = Field(..., min_length=1, max_length=100, description="商品名稱")
description: Optional[str] = Field(None, max_length=500, description="商品描述")
price: float = Field(..., gt=0, description="商品價(jià)格")
tax: Optional[float] = Field(None, ge=0, description="稅費(fèi)")
@app.post("/items")
async def create_item(item: Item):
"""
創(chuàng)建商品
"""
item_dict = item.model_dump()
if item.tax:
price_with_tax = item.price + item.tax
item_dict.update({"price_with_tax": price_with_tax})
return item_dict

示例請求:

POST /items
Content-Type: application/json
{
"name": "FastAPI 教程",
"description": "一本關(guān)于 FastAPI 的書",
"price": 99.99,
"tax": 10.0
}

Pydantic 模型的優(yōu)勢:

●自動(dòng)數(shù)據(jù)驗(yàn)證

●自動(dòng)生成 JSON Schema

●自動(dòng)生成 API 文檔

●類型提示和編輯器支持

3.3.4 Form表單數(shù)據(jù)

處理 HTML 表單提交的數(shù)據(jù)。

from fastapi import Form
@app.post("/login")
async def login(
username: str = Form(..., min_length=3, max_length=50),
password: str = Form(..., min_length=6)
):
"""
用戶登錄
"""
return {"username": username, "message": "登錄成功"}

示例請求:

POST /login
Content-Type: application/x-www-form-urlencoded
username=admin&password=123456

3.3.5 文件上傳

FastAPI 支持單文件和多文件上傳。

from fastapi import File, UploadFile
from typing import List
import shutil
@app.post("/upload")
async def upload_file(file: UploadFile = File(...)):
"""
單文件上傳
"""
# 保存文件
file_path = f"./uploads/{file.filename}"
with open(file_path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
return{
"filename": file.filename,
"content_type": file.content_type,
"size": file.size
}
@app.post("/upload-multiple")
async def upload_multiple_files(files: List[UploadFile] = File(...)):
"""
多文件上傳
"""
uploaded_files = []
for file in files:
file_path = f"./uploads/{file.filename}"
with open(file_path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
uploaded_files.append({
"filename": file.filename,
"size": file.size
})
return {"files": uploaded_files}

??轉(zhuǎn)崗軟件測試/野路子技能提升

??想了解更多漲薪技能提升方法

??可以到我的個(gè)人號:atstudy-js

即可加入領(lǐng)取 ??????

轉(zhuǎn)行、入門、提升、需要的各種干貨資料

內(nèi)含AI測試、 車載測試、AI大模型開發(fā)、BI數(shù)據(jù)分析、銀行測試、游戲測試、AIGC

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
這兩個(gè)人的出現(xiàn),讓印度趕超中國永遠(yuǎn)都只能是個(gè)“笑話”

這兩個(gè)人的出現(xiàn),讓印度趕超中國永遠(yuǎn)都只能是個(gè)“笑話”

混沌錄
2026-04-17 21:08:12
碾壓珠穆朗瑪峰!火星上的山為何能長到2萬米?重力不是唯一原因

碾壓珠穆朗瑪峰!火星上的山為何能長到2萬米?重力不是唯一原因

半解智士
2026-04-18 18:44:07
突發(fā)!伊朗對印度油輪開火:為何伊朗突然打擊印度,真實(shí)原因曝光

突發(fā)!伊朗對印度油輪開火:為何伊朗突然打擊印度,真實(shí)原因曝光

郭蛹包工頭
2026-04-19 00:05:33
薩里回那不勒斯:一場2-0如何殺死爭冠懸念

薩里回那不勒斯:一場2-0如何殺死爭冠懸念

賽場名場面
2026-04-19 09:57:37
馬斯克解釋為何找英特爾合作:臺(tái)積電根本產(chǎn)不出我需要的芯片數(shù)量

馬斯克解釋為何找英特爾合作:臺(tái)積電根本產(chǎn)不出我需要的芯片數(shù)量

Thurman在昆明
2026-04-19 05:16:30
十萬人不敢打兩千人,傷亡對比巨大的長津湖戰(zhàn)役中,到底誰贏了?

十萬人不敢打兩千人,傷亡對比巨大的長津湖戰(zhàn)役中,到底誰贏了?

歷史回憶室
2026-02-26 00:33:12
風(fēng)水輪流轉(zhuǎn)!兩面三刀、賣友上位的他 終于付出代價(jià),趙麗穎沒說錯(cuò)

風(fēng)水輪流轉(zhuǎn)!兩面三刀、賣友上位的他 終于付出代價(jià),趙麗穎沒說錯(cuò)

陳意小可愛
2026-04-18 19:34:37
被豆包害慘了的大學(xué)生們!網(wǎng)友:豆包就是愚蠢且勤勞的老實(shí)人

被豆包害慘了的大學(xué)生們!網(wǎng)友:豆包就是愚蠢且勤勞的老實(shí)人

夜深愛雜談
2025-12-02 20:51:10
萬達(dá)38億債局背后:林寧真實(shí)家底曝光,難怪王思聰穩(wěn)如泰山

萬達(dá)38億債局背后:林寧真實(shí)家底曝光,難怪王思聰穩(wěn)如泰山

吃青菜長高
2026-04-18 08:01:53
申花3:1鐵人,黃健翔犀利點(diǎn)評:外援太絲滑,卻揪出門將最大隱患

申花3:1鐵人,黃健翔犀利點(diǎn)評:外援太絲滑,卻揪出門將最大隱患

晚霧空青
2026-04-19 02:32:45
福原愛官宣三胎孩子出生,母子平安,將會(huì)繼續(xù)為乒乓球做貢獻(xiàn)

福原愛官宣三胎孩子出生,母子平安,將會(huì)繼續(xù)為乒乓球做貢獻(xiàn)

可愛的巴比龍
2026-04-19 11:04:05
好一個(gè)球迷答謝夜!領(lǐng)先19分到輸12分,球迷:求隔指導(dǎo)回醫(yī)院看球

好一個(gè)球迷答謝夜!領(lǐng)先19分到輸12分,球迷:求隔指導(dǎo)回醫(yī)院看球

弄月公子
2026-04-19 11:00:09
越領(lǐng)導(dǎo)坐了12個(gè)小時(shí)高鐵回國,直言落后太多,這是最狠的一次拒絕

越領(lǐng)導(dǎo)坐了12個(gè)小時(shí)高鐵回國,直言落后太多,這是最狠的一次拒絕

田園小歸
2026-04-19 08:40:30
趙心童10-7,亨德利點(diǎn)評:可能只發(fā)揮50%

趙心童10-7,亨德利點(diǎn)評:可能只發(fā)揮50%

陳錈愛體育
2026-04-19 08:20:22
破案!外教帶隊(duì)逆轉(zhuǎn),杜鋒一回歸卻遭爆冷原因找到,粵迷說出實(shí)話

破案!外教帶隊(duì)逆轉(zhuǎn),杜鋒一回歸卻遭爆冷原因找到,粵迷說出實(shí)話

后仰大風(fēng)車
2026-04-19 08:15:07
“我女兒敢這樣,腿給砸斷”,寶媽曬2個(gè)女兒出門,裝束讓人怒了

“我女兒敢這樣,腿給砸斷”,寶媽曬2個(gè)女兒出門,裝束讓人怒了

蝴蝶花雨話教育
2026-04-10 13:01:09
從幕后到臺(tái)前:首任低空司司長亮相

從幕后到臺(tái)前:首任低空司司長亮相

民用無人機(jī)
2026-04-18 18:56:52
現(xiàn)場開炮!波蘭議員當(dāng)眾嘲諷以色列:看好了,你們國旗長這樣才對

現(xiàn)場開炮!波蘭議員當(dāng)眾嘲諷以色列:看好了,你們國旗長這樣才對

諦聽骨語本尊
2026-04-15 18:13:09
徐冬冬尹子維官宣生娃:不辦婚禮不曬娃,這屆明星終于活明白了

徐冬冬尹子維官宣生娃:不辦婚禮不曬娃,這屆明星終于活明白了

小貓娛樂叭叭
2026-04-18 17:34:18
雷軍直播勸:“大老板別買小米汽車”,盤點(diǎn)雷軍十大“槽點(diǎn)”

雷軍直播勸:“大老板別買小米汽車”,盤點(diǎn)雷軍十大“槽點(diǎn)”

歪歌社團(tuán)
2026-04-18 23:56:33
2026-04-19 11:31:00
51Testing軟件測試網(wǎng) incentive-icons
51Testing軟件測試網(wǎng)
中國軟件測試人的精神家園
1558文章數(shù) 13260關(guān)注度
往期回顧 全部

科技要聞

50分26秒!榮耀獲得人形機(jī)器人半馬冠軍

頭條要聞

牛彈琴:伊朗遭到特朗普"羞辱"被激怒 結(jié)果印度遭了殃

頭條要聞

牛彈琴:伊朗遭到特朗普"羞辱"被激怒 結(jié)果印度遭了殃

體育要聞

掘金擒狼開門紅:五花肉與小辣椒

娛樂要聞

劉德華回應(yīng)潘宏彬去世,拒談喪禮細(xì)節(jié)

財(cái)經(jīng)要聞

華誼兄弟,8年虧光85億

汽車要聞

29分鐘大定破萬 極氪8X為什么這么多人買?

態(tài)度原創(chuàng)

教育
時(shí)尚
本地
游戲
健康

教育要聞

小升初,求四邊形面積,難倒不少尖子生

選對發(fā)型,真的能少走很多變美彎路

本地新聞

12噸巧克力有難,全網(wǎng)化身超級偵探添亂

《識(shí)質(zhì)存在》3大主機(jī)版分辨率幀數(shù)表現(xiàn)到底如何?

干細(xì)胞抗衰4大誤區(qū),90%的人都中招

無障礙瀏覽 進(jìn)入關(guān)懷版