From 043732a9bac3fc1a30162395af76bb59975d0e8b Mon Sep 17 00:00:00 2001 From: Michael Elovskikh Date: Tue, 30 Oct 2018 19:06:05 +0500 Subject: [PATCH 1/2] Put mounting logic to wrapper class --- pytest_pudb.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pytest_pudb.py b/pytest_pudb.py index 1f7a592..e5f2e9c 100644 --- a/pytest_pudb.py +++ b/pytest_pudb.py @@ -13,10 +13,6 @@ def pytest_addoption(parser): def pytest_configure(config): pudb_wrapper = PuDBWrapper(config) - - if config.getvalue("usepudb"): - config.pluginmanager.register(pudb_wrapper, 'pudb_wrapper') - pudb_wrapper.mount() config._cleanup.append(pudb_wrapper.unmount) @@ -31,10 +27,17 @@ def __init__(self, config): self.pluginmanager = config.pluginmanager self._pudb_get_debugger = None + @property + def with_pudb_option(self): + return self.config.getvalue("usepudb") + def mount(self): self._pudb_get_debugger = pudb._get_debugger pudb._get_debugger = self._get_debugger + if self.with_pudb_option: + self.config.pluginmanager.register(self, 'pudb_wrapper') + def unmount(self): if self._pudb_get_debugger: pudb._get_debugger = self._pudb_get_debugger From 205f7704b62185aaba633f7b7cb41f246ee3e72c Mon Sep 17 00:00:00 2001 From: Michael Elovskikh Date: Wed, 31 Oct 2018 01:24:35 +0500 Subject: [PATCH 2/2] Disable unittest tearDowns and cleanups for post mortem debugging closes #9 --- pytest_pudb.py | 16 ++++++++++++++++ test_pytest_pudb.py | 22 ++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/pytest_pudb.py b/pytest_pudb.py index e5f2e9c..0a13897 100644 --- a/pytest_pudb.py +++ b/pytest_pudb.py @@ -3,6 +3,7 @@ import pudb import sys import warnings +import _pytest.unittest def pytest_addoption(parser): @@ -26,6 +27,7 @@ def __init__(self, config): self.config = config self.pluginmanager = config.pluginmanager self._pudb_get_debugger = None + self._test_case_function_runtest = None @property def with_pudb_option(self): @@ -38,11 +40,25 @@ def mount(self): if self.with_pudb_option: self.config.pluginmanager.register(self, 'pudb_wrapper') + def runtest(self): + # disables tearDown and cleanups for post mortem debugging + # see: https://github.com/pytest-dev/pytest/pull/1890 + if self._handle_skip(): + return + self._testcase.debug() + + self._test_case_function_runtest = _pytest.unittest.TestCaseFunction.runtest + _pytest.unittest.TestCaseFunction.runtest = runtest + def unmount(self): if self._pudb_get_debugger: pudb._get_debugger = self._pudb_get_debugger self._pudb_get_debugger = None + if self._test_case_function_runtest: + _pytest.unittest.TestCaseFunction.runtest = self._test_case_function_runtest + self._test_case_function_runtest = None + def disable_io_capture(self): if self.pluginmanager is not None: capman = self.pluginmanager.getplugin("capturemanager") diff --git a/test_pytest_pudb.py b/test_pytest_pudb.py index 6f7b77a..b5e1b62 100644 --- a/test_pytest_pudb.py +++ b/test_pytest_pudb.py @@ -18,6 +18,28 @@ def test_1(): child.sendeof() +def test_pudb_unittest_teardown_interaction(testdir): + p1 = testdir.makepyfile(""" + import unittest + class Blub(unittest.TestCase): + def tearDown(self): + self.a = False + def test_false(self): + self.a = True + self.fail() + """) + child = testdir.spawn_pytest("--pudb %s" % p1) + child.expect("PuDB") + child.expect(HELP_MESSAGE) + child.expect("PROCESSING EXCEPTION") + child.expect(VARIABLES_TABLE) + child.send('V') # Move to variables + child.send('n') # Add watch expression + child.expect('Add Watch Expression') + child.sendline('self.a') # Set self.a + child.expect('self.a: \x1b\\[0;30;42mTrue') + child.sendeof() + def test_pudb_set_trace_integration(testdir): p1 = testdir.makepyfile(""" def test_1():