Reverted leak fixture test.
This commit is contained in:
parent
81e3f3cf95
commit
db50a975fd
|
@ -1047,6 +1047,51 @@ def test_deferred_hook_checking(testdir):
|
||||||
result.stdout.fnmatch_lines(["* 1 passed *"])
|
result.stdout.fnmatch_lines(["* 1 passed *"])
|
||||||
|
|
||||||
|
|
||||||
|
def test_fixture_values_leak(testdir):
|
||||||
|
"""Ensure that fixture objects are properly destroyed by the garbage collector at the end of their expected
|
||||||
|
life-times (#2981).
|
||||||
|
"""
|
||||||
|
testdir.makepyfile(
|
||||||
|
"""
|
||||||
|
import attr
|
||||||
|
import gc
|
||||||
|
import pytest
|
||||||
|
import weakref
|
||||||
|
|
||||||
|
@attr.s
|
||||||
|
class SomeObj(object):
|
||||||
|
name = attr.ib()
|
||||||
|
|
||||||
|
fix_of_test1_ref = None
|
||||||
|
session_ref = None
|
||||||
|
|
||||||
|
@pytest.fixture(scope='session')
|
||||||
|
def session_fix():
|
||||||
|
global session_ref
|
||||||
|
obj = SomeObj(name='session-fixture')
|
||||||
|
session_ref = weakref.ref(obj)
|
||||||
|
return obj
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def fix(session_fix):
|
||||||
|
global fix_of_test1_ref
|
||||||
|
obj = SomeObj(name='local-fixture')
|
||||||
|
fix_of_test1_ref = weakref.ref(obj)
|
||||||
|
return obj
|
||||||
|
|
||||||
|
def test1(fix):
|
||||||
|
assert fix_of_test1_ref() is fix
|
||||||
|
|
||||||
|
def test2():
|
||||||
|
gc.collect()
|
||||||
|
# fixture "fix" created during test1 must have been destroyed by now
|
||||||
|
assert fix_of_test1_ref() is None
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines(["* 2 passed *"])
|
||||||
|
|
||||||
|
|
||||||
def test_fixture_order_respects_scope(testdir):
|
def test_fixture_order_respects_scope(testdir):
|
||||||
"""Ensure that fixtures are created according to scope order, regression test for #2405
|
"""Ensure that fixtures are created according to scope order, regression test for #2405
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
"""Ensure that fixture objects are properly destroyed by the garbage collector at the end of their expected
|
|
||||||
life-times (#2981).
|
|
||||||
|
|
||||||
This comes from the old acceptance_test.py::test_fixture_values_leak(testdir):
|
|
||||||
This used pytester before but was not working when using pytest_assert_reprcompare
|
|
||||||
because pytester tracks hook calls and it would hold a reference (ParsedCall object),
|
|
||||||
preventing garbage collection
|
|
||||||
|
|
||||||
<ParsedCall 'pytest_assertrepr_compare'(**{
|
|
||||||
'config': <_pytest.config.Config object at 0x0000019C18D1C2B0>,
|
|
||||||
'op': 'is',
|
|
||||||
'left': SomeObj(name='local-fixture'),
|
|
||||||
'right': SomeObj(name='local-fixture')})>
|
|
||||||
"""
|
|
||||||
import attr
|
|
||||||
import gc
|
|
||||||
import pytest
|
|
||||||
import weakref
|
|
||||||
|
|
||||||
|
|
||||||
@attr.s
|
|
||||||
class SomeObj(object):
|
|
||||||
name = attr.ib()
|
|
||||||
|
|
||||||
|
|
||||||
fix_of_test1_ref = None
|
|
||||||
session_ref = None
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
|
||||||
def session_fix():
|
|
||||||
global session_ref
|
|
||||||
obj = SomeObj(name="session-fixture")
|
|
||||||
session_ref = weakref.ref(obj)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def fix(session_fix):
|
|
||||||
global fix_of_test1_ref
|
|
||||||
obj = SomeObj(name="local-fixture")
|
|
||||||
fix_of_test1_ref = weakref.ref(obj)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
|
|
||||||
def test1(fix):
|
|
||||||
assert fix_of_test1_ref() is fix
|
|
||||||
|
|
||||||
|
|
||||||
def test2():
|
|
||||||
gc.collect()
|
|
||||||
# fixture "fix" created during test1 must have been destroyed by now
|
|
||||||
assert fix_of_test1_ref() is None
|
|
Loading…
Reference in New Issue