为了账号安全,请及时绑定邮箱和手机立即绑定

FastAPI的单元测试和集成测试指南

怎样给您的 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),您可以使用 httpxfastapi.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_ 开头的测试文件和函数。

7. 最后

测试对于确保应用程序的可靠性和可维护性至关重要。FastAPI 可以和 pytesthttpx 结合使用,提供了一个强大的框架来编写单元和集成测试。按照本文中的步骤来做,您可以自信地为 FastAPI 应用编写测试,确保它们能够按预期工作。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消