Python Py.test:在pytest\u生成\u测试之前运行初始化方法

Python Py.test:在pytest\u生成\u测试之前运行初始化方法,python,python-2.7,pytest,Python,Python 2.7,Pytest,我正在使用py.test制作一个测试套件,它首先生成随机模拟的文件,文件名存储在初始化对象中。然后由pytest\u generate\u tests生成测试file0.txt,file1.txt等。 测试是从一个YAML文件生成的,该文件包含在输入字符串中,如cat%s,以及一个替代字符串,如file*.txt,它在pytest\u generate\u Tests中匹配的每个文件生成一个测试。因此,我需要文件在调用pytest\u generate\u tests之前存在,否则文件将不匹配

我正在使用py.test制作一个测试套件,它首先生成随机模拟的文件,文件名存储在初始化对象中。然后由
pytest\u generate\u tests
生成测试
file0.txt
file1.txt
等。 测试是从一个YAML文件生成的,该文件包含在输入字符串中,如
cat%s
,以及一个替代字符串,如
file*.txt
,它在
pytest\u generate\u Tests
中匹配的每个文件生成一个测试。因此,我需要文件在调用
pytest\u generate\u 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
test_a(initializer, input_string):
    # ...
然后我可以在文件
tests\u 0.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
test_a(initializer, input_string):
    # ...
测试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)
然后,我尝试使用一个全局变量来获取初始值设定项,并在文件中共享它,如中所述。然后,我将初始化放在
pytest\u generate\u tests
的顶部,并从
test\u a
中调用conftest.initializer,但随后,我添加的每个测试方法都会运行初始化步骤,
test\u b


因此,问题是,我如何在
pytest\u generate\u tests
之前运行一个方法,并在会话中的所有测试中保持初始化类的实例?

刚刚编写的问题给了我一个明显的解决方案,因为第二种方法使用了全局变量:

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

其中
initialize
创建全局变量
initializer
,因此只创建一次。然而,我并不真的喜欢与globals合作,因为我认为Fixture或其他一些
py.test
技术可以帮助我,并且很乐意听到更好的答案。

只是宣传你的问题,让你知道实现它的正确技术。。