From adebfd0a847feac0be580c638e39aad1976c497a Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Thu, 28 Feb 2019 14:18:16 +0100 Subject: [PATCH] pdb: add option to skip `pdb.set_trace()` --- changelog/4854.feature.rst | 5 +++++ src/_pytest/debugging.py | 10 ++++++++++ testing/test_pdb.py | 14 ++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 changelog/4854.feature.rst diff --git a/changelog/4854.feature.rst b/changelog/4854.feature.rst new file mode 100644 index 000000000..c48f08da2 --- /dev/null +++ b/changelog/4854.feature.rst @@ -0,0 +1,5 @@ +The ``--pdb-skip`` option can now be used to ignore calls to +``pdb.set_trace()`` (and ``pytest.set_trace()``). + +This is meant to help while debugging, where you want to use e.g. ``--pdb`` or +``--trace`` only, or just run the tests again without any interruption. diff --git a/src/_pytest/debugging.py b/src/_pytest/debugging.py index bb90d00ca..3ad83bb1c 100644 --- a/src/_pytest/debugging.py +++ b/src/_pytest/debugging.py @@ -59,6 +59,13 @@ def pytest_addoption(parser): action="store_true", help="Immediately break when running each test.", ) + group._addoption( + "--pdb-skip", + "--pdb-ignore-set_trace", + dest="pdb_ignore_set_trace", + action="store_true", + help="Ignore calls to pdb.set_trace().", + ) def pytest_configure(config): @@ -202,6 +209,9 @@ class pytestPDB(object): @classmethod def set_trace(cls, *args, **kwargs): """Invoke debugging via ``Pdb.set_trace``, dropping any IO capturing.""" + if pytestPDB._config: # Might not be available when called directly. + if pytestPDB._config.getoption("pdb_ignore_set_trace"): + return frame = sys._getframe().f_back _pdb = cls._init_pdb(*args, **kwargs) _pdb.set_trace(frame) diff --git a/testing/test_pdb.py b/testing/test_pdb.py index d5cf17ef9..1dd31d439 100644 --- a/testing/test_pdb.py +++ b/testing/test_pdb.py @@ -10,6 +10,7 @@ import sys import _pytest._code import pytest from _pytest.debugging import _validate_usepdb_cls +from _pytest.main import EXIT_NOTESTSCOLLECTED try: breakpoint @@ -1112,3 +1113,16 @@ def test_pdb_suspends_fixture_capturing(testdir, fixture): assert child.exitstatus == 0 assert "= 1 passed in " in rest assert "> PDB continue (IO-capturing resumed for fixture %s) >" % (fixture) in rest + + +def test_pdb_skip_option(testdir): + p = testdir.makepyfile( + """ + print("before_set_trace") + __import__('pdb').set_trace() + print("after_set_trace") + """ + ) + result = testdir.runpytest_inprocess("--pdb-ignore-set_trace", "-s", p) + assert result.ret == EXIT_NOTESTSCOLLECTED + result.stdout.fnmatch_lines(["*before_set_trace*", "*after_set_trace*"])