怎样给您的 FastAPI 应用写测试用例
测试是软件开发中的一个关键方面,确保应用程序能够按预期运行并保持良好的可维护性。FastAPI 是一个现代 web 框架,支持使用流行的测试库执行全面测试。在本文中,我们将探讨如何为 FastAPI 应用编写单元测试和集成测试,并附带代码示例。
1. 搭建你的开发环境首先,你需要安装一些必要的测试工具,比如使用pytest
来进行测试,用httpx
来发送HTTP请求,并且用fastapi.testclient
来测试FastAPI应用。
pip install pytest httpx
2. 创建项目结构:
这里有一个基本的结构供你的FastAPI项目使用(FastAPI是一个现代的Web框架):
my_project/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── models.py
│ ├── crud.py
│ ├── schemas.py
│ ├── database.py
│ └── tests/
│ ├── __init__.py
│ ├── test_main.py
│ └── test_crud.py
├── requirements.txt
└── README.md
3. 示例应用
让我们从一个简单的FastAPI应用开始吧。创建一个主应用文件main.py
。
例子:**main.py**
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"foo": {"name": "Foo", "description": "测试项目"}}
@app.get("/items/{item_id}")
async def read_item(item_id: str):
if item_id not in items:
raise HTTPException(status_code=404, detail="找不到项目")
return items[item_id]
@app.post("/items/{item_id}")
async def create_item(item_id: str, item: dict):
if item_id in items:
raise HTTPException(status_code=400, detail="项目已经存在")
items[item_id] = item
return item
4. 编写单元测试用例
单元测试专注于单独测试应用中的各个模块。比如说,你可以单独测试你的 CRUD 函数,而无需启动整个应用。
例子:**test_crud.py**
import pytest
# 假设你已经在 app/crud.py 文件中有 get_item 和 create_item 这两个函数
# 假设这些函数用于测试项目
from app.crud import get_item, create_item
items = {"foo": {"name": "Foo", "description": "一个用于测试的项目"}}
def test_get_item():
item = get_item(items, "foo")
assert item["name"] == "Foo"
assert item["description"] == "一个用于测试的项目"
def test_get_item_not_found():
with pytest.raises(KeyError):
get_item(items, "bar")
def test_create_item():
new_item = {"name": "Bar", "description": "另一个测试项目"}
create_item(items, "bar", new_item)
assert "bar" in items
assert items["bar"] == new_item
def test_create_item_already_exists():
with pytest.raises(ValueError):
create_item(items, "foo", {"name": "Foo", "description": "重复项"})
5. 编写集成测试用例
集成测试确保应用程序的各种组件如预期般协同工作。对于这类应用框架(如 FastAPI),您可以使用 httpx
和 fastapi.testclient
来测试您的端点并检查响应。
例子:test_main.py
from fastapi.testclient import TestClient
from app.main import app
client = TestClient(app)
def test_read_item():
response = client.get("/items/foo")
assert response.status_code == 200
assert response.json() == {"name": "Foo", "description": "测试项目"}
def test_read_item_not_found():
response = client.get("/items/bar")
assert response.status_code == 404
assert response.json() == {"detail": "未找到项目"}
def test_create_item():
new_item = {"name": "Bar", "description": "另一个测试项目"}
response = client.post("/items/bar", json=new_item)
assert response.status_code == 200
assert response.json() == new_item
def test_create_item_already_exists():
new_item = {"name": "Foo", "description": "重复项目"}
response = client.post("/items/foo", json=new_item)
assert response.status_code == 400
assert response.json() == {"detail": "项目已存在"}
6. 运行测试
您可以使用 pytest
运行测试。导航到您的项目目录并运行命令:例如:pytest。
pytest
这会找到并运行所有 test_
开头的测试文件和函数。
测试对于确保应用程序的可靠性和可维护性至关重要。FastAPI 可以和 pytest
和 httpx
结合使用,提供了一个强大的框架来编写单元和集成测试。按照本文中的步骤来做,您可以自信地为 FastAPI 应用编写测试,确保它们能够按预期工作。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦