Py.test: 运行 pytest_generate_tests 之前的初始化方法

Py.test: Run initialization method before pytest_generate_tests

我正在使用 py.test 制作一个测试套件,它首先生成随机模拟文件,文件名存储在初始化对象中。然后 pytest_generate_tests 生成测试; file0.txtfile1.txt 等 测试是从 YAML 文件生成的,该文件包含 cat %s 之类的输入字符串和 file*.txt 之类的替换字符串,它为每个在 pytest_generate_tests 中匹配的文件生成 1 个测试。因此,我需要在调用 pytest_generate_tests 之前存在文件,否则文件将不会匹配。

在我遇到这个问题之前,我在 conftest.py:

中有一个初始化装置
@pytest.fixture(scope="session", autouse=True)
def initializer(request):
    # ...do some stuff with the request
    return InitializeTests(...)

class InitializeTests():
    def __init__(self, n):
        # ...generate n files

然后我可以在文件中使用 tests_0.py:

test_a(initializer, input_string):
    # ...

test_a 由以下人员生成:

def pytest_generate_tests(metafunc):
    input_strings = manipulate_the_yaml_file() # This requires the files to exist.
    if "input_string" in metafunc.fixturenames:
        metafunc.parametrize("input_string", input_strings)

然后我尝试使用全局变量来获取初始化程序并按照 here 中的说明跨文件共享它。然后我将初始化放在 pytest_generate_tests 的顶部并从 test_a 中调用 conftest.initializer,但是对于我添加的每个测试方法,初始化步骤都会得到 运行,test_b

所以问题是,如何在 pytest_generate_tests 之前 运行 方法并在会话中的所有测试中保留初始化实例 class?

考虑到使用全局变量的第二种方法,仅编写问题就给了我一个明显的解决方案:

if "initializer" not in globals():
    initialize()

其中 initialize 创建全局变量 initializer 因此只创建一次。但是,我不太喜欢使用全局变量,因为我认为固定装置或其他一些 py.test 技术可以帮助我,并且很乐意听到更好的答案。