Clear sys.last_* attributes before running an item

Otherwise we will keep the last failed exception around forever

Related to #2798
This commit is contained in:
Bruno Oliveira 2018-04-04 20:36:07 -03:00
parent ad0b4330e7
commit ba407b5eb6
2 changed files with 16 additions and 6 deletions

View File

@ -105,6 +105,7 @@ def pytest_runtest_setup(item):
def pytest_runtest_call(item): def pytest_runtest_call(item):
_update_current_test_var(item, 'call') _update_current_test_var(item, 'call')
sys.last_type, sys.last_value, sys.last_traceback = (None, None, None)
try: try:
item.runtest() item.runtest()
except Exception: except Exception:
@ -114,7 +115,7 @@ def pytest_runtest_call(item):
sys.last_type = type sys.last_type = type
sys.last_value = value sys.last_value = value
sys.last_traceback = tb sys.last_traceback = tb
del tb # Get rid of it in this namespace del type, value, tb # Get rid of these in this frame
raise raise

View File

@ -719,18 +719,20 @@ def test_makereport_getsource_dynamic_code(testdir, monkeypatch):
result.stdout.fnmatch_lines(["*test_fix*", "*fixture*'missing'*not found*"]) result.stdout.fnmatch_lines(["*test_fix*", "*fixture*'missing'*not found*"])
def test_store_except_info_on_eror(): def test_store_except_info_on_error():
""" Test that upon test failure, the exception info is stored on """ Test that upon test failure, the exception info is stored on
sys.last_traceback and friends. sys.last_traceback and friends.
""" """
# Simulate item that raises a specific exception # Simulate item that might raise a specific exception, depending on `raise_error` class var
class ItemThatRaises(object): class ItemMightRaise(object):
nodeid = 'item_that_raises' nodeid = 'item_that_raises'
raise_error = True
def runtest(self): def runtest(self):
raise IndexError('TEST') if self.raise_error:
raise IndexError('TEST')
try: try:
runner.pytest_runtest_call(ItemThatRaises()) runner.pytest_runtest_call(ItemMightRaise())
except IndexError: except IndexError:
pass pass
# Check that exception info is stored on sys # Check that exception info is stored on sys
@ -738,6 +740,13 @@ def test_store_except_info_on_eror():
assert sys.last_value.args[0] == 'TEST' assert sys.last_value.args[0] == 'TEST'
assert sys.last_traceback assert sys.last_traceback
# The next run should clear the exception info stored by the previous run
ItemMightRaise.raise_error = False
runner.pytest_runtest_call(ItemMightRaise())
assert sys.last_type is None
assert sys.last_value is None
assert sys.last_traceback is None
def test_current_test_env_var(testdir, monkeypatch): def test_current_test_env_var(testdir, monkeypatch):
pytest_current_test_vars = [] pytest_current_test_vars = []