<p>pytest-randomly 插件安装即用,随机化 test_* 函数执行顺序但不影响 fixture 逻辑;setup/teardown 仍按方法绑定执行,module/session 级 fixture 不受干扰;与 xdist 共用时仅 worker 内随机;它暴露而非解决测试间耦合问题。</p>

直接装插件就能用,不需要改测试代码,但得注意它和 fixture 的交互问题。
安装 pytest-randomly 并启用
这个插件本身不修改你的测试逻辑,只在 pytest 启动时重排 test_* 函数的执行顺序。安装后默认就生效:
- 运行
pip install pytest-randomly - 之后直接跑
pytest,顺序就随机了 - 如果只想临时启用,加参数:
pytest --randomly-seed=12345(固定 seed 便于复现) - 想禁用?加
--randomly-dont-randomize,适合调试单个模块时保持顺序
为什么 test_setup/teardown 有时看起来“不随机”?
pytest-randomly 随机的是测试函数(test_*)层级,不是每个 setup_method 或 yield_fixture 的调用时机。这意味着:
- 类内多个
test_*方法会被打乱,但每个方法仍会走完自己的setup_method→test_*→teardown_method - 如果用了 module/session 级 fixture(比如
@pytest.fixture(scope="module")),它们的执行时机由 pytest 自身调度决定,不受随机化影响 - 常见错觉:“我看到 setup 先跑完了所有 test”,其实是 pytest 在按 scope 收集 fixture 时的正常行为,不是插件 bug
和 pytest-xdist 并用时要注意什么?
两者能共存,但随机性只在每个 worker 内部生效,不是全局打乱:
立即学习“Python免费学习笔记(深入)”;
- 启动命令如
pytest -n 3 --randomly-seed=42,每个进程拿到的 test 列表是独立 shuffle 的 - 如果你依赖“某 test 必须在另一 test 之前运行”(比如状态污染型测试),这种组合会让问题更难定位
- 建议搭配
--tb=short和明确的--randomly-seed,出错时能快速复现
真正容易被忽略的点是:随机化不解决测试间耦合,反而会让隐藏的依赖更快暴露——比如一个 test 修改了全局变量、缓存或文件,下一个 test 恰好读取它,顺序一变就失败。这时候该修的是测试,不是 seed。


















