12.3 单元测试:业务逻辑测试
FastAPI 入门教程:从零学习构建API并掌握业务逻辑单元测试
本教程面向Python初学者,提供详细的FastAPI入门指南,从基础概念到动手实践,包含生活化类比和简单示例,并特别讲解如何对业务逻辑进行单元测试,帮助您快速建立Web开发信心。
FastAPI 入门教程:为Python初学者打造,轻松学习Web开发与单元测试
欢迎!无论您是刚学完Python基础语法的新手,还是对Web开发感到好奇,本教程都将带您一步一步掌握FastAPI,并学会如何测试核心业务逻辑。我们会用生活化的例子来解释概念,避免复杂的理论,确保您在每一步都能获得“成功时刻”。
第一部分:FastAPI是什么?为什么选择它?
生活比喻: 想象FastAPI就像一家高效的快餐店。您点餐(发送请求),它快速准备食物(处理业务逻辑),然后立即给您(返回响应),而这一切都基于清晰的菜单(API文档)。相比其他Web框架,FastAPI速度极快、自动生成文档,非常适合初学者快速上手。
目标: 学完这一部分,您将理解FastAPI的基本优势。
第二部分:环境设置与第一个“Hello World”应用
安装FastAPI
首先,确保您安装了Python(建议版本3.7+)。然后,在终端或命令行中运行:
pip install fastapi uvicorn
fastapi:核心框架。uvicorn:服务器,用来运行您的应用。
成功时刻: 如果安装没有错误,您已经迈出了第一步!
创建并运行第一个应用
新建一个Python文件,比如 main.py,写入以下代码:
from fastapi import FastAPI
app = FastAPI() # 创建一个FastAPI应用实例
@app.get("/") # 定义根路径的GET请求路由
def read_root():
return {"message": "Hello, World!"} # 返回一个JSON响应
现在,在终端运行:
uvicorn main:app --reload
打开浏览器,访问 http://127.0.0.1:8000,您会看到 {"message": "Hello, World!"}!🎉 这是您的第一个API端点工作了。
解释: @app.get("/") 类似设置一个菜单项,当有人访问根路径时,执行 read_root 函数并返回结果。
第三部分:深入理解:构建一个简单的待办事项API
让我们扩展应用,添加业务逻辑。创建一个简单的待办事项列表。
添加更多端点
更新 main.py:
from fastapi import FastAPI
from pydantic import BaseModel # 用于数据验证
from typing import List # 用于类型提示
app = FastAPI()
# 定义待办事项的数据模型
class TodoItem(BaseModel):
id: int
task: str
completed: bool = False # 默认未完成
# 模拟数据库:一个内存中的列表
todo_list = []
@app.get("/todos/", response_model=List[TodoItem]) # 获取所有待办事项
def get_todos():
return todo_list
@app.post("/todos/") # 添加新待办事项
def add_todo(todo: TodoItem):
todo_list.append(todo)
return {"message": "Todo added successfully!"}
运行服务器,用工具如 Postman 或浏览器测试 POST 请求到 http://127.0.0.1:8000/todos/ 并发送JSON,例如 {"id": 1, "task": "学习FastAPI"}。然后访问 GET 同一URL查看列表。您会看到数据被添加和检索。
生活比喻: 这就像在记事本上写待办事项并查看它。FastAPI自动处理JSON转换和验证。
第四部分:单元测试:为什么和如何测试业务逻辑?
现在,您已经构建了API,但如何确保它一直工作正确?这就是单元测试的作用。
什么是单元测试?
生活比喻: 单元测试就像测试一个食谱的每个步骤。您单独检查切菜是否正确(业务逻辑),而不是等整个菜做完再尝(端到端测试)。这样可以快速发现问题。
设置测试环境
在项目中,创建一个 test_main.py 文件。安装 pytest:
pip install pytest
测试业务逻辑函数
首先,将业务逻辑移到单独函数以便测试。更新 main.py:
# 在文件顶部或一个单独模块中
def add_todo_logic(todo: TodoItem, todo_list: List[TodoItem]) -> str:
"""业务逻辑:添加待办事项到列表"""
if todo.id in [item.id for item in todo_list]:
return "Error: ID already exists"
todo_list.append(todo)
return "Success"
# 在FastAPI端点中使用
@app.post("/todos/")
def add_todo(todo: TodoItem):
result = add_todo_logic(todo, todo_list)
if result == "Success":
return {"message": "Todo added successfully!"}
else:
return {"error": result}
现在,在 test_main.py 中编写单元测试:
import pytest
from main import add_todo_logic, TodoItem
from typing import List
# 测试添加待办事项的逻辑
def test_add_todo_logic():
# 准备数据
todo_list: List[TodoItem] = []
todo1 = TodoItem(id=1, task="Test task")
todo2 = TodoItem(id=2, task="Another task")
# 测试成功添加
result = add_todo_logic(todo1, todo_list)
assert result == "Success"
assert len(todo_list) == 1
assert todo_list[0].id == 1
# 测试重复ID错误
result = add_todo_logic(todo1, todo_list) # 同样ID
assert result == "Error: ID already exists"
assert len(todo_list) == 1 # 列表不应改变
运行测试:
pytest test_main.py -v
如果看到“passed”,恭喜!您刚刚成功测试了业务逻辑。这是您的“成功时刻”——确保代码可靠性的关键一步。
测试API端点
对于端点,FastAPI支持测试客户端。添加一个测试:
from fastapi.testclient import TestClient
from main import app # 导入您的FastAPI应用
client = TestClient(app)
def test_get_todos():
response = client.get("/todos/")
assert response.status_code == 200
assert response.json() == [] # 初始应为空列表
def test_post_todo():
response = client.post("/todos/", json={"id": 1, "task": "Learn testing"})
assert response.status_code == 200
assert response.json()["message"] == "Todo added successfully!"
再次运行 pytest,看到所有测试通过,您就已经掌握了基础的API测试。
第五部分:总结与下一步
您已经学会了:
- 安装和运行FastAPI,创建了第一个Hello World应用。
- 构建了简单的待办事项API,理解了路由和数据模型。
- 引入了单元测试,特别针对业务逻辑,确保代码质量。
信心建立时刻: 回顾一下,您从零开始,现在可以构建API并测试它们了!对于初学者来说,这已经是很棒的成就。
下一步建议: 探索FastAPI的更多功能,如依赖注入、身份验证,或学习数据库集成。始终记得编写测试来维护代码。
保持实践,祝您编程愉快!如有问题,随时查阅FastAPI官方文档。