|
@ -2,12 +2,13 @@ |
|
|
自定义API测试 |
|
|
自定义API测试 |
|
|
这是一个示例测试文件,展示如何在FastAPI项目中编写测试 |
|
|
这是一个示例测试文件,展示如何在FastAPI项目中编写测试 |
|
|
""" |
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
from typing import Optional |
|
|
|
|
|
|
|
|
import pytest |
|
|
import pytest |
|
|
from fastapi import FastAPI |
|
|
from fastapi import FastAPI |
|
|
from fastapi.testclient import TestClient |
|
|
from fastapi.testclient import TestClient |
|
|
from pydantic import BaseModel |
|
|
from pydantic import BaseModel |
|
|
from typing import Optional |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 创建一个简单的FastAPI应用用于测试 |
|
|
# 创建一个简单的FastAPI应用用于测试 |
|
|
app = FastAPI() |
|
|
app = FastAPI() |
|
@ -53,32 +54,28 @@ client = TestClient(app) |
|
|
# 测试用例 |
|
|
# 测试用例 |
|
|
class TestCustomAPI: |
|
|
class TestCustomAPI: |
|
|
"""自定义API测试类""" |
|
|
"""自定义API测试类""" |
|
|
|
|
|
|
|
|
def test_read_root(self): |
|
|
def test_read_root(self): |
|
|
"""测试根路径""" |
|
|
"""测试根路径""" |
|
|
response = client.get("/") |
|
|
response = client.get("/") |
|
|
assert response.status_code == 200 |
|
|
assert response.status_code == 200 |
|
|
assert response.json() == {"message": "Hello Custom API"} |
|
|
assert response.json() == {"message": "Hello Custom API"} |
|
|
|
|
|
|
|
|
def test_read_item_with_params(self): |
|
|
def test_read_item_with_params(self): |
|
|
"""测试带参数的商品查询""" |
|
|
"""测试带参数的商品查询""" |
|
|
response = client.get("/items/5?q=somequery") |
|
|
response = client.get("/items/5?q=somequery") |
|
|
assert response.status_code == 200 |
|
|
assert response.status_code == 200 |
|
|
assert response.json() == {"item_id": 5, "q": "somequery"} |
|
|
assert response.json() == {"item_id": 5, "q": "somequery"} |
|
|
|
|
|
|
|
|
def test_read_item_without_params(self): |
|
|
def test_read_item_without_params(self): |
|
|
"""测试不带查询参数的商品查询""" |
|
|
"""测试不带查询参数的商品查询""" |
|
|
response = client.get("/items/10") |
|
|
response = client.get("/items/10") |
|
|
assert response.status_code == 200 |
|
|
assert response.status_code == 200 |
|
|
assert response.json() == {"item_id": 10, "q": None} |
|
|
assert response.json() == {"item_id": 10, "q": None} |
|
|
|
|
|
|
|
|
def test_create_item(self): |
|
|
def test_create_item(self): |
|
|
"""测试创建商品""" |
|
|
"""测试创建商品""" |
|
|
item_data = { |
|
|
item_data = {"name": "Test Item", "price": 99.99, "is_offer": True} |
|
|
"name": "Test Item", |
|
|
|
|
|
"price": 99.99, |
|
|
|
|
|
"is_offer": True |
|
|
|
|
|
} |
|
|
|
|
|
response = client.post("/items/", json=item_data) |
|
|
response = client.post("/items/", json=item_data) |
|
|
assert response.status_code == 200 |
|
|
assert response.status_code == 200 |
|
|
response_data = response.json() |
|
|
response_data = response.json() |
|
@ -86,35 +83,38 @@ class TestCustomAPI: |
|
|
assert response_data["item"]["name"] == "Test Item" |
|
|
assert response_data["item"]["name"] == "Test Item" |
|
|
assert response_data["item"]["price"] == 99.99 |
|
|
assert response_data["item"]["price"] == 99.99 |
|
|
assert response_data["item"]["is_offer"] is True |
|
|
assert response_data["item"]["is_offer"] is True |
|
|
|
|
|
|
|
|
def test_get_user(self): |
|
|
def test_get_user(self): |
|
|
"""测试获取用户信息""" |
|
|
"""测试获取用户信息""" |
|
|
response = client.get("/users/123") |
|
|
response = client.get("/users/123") |
|
|
assert response.status_code == 200 |
|
|
assert response.status_code == 200 |
|
|
assert response.json() == {"user_id": 123, "username": "user_123"} |
|
|
assert response.json() == {"user_id": 123, "username": "user_123"} |
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("item_id,expected_id", [ |
|
|
@pytest.mark.parametrize( |
|
|
(1, 1), |
|
|
"item_id,expected_id", |
|
|
(42, 42), |
|
|
[ |
|
|
(999, 999), |
|
|
(1, 1), |
|
|
]) |
|
|
(42, 42), |
|
|
|
|
|
(999, 999), |
|
|
|
|
|
], |
|
|
|
|
|
) |
|
|
def test_read_item_parametrized(self, item_id, expected_id): |
|
|
def test_read_item_parametrized(self, item_id, expected_id): |
|
|
"""参数化测试:测试不同的商品ID""" |
|
|
"""参数化测试:测试不同的商品ID""" |
|
|
response = client.get(f"/items/{item_id}") |
|
|
response = client.get(f"/items/{item_id}") |
|
|
assert response.status_code == 200 |
|
|
assert response.status_code == 200 |
|
|
assert response.json()["item_id"] == expected_id |
|
|
assert response.json()["item_id"] == expected_id |
|
|
|
|
|
|
|
|
def test_invalid_item_id(self): |
|
|
def test_invalid_item_id(self): |
|
|
"""测试无效的商品ID""" |
|
|
"""测试无效的商品ID""" |
|
|
response = client.get("/items/not_a_number") |
|
|
response = client.get("/items/not_a_number") |
|
|
assert response.status_code == 422 # 验证错误 |
|
|
assert response.status_code == 422 # 验证错误 |
|
|
|
|
|
|
|
|
def test_create_item_invalid_data(self): |
|
|
def test_create_item_invalid_data(self): |
|
|
"""测试创建商品时的无效数据""" |
|
|
"""测试创建商品时的无效数据""" |
|
|
invalid_data = { |
|
|
invalid_data = { |
|
|
"name": "Test Item", |
|
|
"name": "Test Item", |
|
|
# 缺少必需的price字段 |
|
|
# 缺少必需的price字段 |
|
|
"is_offer": True |
|
|
"is_offer": True, |
|
|
} |
|
|
} |
|
|
response = client.post("/items/", json=invalid_data) |
|
|
response = client.post("/items/", json=invalid_data) |
|
|
assert response.status_code == 422 # 验证错误 |
|
|
assert response.status_code == 422 # 验证错误 |
|
@ -139,11 +139,7 @@ def test_openapi_schema(): |
|
|
@pytest.fixture |
|
|
@pytest.fixture |
|
|
def sample_item(): |
|
|
def sample_item(): |
|
|
"""测试用的示例商品数据""" |
|
|
"""测试用的示例商品数据""" |
|
|
return { |
|
|
return {"name": "Sample Item", "price": 50.0, "is_offer": False} |
|
|
"name": "Sample Item", |
|
|
|
|
|
"price": 50.0, |
|
|
|
|
|
"is_offer": False |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_with_fixture(sample_item): |
|
|
def test_with_fixture(sample_item): |
|
|