summaryrefslogtreecommitdiff
path: root/src/_pytest/debugging.py
diff options
context:
space:
mode:
authorDaniel Hahler <git@thequod.de>2018-11-01 19:40:38 +0100
committerDaniel Hahler <git@thequod.de>2018-11-02 18:25:01 +0100
commite61e81a7b53496ea53f1f9958a2be5468190b8ef (patch)
tree6b855a009fc5b6dfad5f4fed973695d92883b56e /src/_pytest/debugging.py
parent21725e930462a6533b98ac89d50e1e171d9f0c66 (diff)
downloadpytest-e61e81a7b53496ea53f1f9958a2be5468190b8ef.tar.gz
Make debugging's pytest_configure re-entrant
This is relevant when using runpytest in-process. Fixes: E def test_1(testdir): E testdir.runpytest() E > __import__('pdb').set_trace() E E ../../test_trace_after_runpytest.py:3: E …/Vcs/pytest/src/_pytest/debugging.py:81: in set_trace E tw = _pytest.config.create_terminal_writer(cls._config) E E config = None, args = (), kwargs = {}, tw = <py._io.terminalwriter.TerminalWriter object at 0x7f1097088160> E E def create_terminal_writer(config, *args, **kwargs): E """Create a TerminalWriter instance configured according to the options E in the config object. Every code which requires a TerminalWriter object E and has access to a config object should use this function. E """ E tw = py.io.TerminalWriter(*args, **kwargs) E > if config.option.color == "yes": E E AttributeError: 'NoneType' object has no attribute 'option'
Diffstat (limited to 'src/_pytest/debugging.py')
-rw-r--r--src/_pytest/debugging.py22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/_pytest/debugging.py b/src/_pytest/debugging.py
index 5a9729d5b..0baa84afa 100644
--- a/src/_pytest/debugging.py
+++ b/src/_pytest/debugging.py
@@ -47,17 +47,24 @@ def pytest_configure(config):
if config.getvalue("usepdb"):
config.pluginmanager.register(PdbInvoke(), "pdbinvoke")
- old = (pdb.set_trace, pytestPDB._pluginmanager)
-
- def fin():
- pdb.set_trace, pytestPDB._pluginmanager = old
- pytestPDB._config = None
- pytestPDB._pdb_cls = pdb.Pdb
-
+ pytestPDB._saved.append(
+ (pdb.set_trace, pytestPDB._pluginmanager, pytestPDB._config, pytestPDB._pdb_cls)
+ )
pdb.set_trace = pytestPDB.set_trace
pytestPDB._pluginmanager = config.pluginmanager
pytestPDB._config = config
pytestPDB._pdb_cls = pdb_cls
+
+ # NOTE: not using pytest_unconfigure, since it might get called although
+ # pytest_configure was not (if another plugin raises UsageError).
+ def fin():
+ (
+ pdb.set_trace,
+ pytestPDB._pluginmanager,
+ pytestPDB._config,
+ pytestPDB._pdb_cls,
+ ) = pytestPDB._saved.pop()
+
config._cleanup.append(fin)
@@ -67,6 +74,7 @@ class pytestPDB(object):
_pluginmanager = None
_config = None
_pdb_cls = pdb.Pdb
+ _saved = []
@classmethod
def set_trace(cls, set_break=True):