已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
我维护一条支付清算链路的接口自动化套件(Python 3.11 + pytest 7.4 + httpx,约 1800 条用例),底层连 3 个共享 staging:MySQL 8(同一库)+ Redis 7 + Kafka 3.4。最近为了把回归时长从 52min 压下去,上了 pytest-xdist 8 workers 并行,名义上快 4 倍,实际收益只有 2.3 倍,而且假失败率从 1.7% 涨到 9%——红的用例里,单跑全绿、并行必挂,这是最让我头疼的。
orders 表 status=PENDING,用例 B 在同一 worker 池里同时跑"取消订单",B 用全局 fixture 里那个固定 order_no=ORD_TEST_001 做断言,偶尔拿到的是 A 刚写的 PENDING 行——典型的跨用例数据污染;token:uid:1001 这种全局 key,多个用例共享同一个登录态,A 用例 del 之后 B 用例就 401;pay-cb-group 在 staging 上被两个 CI 节点同时拉,消费位点互相覆盖,导致"回调通知"用例偶发收不到消息。--dist loadscope,让同一 class 的 case 落同一 worker:解决了 1 的 ~40%,但跨 class 的污染仍在;scope=class + 每个 class 用独立 order_no:解决了大部分 1,但 2 的 token 冲突没解决,因为登录态在 Redis 是全局的;pytest-split 按文件切到 3 台 CI 机器跑:并行度没上去,且 3 的 Kafka 消费组冲突更严重(3 个节点抢同一个 group id)。想听到具体可落地的方案,最好带命令 / 配置片段:
欢迎贴你们的 xdist 配置 + fixture 片段,能贴多少贴多少。