python测试夹具碰撞

python测试夹具碰撞,python,pytest,yield,fixture,Python,Pytest,Yield,Fixture,我正在一次测试中多次尝试使用默认范围的pytest屈服fixture @pytest.fixture def create_temp_file(): nonlocal_maker_data = {'path': None} # nonlocal for python2 def maker(path, data): nonlocal_maker_data['path'] = path with open(path, 'wb') as out:

我正在一次测试中多次尝试使用默认范围的
pytest屈服fixture

@pytest.fixture
def create_temp_file():
    nonlocal_maker_data = {'path': None}  # nonlocal for python2

    def maker(path, data):
        nonlocal_maker_data['path'] = path
        with open(path, 'wb') as out:
            out.write(data)
    try:
        yield maker
    finally:
        path = nonlocal_maker_data['path']
        if os.path.exists(path):
            os.remove(path)


def test_two_call_of_fixture(create_temp_file):
    create_temp_file('temp_file_1', data='data1')
    create_temp_file('temp_file_2', data='data2')

    with open('temp_file_1') as f:
        assert f.read() == 'data1'

    with open('temp_file_2') as f:
        assert f.read() == 'data2'

    assert False
    # temp_file_2 removed
    # temp_file_1 doesn't removed
我撞车了。第一个夹具没有清理-临时文件1没有删除,而第二个文件删除得很好。 可以多次使用夹具吗


PS:我知道
tmpdir
-标准测试夹具。这只是一个例子。

Fixture在这个例子中是一个函数。我认为最直接的方法是积累通过的参数:

@pytest.fixture
def create_temp_file():
    nonlocal_maker_data = set()  # nonlocal for python2

    def maker(path, data):
        with open(path, 'wb') as out:
            out.write(data)
        nonlocal_maker_data.add(path)
    try:
        yield maker
    finally:
        for path in nonlocal_maker_data:
            if os.path.exists(path):
                os.remove(path)

Fixture在本例中是一个函数。我认为最直接的方法是积累通过的参数:

@pytest.fixture
def create_temp_file():
    nonlocal_maker_data = set()  # nonlocal for python2

    def maker(path, data):
        with open(path, 'wb') as out:
            out.write(data)
        nonlocal_maker_data.add(path)
    try:
        yield maker
    finally:
        for path in nonlocal_maker_data:
            if os.path.exists(path):
                os.remove(path)

当然,在本例中,可以将所有创建的文件累积到非本地列表中并将其删除。但我想了解最常用的方法。当然,在这个例子中,可以将所有创建的文件累积到非本地列表中并删除它们。但我想了解最常见的方式。