mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
Issue 7815. __unittest in module globals trims frames from reported stacktraces in unittest.
This commit is contained in:
parent
bb9d726357
commit
b1aa30f94d
10 changed files with 32 additions and 5 deletions
|
@ -2084,6 +2084,16 @@ class Test_TestResult(TestCase):
|
||||||
'Tests getDescription() for a method with a longer '
|
'Tests getDescription() for a method with a longer '
|
||||||
'docstring.'))
|
'docstring.'))
|
||||||
|
|
||||||
|
def testStackFrameTrimming(self):
|
||||||
|
class Frame(object):
|
||||||
|
class tb_frame(object):
|
||||||
|
f_globals = {}
|
||||||
|
result = unittest.TestResult()
|
||||||
|
self.assertFalse(result._is_relevant_tb_level(Frame))
|
||||||
|
|
||||||
|
Frame.tb_frame.f_globals['__unittest'] = True
|
||||||
|
self.assertTrue(result._is_relevant_tb_level(Frame))
|
||||||
|
|
||||||
classDict = dict(unittest.TestResult.__dict__)
|
classDict = dict(unittest.TestResult.__dict__)
|
||||||
for m in ('addSkip', 'addExpectedFailure', 'addUnexpectedSuccess',
|
for m in ('addSkip', 'addExpectedFailure', 'addUnexpectedSuccess',
|
||||||
'__init__'):
|
'__init__'):
|
||||||
|
|
|
@ -64,3 +64,5 @@ from .runner import TextTestRunner, TextTestResult
|
||||||
|
|
||||||
# deprecated
|
# deprecated
|
||||||
_TextTestResult = TextTestResult
|
_TextTestResult = TextTestResult
|
||||||
|
|
||||||
|
__unittest = True
|
||||||
|
|
|
@ -4,5 +4,8 @@ import sys
|
||||||
if sys.argv[0].endswith("__main__.py"):
|
if sys.argv[0].endswith("__main__.py"):
|
||||||
sys.argv[0] = "unittest"
|
sys.argv[0] = "unittest"
|
||||||
|
|
||||||
|
__unittest = True
|
||||||
|
|
||||||
|
|
||||||
from .main import main
|
from .main import main
|
||||||
main(module=None)
|
main(module=None)
|
||||||
|
|
|
@ -12,6 +12,9 @@ from .util import (
|
||||||
strclass, safe_repr, sorted_list_difference, unorderable_list_difference
|
strclass, safe_repr, sorted_list_difference, unorderable_list_difference
|
||||||
)
|
)
|
||||||
|
|
||||||
|
__unittest = True
|
||||||
|
|
||||||
|
|
||||||
class SkipTest(Exception):
|
class SkipTest(Exception):
|
||||||
"""
|
"""
|
||||||
Raise this exception in a test to skip it.
|
Raise this exception in a test to skip it.
|
||||||
|
|
|
@ -10,6 +10,8 @@ from fnmatch import fnmatch
|
||||||
|
|
||||||
from . import case, suite
|
from . import case, suite
|
||||||
|
|
||||||
|
__unittest = True
|
||||||
|
|
||||||
|
|
||||||
def _CmpToKey(mycmp):
|
def _CmpToKey(mycmp):
|
||||||
'Convert a cmp= function into a key= function'
|
'Convert a cmp= function into a key= function'
|
||||||
|
|
|
@ -6,6 +6,8 @@ import types
|
||||||
|
|
||||||
from . import loader, runner
|
from . import loader, runner
|
||||||
|
|
||||||
|
__unittest = True
|
||||||
|
|
||||||
|
|
||||||
USAGE_AS_MAIN = """\
|
USAGE_AS_MAIN = """\
|
||||||
Usage: %(progName)s [options] [tests]
|
Usage: %(progName)s [options] [tests]
|
||||||
|
|
|
@ -4,6 +4,8 @@ import traceback
|
||||||
|
|
||||||
from . import util
|
from . import util
|
||||||
|
|
||||||
|
__unittest = True
|
||||||
|
|
||||||
|
|
||||||
class TestResult(object):
|
class TestResult(object):
|
||||||
"""Holder for test result information.
|
"""Holder for test result information.
|
||||||
|
@ -98,11 +100,7 @@ class TestResult(object):
|
||||||
return ''.join(traceback.format_exception(exctype, value, tb))
|
return ''.join(traceback.format_exception(exctype, value, tb))
|
||||||
|
|
||||||
def _is_relevant_tb_level(self, tb):
|
def _is_relevant_tb_level(self, tb):
|
||||||
globs = tb.tb_frame.f_globals
|
return '__unittest' in tb.tb_frame.f_globals
|
||||||
is_relevant = '__name__' in globs and \
|
|
||||||
globs["__name__"].startswith("unittest")
|
|
||||||
del globs
|
|
||||||
return is_relevant
|
|
||||||
|
|
||||||
def _count_relevant_tb_levels(self, tb):
|
def _count_relevant_tb_levels(self, tb):
|
||||||
length = 0
|
length = 0
|
||||||
|
|
|
@ -5,6 +5,8 @@ import time
|
||||||
|
|
||||||
from . import result
|
from . import result
|
||||||
|
|
||||||
|
__unittest = True
|
||||||
|
|
||||||
|
|
||||||
class _WritelnDecorator(object):
|
class _WritelnDecorator(object):
|
||||||
"""Used to decorate file-like objects with a handy 'writeln' method"""
|
"""Used to decorate file-like objects with a handy 'writeln' method"""
|
||||||
|
|
|
@ -5,6 +5,8 @@ import sys
|
||||||
from . import case
|
from . import case
|
||||||
from . import util
|
from . import util
|
||||||
|
|
||||||
|
__unittest = True
|
||||||
|
|
||||||
|
|
||||||
class BaseTestSuite(object):
|
class BaseTestSuite(object):
|
||||||
"""A simple test suite that doesn't provide class or module shared fixtures.
|
"""A simple test suite that doesn't provide class or module shared fixtures.
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
"""Various utility functions."""
|
"""Various utility functions."""
|
||||||
|
|
||||||
|
__unittest = True
|
||||||
|
|
||||||
|
|
||||||
def safe_repr(obj):
|
def safe_repr(obj):
|
||||||
try:
|
try:
|
||||||
return repr(obj)
|
return repr(obj)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue