-
guest说:
实例讲解一个经典的全目录结构的FastAPI项目代码,着重讲解下该项目的目录结构
该项目的目录结构如下:
├── app # 应用目录 ├── api # API目录 ├── v1 # API版本目录 ├── __init__.py # API初始化文件 ├── endpoints # API终端目录 ├── __init__.py # 终端初始化文件 ├── user.py # 用户终端文件 ├── routers.py # API路由文件 ├── __init__.py # API初始化文件 ├── core # 核心目录 ├── __init__.py # 核心初始化文件 ├── config.py # 配置文件 ├── db.py # 数据库文件 ├── utils.py # 工具文件 ├── main.py # 主文件 ├── models.py # 模型文件 ├── tests # 测试目录 ├── conftest.py # 测试配置文件 ├── test_endpoints_user.py # 测试用户终端文件 ├── .gitignore # git忽略文件 ├── docker-compose.yml # docker配置文件 ├── dockerfile # docker文件 ├── requirements.txt # 项目依赖文件 ├── run.py # 运行文件
- app目录:该目录下是项目的核心代码文件,包括API、核心、模型、主文件等,是项目运行的核心部分
- api目录:该目录下存放着项目的API代码,其中包含各个API版本的代码,以及API的路由文件
- core目录:该目录下存放着项目的核心文件,其中包含配置文件、数据库文件、工具文件等
- tests目录:该目录下存放着项目的单元测试文件,其中包含测试配置文件以及各个API版本的测试文件
- .gitignore文件:该文件用于指定git忽略的文件,以便更好地管理项目代码
- docker-compose.yml文件:该文件用于定义并描述Docker编排应用的多容器部署
- dockerfile文件:该文件用于定义Docker镜像的构建步骤
- requirement.txt文件:该文件用于记录项目所需要的所有依赖
- run.py文件:该文件用于启动项目,即运行该文件可以启动FastAPI项目
-
guest说:
我要做一个纯后端的API接口项目,用到的框架是FastAPI,使用的模块有sqlalchemy、pydantic、logging,请帮我列出合理的目录结构,并给出目录结构的注释,谢谢
。
├── app.py # 入口文件,包含FastAPI的配置、初始化等 ├── config # 配置文件,包含数据库连接参数、日志文件路径等 ├── core # 核心模块,包含模型、数据库操作类、第三方模块的封装等文件 ├── main # 主文件,包含API接口文件 ├── tests # 测试文件,包含API接口的测试用例 ├── utils # 工具模块,包含常用功能函数等 └── logs # 日志文件
-
guest说:
我要做一个纯后端的API接口项目,用于学生信息的增删改查,用到的框架是FastAPI,使用的模块有sqlalchemy、pydantic、logging,请帮我列出合理的目录结构及文件,并给出目录和文件的注释,谢谢
!
该项目的目录结构及文件如下:
├─ app # 存放业务逻辑代码 │ ├─ models # 数据库模型定义 │ │ ├─ student.py # 学生表定义 │ │ └─ ... # 其他数据库模型定义 │ ├─ views # 视图函数 │ │ ├─ student.py # 学生信息相关视图函数 │ │ └─ ... # 其他相关视图函数 │ ├─ schemas # 模型验证 │ │ ├─ student.py # 学生信息数据结构验证 │ │ └─ ... # 其他模型验证 │ └─ __init__.py # 初始化模块 ├─ config # 配置文件 │ ├─ app.py # 项目配置 │ └─ db.py # 数据库配置 ├─ tests # 测试文件 │ ├─ test_student.py # 学生信息接口测试 │ └─ ... # 其他接口测试 ├─ main.py # 入口文件 └─ requirements.txt # 依赖文件
-
guest说:
FastAPI单元测试讲解实例,以学生管理为例
目录
1、准备工作
在开始编写测试代码之前,我们需要准备一些必要的工作:
-
安装
pytest
要进行FastAPI的单元测试,我们需要安装
pytest
,它是一款功能强大的Python测试框架,支持测试用例的编写、执行以及结果的收集,所以我们需要先安装它:$ pip install pytest
-
安装
uvicorn
uvicorn
是一款异步非阻塞的Python Web服务器,它支持ASGI协议,所以我们可以使用它来启动我们的FastAPI应用,并用于进行测试:$ pip install uvicorn
-
编写FastAPI应用
为了方便讲解,我们编写一个简单的学生管理的FastAPI应用:
# main.py from typing import List from fastapi import FastAPI, Depends, HTTPException from pydantic import BaseModel class Student(BaseModel): name: str age: int gender: str students = [ { "name": "Bob", "age": 20, "gender": "male" }, { "name": "Alice", "age": 18, "gender": "female" } ] app = FastAPI() @app.get("/students/") async def get_students(): return students @app.post("/students/") async def create_student(student: Student): students.append(student.dict()) return student @app.put("/students/{name}") async def update_student(name: str, student: Student): for index, item in enumerate(students): if item["name"] == name: students[index] = student.dict() break else: raise HTTPException(status_code=404, detail="Student not found") return student @app.delete("/students/{name}") async def delete_student(name: str): for index, item in enumerate(students): if item["name"] == name: del students[index] break else: raise HTTPException(status_code=404, detail="Student not found") return {"msg": "delete success"}
2、编写测试代码
2.1 测试获取学生列表
首先,我们来测试获取学生列表的接口,编写测试用例:
# test_main.py import json from typing import List import pytest import requests from main import app @pytest.fixture(scope="module") def test_client(): test_client = app.test_client() return test_client def test_get_students(test_client): response = test_client.get("/students/") data = json.loads(response.data) assert len(data) == 2 students = [ { "name": "Bob", "age": 20, "gender": "male" }, { "name": "Alice", "age": 18, "gender": "female" } ] assert data == students
测试用例:
- 先通过
pytest.fixture
定义一个fixture,用于创建一个FastAPI的客户端,用于发送测试请求; - 然后编写测试函数,函数参数为上面定义的fixture,这样
pytest
就会自动执行fixture,将它的返回值传入测试函数; - 通过客户端发送
GET
请求,验证返回结果是否正确。
2.2 测试创建学生
接下来,我们来测试创建学生的接口,编写测试用例:
# test_main.py import json import pytest from main import app @pytest.fixture(scope="module") def test_client(): test_client = app.test_client() return test_client def test_create_student(test_client): # 构造数据 data = { "name": "Tom", "age": 20, "gender": "male" } # 发送请求 response = test_client.post("/students/", json=data) # 验证结果 assert response.status_code == 200 data = json.loads(response.data) assert data == data
测试用例:
- 通过
pytest.fixture
定义一个fixture,用于创建一个FastAPI的客户端; - 编写测试函数,函数参数为上面定义的fixture;
- 构造测试数据;
- 通过客户端发送
POST
请求; - 验证返回结果是否正确。
2.3 测试更新学生信息
接下来,我们来测试更新学生信息的接口,编写测试用例:
# test_main.py import json import pytest from main import app @pytest.fixture(scope="module") def test_client(): test_client = app.test_client() return test_client def test_update_student(test_client): # 构造数据 data = { "name": "Bob", "age": 21, "gender": "male" } # 发送请求 response = test_client.put("/students/Bob", json=data) # 验证结果 assert response.status_code == 200 data = json.loads(response.data) assert data == data
测试用例:
- 通过
pytest.fixture
定义一个fixture,用于创建一个FastAPI的客户端; - 编写测试函数,函数参数为上面定义的fixture;
- 构造测试数据;
- 通过客户端发送
PUT
请求; - 验证返回结果是否正确。
2.4 测试删除学生
最后,我们来测试删除学生的接口,编写测试用例:
# test_main.py import json import pytest from main import app @pytest.fixture(scope="module") def test_client(): test_client = app.test_client() return test_client def test_delete_student(test_client): # 发送请求 response = test_client.delete("/students/Bob") # 验证结果 assert response.status_code == 200 data = json.loads(response.data) assert data == {"msg": "delete success"}
测试用例:
- 通过
pytest.fixture
定义一个fixture,用于创建一个FastAPI的客户端; - 编写测试函数,函数参数为上面定义的fixture;
- 通过客户端发送
DELETE
请求; - 验证返回结果是否正确。
3、编写测试执行程序
-
-
guest说:
举例讲解下FastAPI的单元测试,以学生信息管理为例,举例讲解下原理和使用方法
- 单元测试的原理:
单元测试是指分离的测试,它的目的是检查每个独立的单元是否正确工作,单元测试可以帮助检测单元之间的相互依赖,从而确保程序的稳定性和正确性。
- 使用FastAPI进行单元测试:
(1)安装pytest,并在项目根目录创建 tests/ 目录;
(2)在 tests/ 目录下创建一个 test_students.py 文件,用来编写学生信息管理的测试用例;
(3)使用 pytest 在 tests/ 目录下执行 test_students.py 文件,检查测试用例是否正确;
(4)如果测试用例通过,则代表学生信息管理的功能是正常工作的。