工程化 / 闯关模式

后端测试和工程化

学习 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

运行:

pytest

4. 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 .
pytest

8. CI/CD 是什么

CI:每次提交代码,自动检查。

CD:检查通过后,自动部署。

初学阶段先理解 CI:

提交代码
  ↓
安装依赖
  ↓
跑 ruff
  ↓
跑 pytest
  ↓
通过才允许合并

不要一开始就追求复杂流水线。

9. 版本、迁移和发布

一次后端发布不只是传代码。

要想:

  • 依赖是否变了
  • 环境变量是否新增
  • 数据库迁移是否执行
  • 旧接口是否兼容
  • 回滚方案是什么

发布前检查:

alembic upgrade head
pytest
ruff check .
docker compose up -d --build
curl /health

10. 工程化检查清单

[ ] 依赖写在 requirements.txt 或 pyproject.toml
[ ] 配置来自 .env
[ ] 代码有清晰目录
[ ] 核心函数有单元测试
[ ] 关键接口有接口测试
[ ] 测试不连接生产库
[ ] 外部服务测试时用 mock
[ ] 提交前能跑 ruff/pytest
[ ] 数据库变化有 Alembic 迁移
[ ] 发布前有 /health 验证

总结表

名词大白话
工程化让项目可重复、可检查、可交接
单元测试测一个小函数
接口测试测一个 API
集成测试测多个组件一起工作
Mock用假的外部服务代替真的
CI提交后自动检查
CD自动部署
回归测试确认旧功能没坏

下一篇建议:回到你的真实项目,挑一个小模块按“API + Schema + Service + Repository + 测试”完整练一遍。