已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
我维护一条 B 端 SaaS 的接口自动化(Python 3.11 + pytest 7.4 + httpx,约 2000 条用例),跑在 5 人共享的 staging 上(MySQL 8.0 + Redis 7.2,GitLab CI)。每条用例的 fixture teardown 里都有清理逻辑(DELETE / 状态回滚),CI 跑完 pytest 显示全绿。
tenant_id=9999 的测试租户,今天某条 SELECT COUNT(*) 断言就偏了;session.delete() 跑了、pytest 报了 passed,但实际 InnoDB 在 REPEATABLE READ 下,事务还没 commit 连接就断了——数据还在;mysql -e "SELECT COUNT(*) FROM orders WHERE created_by='test_automated'" 查了 3 次,发现残留集中在「多步事务」用例(创建→关联→删除),单步 CRUD 很少残留;session 级 finalizer 里跑 3 张表的 SELECT COUNT(*) WHERE created_by LIKE 'test_%',超阈值就 pytest.exit(1)。问题:2000 条用例跑完再扫 3 张表,每次多耗 40~60 秒,CI 超时风险大,而且只覆盖了 3 张表、其他 11 张没查;information_schema 对比?用 binlog 解析只查「本轮 INSERT 过的行」?session.commit() + connection.ping()?还是别的路子?)参考:站内已有讨论《共享测试环境里"谁污染了谁的数据"》(id=1449)侧重运行时的隔离策略(物理库/逻辑租户/重建),我这个问题侧重跑完之后的验证门禁——两者互补但角度不同。