工程化 / 闯关模式
后端测试和工程化
学习 pytest、接口测试、测试数据库、mock、ruff、CI/CD 和发布检查。
一句话:工程化就是让项目不靠手感维护,而是靠规范、测试、检查清单和自动化流程稳定交付。
本篇学完你会什么:知道后端项目为什么要写测试、怎么用 pytest 测接口、工程化要检查哪些东西。
1. 工程化是什么
一个人写练习项目,可以靠记忆。
真实项目不行。你需要:
- 目录规范
- 依赖管理
- 测试
- 代码格式
- 配置管理
- 数据库迁移
- 日志
- 自动检查
大白话:工程化就是让项目可重复、可检查、可交接。

2. 测试分几类
| 类型 | 测什么 | 例子 |
|---|---|---|
| 单元测试 | 一个函数 | 密码校验函数 |
| 接口测试 | 一个 API | 登录接口 |
| 集成测试 | 多个组件配合 | API + 数据库 |
| 回归测试 | 旧功能别坏 | 改代码后跑全部测试 |
初学阶段最实用:接口测试 + 核心函数单元测试。
3. pytest 入门
安装:
pip install pytest文件名:
tests/test_password.py测试函数:
from app.core.security import hash_password, verify_password
def test_verify_password():
hashed = hash_password("123456")
assert verify_password("123456", hashed) is True
assert verify_password("wrong", hashed) is False运行:
pytest4. FastAPI 接口测试
from fastapi.testclient import TestClient
from app.main import app
client = TestClient(app)
def test_health():
response = client.get("/health")
assert response.status_code == 200
assert response.json()["status"] == "ok"登录接口测试:
def test_login_success():
response = client.post("/auth/login", json={
"username": "admin",
"password": "123456",
})
assert response.status_code == 200
assert "access_token" in response.json()5. 测试数据库
不要用生产数据库跑测试。
推荐:
- 单独测试库
- SQLite 临时库
- Docker 起测试 PostgreSQL
测试原则:
每个测试开始前准备数据
每个测试结束后清理数据
测试之间不要互相依赖6. Mock 外部服务
外部服务包括:
- 短信服务
- 邮件服务
- AI 模型 API
- 支付接口
测试时不要真的发短信、扣钱、调用模型。
Mock 的意思是:用假的返回代替真的外部调用。
def test_send_code(monkeypatch):
async def fake_send_sms(phone: str, code: str):
return True
monkeypatch.setattr("app.services.sms.send_sms", fake_send_sms)7. 代码格式和静态检查
常用工具:
| 工具 | 做什么 |
|---|---|
| ruff | 代码风格和常见问题 |
| black | 格式化代码 |
| mypy | 类型检查 |
| pytest | 跑测试 |
可以先从两个开始:
pip install ruff pytest
ruff check .
pytest8. CI/CD 是什么
CI:每次提交代码,自动检查。
CD:检查通过后,自动部署。
初学阶段先理解 CI:
提交代码
↓
安装依赖
↓
跑 ruff
↓
跑 pytest
↓
通过才允许合并不要一开始就追求复杂流水线。
9. 版本、迁移和发布
一次后端发布不只是传代码。
要想:
- 依赖是否变了
- 环境变量是否新增
- 数据库迁移是否执行
- 旧接口是否兼容
- 回滚方案是什么
发布前检查:
alembic upgrade head
pytest
ruff check .
docker compose up -d --build
curl /health10. 工程化检查清单
[ ] 依赖写在 requirements.txt 或 pyproject.toml
[ ] 配置来自 .env
[ ] 代码有清晰目录
[ ] 核心函数有单元测试
[ ] 关键接口有接口测试
[ ] 测试不连接生产库
[ ] 外部服务测试时用 mock
[ ] 提交前能跑 ruff/pytest
[ ] 数据库变化有 Alembic 迁移
[ ] 发布前有 /health 验证总结表
| 名词 | 大白话 |
|---|---|
| 工程化 | 让项目可重复、可检查、可交接 |
| 单元测试 | 测一个小函数 |
| 接口测试 | 测一个 API |
| 集成测试 | 测多个组件一起工作 |
| Mock | 用假的外部服务代替真的 |
| CI | 提交后自动检查 |
| CD | 自动部署 |
| 回归测试 | 确认旧功能没坏 |
下一篇建议:回到你的真实项目,挑一个小模块按“API + Schema + Service + Repository + 测试”完整练一遍。