用例单跑正常、批量跑挂,怎么治(附参考答案)

题目:接口自动化套件里,用例 A 单独执行全部通过,整套一起跑时有 20% 用例随机失败。排查发现这些用例共用了一个 scope="session" 的 fixture 返回的「用户列表」对象,前面的用例往里追加/删除了数据。以下治理手段中最不合理的是()

A. session 级 fixture 只放只读或幂等资源(配置、驱动、token),会被修改的业务数据下沉为 scope="function"
B. 把 session fixture 的返回值改为工厂函数(如 create_order()),用例每次自己造新对象,从源头消除共享可变状态
C. 用 pytest.mark.dependency 或按文件名顺序把用例依赖关系固化下来,让它们只能按既定顺序执行
D. 在 conftest 中按层级管理 fixture:根目录放全局环境,子目录放用例局部数据,必要时用 copy.deepcopy 返回副本

难度:中级
题型:笔试(单选)

:point_right:参考答案/答题要点:

答案:C

  • C 是治标不治本:固化执行顺序等于承认用例不独立,后续无法并行(xdist 按 worker 分发会直接打乱顺序)、无法单条重跑、任一条上游用例失败会引发连锁失败,是自动化腐化的典型信号。
  • A/B/D 都指向同一个根因解法:用例必须满足独立性原则,要么缩小夹具作用域,要么消除共享可变状态。
  • 延伸采分点:pytest 七种 fixture 作用域(function/class/module/package/session + 3.8+ 的 scope="test_class" 说法可省);fixture 缓存机制是「同作用域内只执行一次」;这类问题归类为 Flaky Test 中的「状态污染」类,与「时序等待」「环境抖动」类治理手段不同;CI 上应支持随机顺序(-p randomly)来主动暴露用例间依赖。