继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

德玛西亚99
关注TA
已关注
手记 443
粉丝 92
获赞 559
怎样给您的 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 应用编写测试,确保它们能够按预期工作。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP