diff options
author | Daniel Hahler <git@thequod.de> | 2018-11-01 19:40:38 +0100 |
---|---|---|
committer | Daniel Hahler <git@thequod.de> | 2018-11-02 18:25:01 +0100 |
commit | e61e81a7b53496ea53f1f9958a2be5468190b8ef (patch) | |
tree | 6b855a009fc5b6dfad5f4fed973695d92883b56e /src/_pytest/debugging.py | |
parent | 21725e930462a6533b98ac89d50e1e171d9f0c66 (diff) | |
download | pytest-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.py | 22 |
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): |