710 字
4 分钟
myapp HTTP 测试与回归注意事项
这篇从 apps/myapp/TESTING.zh-CN.md 和 README 整理。
核心原则
对 myapp.api.gateway.* 这类对外接口,优先用 HTTP 测试,而不是在 WSL 宿主机里直接导入 Frappe 服务层。
原因:
- 更接近前端和移动端真实调用路径
- 能覆盖鉴权、权限、路由、响应包装和站点上下文
- 更容易暴露 devcontainer、站点权限和真实主数据问题
测试环境文件
复制示例:
cp apps/myapp/.env.http-test.example apps/myapp/.env.http-test常用配置:
MYAPP_HTTP_BASE_URL=http://localhost:8080MYAPP_HTTP_USERNAME=AdministratorMYAPP_HTTP_PASSWORD=<password>MYAPP_HTTP_API_KEY=<api-key>MYAPP_HTTP_API_SECRET=<api-secret>MYAPP_HTTP_BEARER_TOKEN=<jwt-token>MYAPP_HTTP_PRINT_RESPONSES=1MYAPP_HTTP_SAVE_RESPONSES=1宿主机执行时:
MYAPP_HTTP_BASE_URL=http://localhost:8080backend 容器内直接执行时:
MYAPP_HTTP_BASE_URL=http://localhost:8000当前约定:宿主机侧保持 http://localhost:8080,不要随意改成 127.0.0.1。
鉴权优先级
HTTP 测试鉴权优先级:
MYAPP_HTTP_BEARER_TOKENMYAPP_HTTP_API_KEY / MYAPP_HTTP_API_SECRETMYAPP_HTTP_USERNAME / MYAPP_HTTP_PASSWORD建议:
- 移动端和前后端分离场景优先用 JWT Bearer Token
- 服务端联调用 API key / secret
- 用户名密码适合兼容历史流程,不建议长期依赖管理员密码
跑 HTTP 测试
销售与采购主链路:
python3 -m unittest apps.myapp.myapp.tests.http.test_gateway_httpv2 商品与销售状态聚合:
python3 -m unittest apps.myapp.myapp.tests.http.test_gateway_v2_http采购快捷链路:
python3 -m unittest apps.myapp.myapp.tests.http.test_purchase_quick_http跑单个测试方法:
python3 -m unittest \ apps.myapp.myapp.tests.http.test_gateway_v2_http.GatewayV2HttpTestCase.test_create_product_and_stock_idempotent_replay性能基线
默认采样:
python3 -m apps.myapp.myapp.tests.http.benchmark_gateway_http指定采样次数:
python3 -m apps.myapp.myapp.tests.http.benchmark_gateway_http --samples 10指定输出:
python3 -m apps.myapp.myapp.tests.http.benchmark_gateway_http \ --output /tmp/myapp-perf-baseline.json适合在这些情况下运行:
- 工作台查询有改动
- 详情聚合接口有改动
- 数据库索引调整后
- 上线前做本机基线复核
- 出现“接口变慢”反馈后做对比
容器内测试必须用 bench Python
如果在 backend 容器内跑单元测试,不要直接用系统 Python。
推荐:
docker exec frappe_docker-backend-1 bash -lc ' cd /home/frappe/frappe-bench && env/bin/python -m unittest apps.myapp.myapp.tests.unit.test_order_service'原因:
- 系统 Python 可能找不到
frappe - 系统 Python 可能缺少 bench 环境依赖
- 容易出现误导性的
ModuleNotFoundError
检查方式:
docker exec frappe_docker-backend-1 bash -lc ' cd /home/frappe/frappe-bench && env/bin/python - << "PY"import importlib.utilprint("frappe:", importlib.util.find_spec("frappe"))print("orjson:", importlib.util.find_spec("orjson"))PY'销售单位换算与库存链路
在 backend 容器中运行:
docker exec frappe_docker-backend-1 bash -lc ' cd /home/frappe/frappe-bench && env/bin/python -m unittest apps.myapp.myapp.tests.integration.test_sales_uom_stock_chain'重点校验:
Sales Order Item.stock_qtyBin.actual_qtyStock Ledger Entry.actual_qty
也就是不只看订单换算,还要看真实库存是否按库存单位准确结算。
常见误判
日志中出现 422 不一定是主链路失败。
如果测试本来就是探测不存在主数据、校验参数或触发业务规则,422 可能是预期结果。
判断时要看响应包络:
{ "ok": false, "status": "error", "code": "VALIDATION_ERROR"}而不是只看 HTTP 状态码。
测试分层建议
myapp/tests/http/ HTTP 冒烟、链路、幂等、并发测试myapp/tests/unit/ 服务层与工具函数单元测试myapp/tests/integration/ 依赖真实站点上下文的服务链路回归推荐顺序:
- 先跑单接口测试
- 再跑幂等和并发测试
- 最后跑链路 smoke test
- 需要全量回归时再跑整份文件
myapp HTTP 测试与回归注意事项
https://r-gc.github.io/posts/notes/frappe/myapp-http-testing-tips/