No need to call tearDown on expected failures
- Isolate logic for getting expected exceptions - Use original method name, as users see it when entering the debugger
This commit is contained in:
parent
04f27d4eb4
commit
f7b1de70c0
|
@ -108,7 +108,6 @@ class TestCaseFunction(Function):
|
||||||
nofuncargs = True
|
nofuncargs = True
|
||||||
_excinfo = None
|
_excinfo = None
|
||||||
_testcase = None
|
_testcase = None
|
||||||
_need_tearDown = None
|
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
self._testcase = self.parent.obj(self.name)
|
self._testcase = self.parent.obj(self.name)
|
||||||
|
@ -117,8 +116,6 @@ class TestCaseFunction(Function):
|
||||||
self._request._fillfixtures()
|
self._request._fillfixtures()
|
||||||
|
|
||||||
def teardown(self):
|
def teardown(self):
|
||||||
if self._need_tearDown:
|
|
||||||
self._testcase.tearDown()
|
|
||||||
self._testcase = None
|
self._testcase = None
|
||||||
self._obj = None
|
self._obj = None
|
||||||
|
|
||||||
|
@ -191,45 +188,44 @@ class TestCaseFunction(Function):
|
||||||
def stopTest(self, testcase):
|
def stopTest(self, testcase):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def _expecting_failure(self, test_method) -> bool:
|
||||||
|
"""Return True if the given unittest method (or the entire class) is marked
|
||||||
|
with @expectedFailure"""
|
||||||
|
expecting_failure_method = getattr(
|
||||||
|
test_method, "__unittest_expecting_failure__", False
|
||||||
|
)
|
||||||
|
expecting_failure_class = getattr(self, "__unittest_expecting_failure__", False)
|
||||||
|
return bool(expecting_failure_class or expecting_failure_method)
|
||||||
|
|
||||||
def runtest(self):
|
def runtest(self):
|
||||||
|
import unittest
|
||||||
|
|
||||||
testMethod = getattr(self._testcase, self._testcase._testMethodName)
|
testMethod = getattr(self._testcase, self._testcase._testMethodName)
|
||||||
|
|
||||||
class _GetOutOf_testPartExecutor(KeyboardInterrupt):
|
class _GetOutOf_testPartExecutor(KeyboardInterrupt):
|
||||||
"""Helper exception to get out of unittests's testPartExecutor."""
|
"""Helper exception to get out of unittests's testPartExecutor (see TestCase.run)."""
|
||||||
|
|
||||||
unittest = sys.modules.get("unittest")
|
|
||||||
|
|
||||||
reraise = ()
|
|
||||||
if unittest:
|
|
||||||
reraise += (unittest.SkipTest,)
|
|
||||||
|
|
||||||
@functools.wraps(testMethod)
|
@functools.wraps(testMethod)
|
||||||
def wrapped_testMethod(*args, **kwargs):
|
def wrapped_testMethod(*args, **kwargs):
|
||||||
|
"""Wrap the original method to call into pytest's machinery, so other pytest
|
||||||
|
features can have a chance to kick in (notably --pdb)"""
|
||||||
try:
|
try:
|
||||||
self.ihook.pytest_pyfunc_call(pyfuncitem=self)
|
self.ihook.pytest_pyfunc_call(pyfuncitem=self)
|
||||||
except reraise:
|
except unittest.SkipTest:
|
||||||
raise
|
raise
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
expecting_failure_method = getattr(
|
expecting_failure = self._expecting_failure(testMethod)
|
||||||
testMethod, "__unittest_expecting_failure__", False
|
|
||||||
)
|
|
||||||
expecting_failure_class = getattr(
|
|
||||||
self, "__unittest_expecting_failure__", False
|
|
||||||
)
|
|
||||||
expecting_failure = expecting_failure_class or expecting_failure_method
|
|
||||||
self._need_tearDown = True
|
|
||||||
|
|
||||||
if expecting_failure:
|
if expecting_failure:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
raise _GetOutOf_testPartExecutor(exc)
|
raise _GetOutOf_testPartExecutor(exc)
|
||||||
|
|
||||||
self._testcase._wrapped_testMethod = wrapped_testMethod
|
setattr(self._testcase, self._testcase._testMethodName, wrapped_testMethod)
|
||||||
self._testcase._testMethodName = "_wrapped_testMethod"
|
|
||||||
try:
|
try:
|
||||||
self._testcase(result=self)
|
self._testcase(result=self)
|
||||||
except _GetOutOf_testPartExecutor as exc:
|
except _GetOutOf_testPartExecutor as exc:
|
||||||
raise exc.args[0] from exc.args[0]
|
raise exc.args[0] from exc.args[0]
|
||||||
|
finally:
|
||||||
|
delattr(self._testcase, self._testcase._testMethodName)
|
||||||
|
|
||||||
def _prunetraceback(self, excinfo):
|
def _prunetraceback(self, excinfo):
|
||||||
Function._prunetraceback(self, excinfo)
|
Function._prunetraceback(self, excinfo)
|
||||||
|
|
Loading…
Reference in New Issue