test_trace.py
来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 220 行
PY
220 行
# Testing the line trace facility.import test_supportimport unittestimport sysimport difflibif not __debug__: raise test_support.TestSkipped, "tracing not supported under -O"# A very basic example. If this fails, we're in deep trouble.def basic(): return 1basic.events = [(0, 'call'), (0, 'line'), (1, 'line'), (1, 'return')]# Armin Rigo's failing example:def arigo_example(): x = 1 del x while 0: pass x = 1arigo_example.events = [(0, 'call'), (0, 'line'), (1, 'line'), (2, 'line'), (3, 'line'), (3, 'line'), (5, 'line'), (5, 'return')]# check that lines consisting of just one instruction get traced:def one_instr_line(): x = 1 del x x = 1one_instr_line.events = [(0, 'call'), (0, 'line'), (1, 'line'), (2, 'line'), (3, 'line'), (3, 'return')]def no_pop_tops(): # 0 x = 1 # 1 for a in range(2): # 2 if a: # 3 x = 1 # 4 else: # 5 x = 1 # 6no_pop_tops.events = [(0, 'call'), (0, 'line'), (1, 'line'), (2, 'line'), (2, 'line'), (3, 'line'), (6, 'line'), (2, 'line'), (3, 'line'), (4, 'line'), (2, 'line'), (2, 'return')]def no_pop_blocks(): while 0: bla x = 1no_pop_blocks.events = [(0, 'call'), (0, 'line'), (1, 'line'), (1, 'line'), (3, 'line'), (3, 'return')]def called(): # line -3 x = 1def call(): # line 0 called()call.events = [(0, 'call'), (0, 'line'), (1, 'line'), (-3, 'call'), (-3, 'line'), (-2, 'line'), (-2, 'return'), (1, 'return')]def raises(): raise Exceptiondef test_raise(): try: raises() except Exception, exc: x = 1test_raise.events = [(0, 'call'), (0, 'line'), (1, 'line'), (2, 'line'), (-3, 'call'), (-3, 'line'), (-2, 'line'), (-2, 'exception'), (2, 'exception'), (3, 'line'), (4, 'line'), (4, 'return')]def _settrace_and_return(tracefunc): sys.settrace(tracefunc) sys._getframe().f_back.f_trace = tracefuncdef settrace_and_return(tracefunc): _settrace_and_return(tracefunc)settrace_and_return.events = [(1, 'return')]def _settrace_and_raise(tracefunc): sys.settrace(tracefunc) sys._getframe().f_back.f_trace = tracefunc raise RuntimeErrordef settrace_and_raise(tracefunc): try: _settrace_and_raise(tracefunc) except RuntimeError, exc: passsettrace_and_raise.events = [(2, 'exception'), (3, 'line'), (4, 'line'), (4, 'return')]class Tracer: def __init__(self): self.events = [] def trace(self, frame, event, arg): self.events.append((frame.f_lineno, event)) return self.traceclass TraceTestCase(unittest.TestCase): def compare_events(self, line_offset, events, expected_events): events = [(l - line_offset, e) for (l, e) in events] if events != expected_events: self.fail( "events did not match expectation:\n" + "\n".join(difflib.ndiff(map(str, expected_events), map(str, events)))) def run_test(self, func): tracer = Tracer() sys.settrace(tracer.trace) func() sys.settrace(None) self.compare_events(func.func_code.co_firstlineno, tracer.events, func.events) def run_test2(self, func): tracer = Tracer() func(tracer.trace) sys.settrace(None) self.compare_events(func.func_code.co_firstlineno, tracer.events, func.events) def test_1_basic(self): self.run_test(basic) def test_2_arigo(self): self.run_test(arigo_example) def test_3_one_instr(self): self.run_test(one_instr_line) def test_4_no_pop_blocks(self): self.run_test(no_pop_blocks) def test_5_no_pop_tops(self): self.run_test(no_pop_tops) def test_6_call(self): self.run_test(call) def test_7_raise(self): self.run_test(test_raise) def test_8_settrace_and_return(self): self.run_test2(settrace_and_return) def test_9_settrace_and_raise(self): self.run_test2(settrace_and_raise)class RaisingTraceFuncTestCase(unittest.TestCase): def test_it(self): def tr(frame, event, arg): raise ValueError # just something that isn't RuntimeError def f(): return 1 try: for i in xrange(sys.getrecursionlimit() + 1): sys.settrace(tr) try: f() except ValueError: pass else: self.fail("exception not thrown!") except RuntimeError: self.fail("recursion counter not reset")def test_main(): test_support.run_unittest(TraceTestCase) test_support.run_unittest(RaisingTraceFuncTestCase)if __name__ == "__main__": test_main()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?