📅  最后修改于: 2023-12-03 15:08:45.048000             🧑  作者: Mango
在使用 FastAPI 编写 Web 应用程序时,您需要对其执行自动化测试。 Pytest 是最流行的 Python 测试框架之一,可以方便地与 FastAPI 集成。 在自动化测试期间,您可以使用 FastAPI ApiClient 模块向应用程序发送 HTTP 请求,以测试其各个端点。 本指南将介绍如何在 Pytest 中使用 FastAPI ApiClient 模块。
在您可以开始使用 Pytest 和 FastAPI ApiClient 进行自动化测试之前,您需要安装这些库。 您可以在 Python 中使用 pip 命令执行此操作。
pip install fastapi
pip install pytest
在开始使用 FastAPI ApiClient 进行自动化测试之前,您需要创建一个 FastAPI 应用程序并测试文件。 您可以使用以下示例 FastAPI 应用程序和测试文件。
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
# test_main.py
from fastapi.testclient import TestClient
from .main import app
client = TestClient(app)
def test_read_root():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello World"}
在编写 FastAPI 自动化测试时,您需要使用 FastAPI ApiClient 模块。 您可以使用 TestClient 类中提供的方法发送 HTTP 请求,以测试 FastAPI 应用程序中定义的各个端点。 可以在 pytest 测试文件中执行此操作。 其中一个示例如下:
# test_main.py
from fastapi.testclient import TestClient
from .main import app
client = TestClient(app)
def test_read_root():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello World"}
def test_read_invalid_route():
response = client.get("/invalid_route")
assert response.status_code == 404
assert response.json() == {"detail": "Not Found"}
def test_create_item():
response = client.post(
"/items/",
json={"name": "Item Name", "description": "Item description"},
)
assert response.status_code == 200
assert response.json() == {
"name": "Item Name",
"description": "Item description",
}
在上面的测试文件中,我们将三个不同的测试用例添加到 Pytest 中。 在这些测试用例中,我们使用 FastAPI ApiClient 模块向 "/ ","/ invalid_route" 和"/ items /" 端点发送 GET 和 POST 请求。 依据不同情况,相应的请求结果将被检查。如果结果与预期结果不同,则将引发 AssertionError。
一旦您编写了 FastAPI 自动化测试,您可以使用 Pytest 库运行这些测试。 使用以下命令在命令中运行自动化测试:
pytest
这个命令将运行当前目录中所有以"_测试.py" 结尾的 Pytest 测试文件。 如果您要在单个文件中运行测试,可以使用以下命令:
pytest test_main.py
使用 Pytest 和 FastAPI ApiClient,可以轻松地编写 FastAPI 自动化测试。 这些测试将确保您的应用程序在不同的应用程序端点上能够正常工作,并且可以让您及时了解应用程序中的错误和问题。