Python pytest 中,进行多进程跑时,我想定义在 conftest 文件中的 fixture 夹具只在一个线程中跑一次即可,而不想多次进行跑,如图,具体怎么实现

陈平安 · 2022年08月19日 · 最后由 古一 回复于 2022年09月05日 · 8839 次阅读

共收到 7 条回复 时间 点赞

写个单例

你的线程是怎么设计的?

pytest 中,进行多进程跑时,我想定义在 conftest 文件中的 fixture 夹具只在一个线程中跑一次即可,而不想多次进行跑

具体确定想怎样呢?

正好前段时间用 pickle 和 FileLock 做了这个改造,步骤大概如下(代码暂时没办法贴上来):

  1. 封装一个登录方法,并把登录结果保存到 pickle 文件中,同时通过 filelock 来做锁定保护。
  2. 在登录的 fixture 中,先尝试去读取 pickle 中的登录结果。 如果文件已锁定且读取成功,就返回登录结果。这时候说明其他 session 已经登录成功; 如果文件已锁定但登录结果为空,则说明其他 session 正在登录但是还没完成。这时候会返回 none,并在上层做一个 30 秒的 for 循环进行轮询等待。 如果文件不存在,则说明还没有 session 尝试登录。这时候就调用步骤 1 的封装方法进行登录并写入登录结果。

官方是有例程的,根据业务改造一下就可以用了https://pypi.org/project/pytest-xdist/#making-session-scoped-fixtures-execute-only-once

Ybump14 回复

我也是基于这个官方教程去改造的,把保存的文件从 JSON 改成 pickle 就可以了

多进程最好还是别用 fixture 了,挺坑的,即使用文件锁解决了 fixture 重复调用的问题,那也可能出现进程 A 还在执行 fixture,进程 B 已经开始执行 case 了,但这个 case 又需要 fixture 的结果的情况,很麻烦。
我的处理方式是,将 fixture 的一些前置操作置于主进程,子进程只负责执行 case。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册