Python。 Pytest夹具碰撞
Python. Pytest fixture collision
我正在尝试在一次测试中多次使用默认范围的 pytest yield-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
我遇到了碰撞。第一个夹具没有清理 - temp_file_1 没有删除,而第二个文件删除得很好。
是否可以多次使用 fixture 是否正确?
PS:我知道 tmpdir
- 标准的 pytest 夹具。这只是一个例子。
在这个例子中夹具产生了一个函数。我认为直接的方法是累积传递的参数:
@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)
我正在尝试在一次测试中多次使用默认范围的 pytest yield-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
我遇到了碰撞。第一个夹具没有清理 - temp_file_1 没有删除,而第二个文件删除得很好。 是否可以多次使用 fixture 是否正确?
PS:我知道 tmpdir
- 标准的 pytest 夹具。这只是一个例子。
在这个例子中夹具产生了一个函数。我认为直接的方法是累积传递的参数:
@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)