用例隔离是什么
用例隔离指任意用例都能单独运行、以任意顺序运行并得到一致结果:不共享可变状态、不依赖执行顺序、不残留数据。这是并行执行、失败重试与随机排序得以成立的前提;隔离被破坏时,症状通常是「单跑通过、全跑失败」或 CI 上随机失败,排查成本极高。
基本信息
| 定义 | 用例可独立、任意顺序运行且结果一致 |
|---|---|
| 四不原则 | 不共享可变状态、不依赖顺序、不残留数据、不依赖真实时钟 |
| 常见破坏源 | 共享夹具里的可变对象、全局缓存的登录态、自增主键假设 |
| 隔离手段 | 用例自建数据并自清理、命名空间或租户隔离、可控时钟 |
| 受益能力 | 并行执行、失败重试、随机排序都能安全启用 |
夹具自建自清
夹具自建自清
@pytest.fixture
def user(db):
# 每个用例独立创建数据,名字带随机后缀
u = db.create_user(name=f"user-{uuid4().hex}")
yield u
db.delete_user(u.id) # 用例结束自清理典型使用场景
- 并行提速:隔离达标后可按用例并行,测试时间大幅缩短。
- 失败重试:重试单条用例不依赖上下文,结果可信。
- 随机排序:定期打乱执行顺序,提前暴露顺序依赖。
- 环境重建:新环境上全量套件一次通过,无需人工补数据。
- 定位排错:失败可复现,单条命令就能重放。
- 共享资源治理:识别并收编散落在用例外的公共状态。
隔离破坏源与对策
| 破坏源 | 典型表现 | 对策 |
|---|---|---|
| 共享可变对象 | 用例顺序不同结果不同 | 每个用例重建夹具 |
| 固定账号 | 并发执行互踢登录 | 按用例派生独立账号 |
| 自增主键假设 | 并行下键冲突 | 随机键或占位标识 |
| 真实时钟 | 跨日、跨时区失败 | 注入可控时钟 |
常见破坏源:共享夹具中的可变对象、全局缓存的登录态、对自增主键的假设。
隔离不是绝对零共享:只读常量与只读配置允许共享,共享前先确认「不会写」。
验收方式:按随机顺序跑全量套件、连续多次通过,才说明隔离达标。