转自: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 文件,可以在不同的测试模块或测试目录中共享数据。