保证 scope=session 的 fixture 在多进程运行情况下仍然能只运行一次

转自:https://www.cnblogs.com/poloyy/p/14708825.html

import json
import os
import pytest
from random import random
from filelock import FileLock

@pytest.fixture(scope="session")
def test(tmp_path_factory, worker_id):
    # 如果是单机运行 则运行这里的代码块【不可删除、修改】
    if worker_id == "master":
        """
        【自定义代码块】
        这里就写你要本身应该要做的操作,比如:登录请求、新增数据、清空数据库历史数据等等
        """
        token = str(random())
        print("fixture:请求登录接口,获取token", token)
        os.environ['token'] = token

        # 如果测试用例有需要,可以返回对应的数据,比如 token
        return token

    # 如果是分布式运行
    # 获取所有子节点共享的临时目录,无需修改【不可删除、修改】
    root_tmp_dir = tmp_path_factory.getbasetemp().parent
    # 【不可删除、修改】
    fn = root_tmp_dir / "data.json"
    # 【不可删除、修改】
    with FileLock(str(fn) + ".lock"):
        # 【不可删除、修改】
        if fn.is_file():
            # 缓存文件中读取数据,像登录操作的话就是 token 【不可删除、修改】
            token = json.loads(fn.read_text())
            print(f"读取缓存文件,token 是{token} ")
        else:
            """
            【自定义代码块】
            跟上面 if 的代码块一样就行
            """
            token = str(random())
            print("fixture:请求登录接口,获取token", token)
            # 【不可删除、修改】
            fn.write_text(json.dumps(token))
            print(f"首次执行,token 是{token} ")

        # 最好将后续需要保留的数据存在某个地方,比如这里是 os 的环境变量
        os.environ['token'] = token
    return token

注意:如果有多个conftest.py使用FileLock,fn的文件名要不一样,因为这里的 data.json 是同一个文件。在 pytest 中,root_tmp_dir 表示根临时目录,而 / “data.json” 则表示在根临时目录下创建名为 data.json 的文件路径。

因此,无论这行代码出现在多个 conftest.py 文件中,它们都会指向相同的文件路径,即同一个 data.json 文件。这意味着这些 conftest.py 文件中使用的是共享的 data.json 文件,可以在不同的测试模块或测试目录中共享数据。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值