
上篇说把散落在 routers.py 和 main.py 两处的 request_id 生成逻辑,收进 app/utils.py 统一成一个函数。抽完之后,我的第一个念头不是「终于干净了」,而是「以后谁改坏了它,我怎么知道」。
这正是今天要补的一环:测试。
工程项目里,代码会一直变。每改一处,如果只能靠手动发请求去确认没坏,既累又容易漏。
测试把关键行为写成代码,以后每次跑一遍,自动检查这些行为有没有被改坏。
这里有个容易想歪的地方:测试不是为了证明代码永远没 bug,而是为了证明——某些重要行为仍然成立。
我们没有一上来就去测 Agent,也没测大模型调用,而是先测:
build_request_id()选它是因为它足够稳定:
它只是一个普通 Python 函数,所以最适合当第一个单元测试对象。先拿稳的练手,比一上来调模型容易建立正反馈。
单元测试,就是测一个很小的代码单元。
今天只测这一行导入:
from app.utils import build_request_id不启动服务,不调接口,只验证函数本身的行为。范围越小,出错时越容易定位。
测试文件放在:
tests/test_utils.py内容大概是这样:
from app.utils import build_request_id
def test_build_request_id_reuses_header_value():
request_id = build_request_id("debug-001")
assert request_id == "debug-001"
def test_build_request_id_generates_short_id_when_missing():
request_id = build_request_id()
assert isinstance(request_id, str)
assert len(request_id) == 8两个测试分别验证:
X-Request-ID 时,应该原样返回一个测「有值复用」,一个测「无值生成」,把函数的两条分支都盖住。
pytest 会自动发现:
tests/ 目录test_*.py 或 *_test.pydef test_... 开头所以只要执行:
uv run pytestpytest 就会自动找到测试并运行。预期结果是:
2 passedpytest 里最基础的判断就一句:
assert request_id == "debug-001"意思是:我预期实际结果等于 debug-001。不相等,测试就失败。
不需要额外框架,一个 assert 就把「预期」钉死了。
工程化不只是把代码拆得好看,还要能自动验证关键行为。
项目走到这一步,已经从:
能跑进一步走向:
能验证能跑只是 Demo,能验证才开始像工程。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。