Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Suggestion: KeybaordInterrupt pdb #3299

Closed
amosonn opened this issue Mar 12, 2018 · 12 comments
Closed

Suggestion: KeybaordInterrupt pdb #3299

amosonn opened this issue Mar 12, 2018 · 12 comments
Labels
plugin: debugging related to the debugging builtin plugin type: enhancement new feature or API change, should be merged into features branch

Comments

@amosonn
Copy link

amosonn commented Mar 12, 2018

When debugging infinite-loop issues, it can sometimes be useful to enable dropping to debugger upon Ctrl+C. Currently --pdb only catches other exceptions, KeyboardInterrupt is specifically ignored (runner.py:193, CallInfo.__init__). It would be nice to have a switch that makes it swallow KeyboardInterrupt-s as well instead. It would of course make it harder to quit (although a few consecutive Ctrl+C's usually due the trick), but it's a reasonable price to pay for those cases.

@pytestbot
Copy link
Contributor

GitMate.io thinks possibly related issues are #1948 (--pdbcls implies --pdb), #1461 (Suggestion: merge .fixture and .yield_fixture), #262 (--pdb drops you into pdb if you have an xfail), #1324 (--pdb and yield tests), and #1343 (Can not restart tests from pdb).

@pytestbot pytestbot added platform: mac mac platform-specific problem type: enhancement new feature or API change, should be merged into features branch labels Mar 12, 2018
@nicoddemus nicoddemus added plugin: debugging related to the debugging builtin plugin and removed platform: mac mac platform-specific problem labels Mar 12, 2018
@brianmaissy
Copy link
Contributor

I could do this. @nicoddemus sounds reasonable as described? How concerned are we about feature bloat? Is a legitimate use case reason enough to add a feature, or must it also be a reasonably common use case?

@nicoddemus
Copy link
Member

Thanks for the offer @brianmaissy, IMHO this sounds useful, I have needed something like this a few times in the past as well. I think adding a new flag seems harmless, but I wonder how the implementation will look like. I would say give it a go and we can discuss this over the PR.

@amosonn
Copy link
Author

amosonn commented Apr 5, 2018 via email

@blueyed
Copy link
Contributor

blueyed commented Apr 5, 2018

I think it should be possible to know if Ctrl-C was emitted when inside pdb already, or outside of it.
In the former case it would not drop into pdb again, but exit.
Related (for ideas/handling): #2619

@RonnyPfannschmidt
Copy link
Member

currently i believe the debugging plugin explicitly ignores interrupts to ctrl*c - in order to enable exiting the test run via a interrupt

@amosonn
Copy link
Author

amosonn commented Apr 5, 2018 via email

@blueyed
Copy link
Contributor

blueyed commented Apr 5, 2018

pdb ignores Ctrl+C,

True. Ctrl-C results in (Pdb) --KeyboardInterrupt--

Maybe pytest wrapping could then handle bdb.BdbQuit internally as to not stop again?
This gets raised when using Ctrl-d.

btw: with pdbpp you have pdb.disable() which disables/skips all future set_trace calls: https://github.com/antocuni/pdb/blob/b7e789b836340ecbc131e26f8fd93d74fe652297/pdb.py#L1009-L1012.
I.e. with something like --pdb-on-sigint you could then do import pdb; pdb.disable() when using pdbpp.

But altogether with the new option you would basically only have to replace ctrl-c with ctrl-c + ctrl-d when using the new pdb-on-sigint, no?

@brianmaissy
Copy link
Contributor

The current behavior of KeyboardInterrupt after dropping to pdb is to exit the test session, so I would be inclined to preserve that. It has the added benefit that if you pressed control-C with the intention of stopping the test session and then got a pdb the second control-C will indeed quit.

So I'll go ahead an implement the "naive" approach?

I thought to call the option --pdb-on-keyboard-interrupt and have it imply --pdb. Does that sound right?

@nicoddemus
Copy link
Member

nicoddemus commented Apr 21, 2018

The current behavior of KeyboardInterrupt after dropping to pdb is to exit the test session, so I would be inclined to preserve that.

Agreed.

It has the added benefit that if you pressed control-C with the intention of stopping the test session and then got a pdb the second control-C will indeed quit.

I like that.

I thought to call the option --pdb-on-keyboard-interrupt and have it imply --pdb. Does that sound right?

Contrary to what I said in #3299 (comment), perhaps we can avoid adding a new option and let --pdb imply that control-C will enter pdb, and a second control-C quit pdb?

@brianmaissy
Copy link
Contributor

Hmm interesting, I think I like that.

@nicoddemus
Copy link
Member

Fixed in #3436, thanks @brianmaissy!

guykisel referenced this issue in guykisel/inline-plz Jul 6, 2018
This PR updates [pytest](https://pypi.org/project/pytest) from **3.5.1** to **3.6.3**.



<details>
  <summary>Changelog</summary>
  
  
   ### 3.6.2
   ```
   =========================

Bug Fixes
---------

- Fix regression in ``Node.add_marker`` by extracting the mark object of a
  ``MarkDecorator``. (`3555
  &lt;https://github.com/pytest-dev/pytest/issues/3555&gt;`_)

- Warnings without ``location`` were reported as ``None``. This is corrected to
  now report ``&lt;undetermined location&gt;``. (`3563
  &lt;https://github.com/pytest-dev/pytest/issues/3563&gt;`_)

- Continue to call finalizers in the stack when a finalizer in a former scope
  raises an exception. (`3569
  &lt;https://github.com/pytest-dev/pytest/issues/3569&gt;`_)

- Fix encoding error with `print` statements in doctests (`3583
  &lt;https://github.com/pytest-dev/pytest/issues/3583&gt;`_)


Improved Documentation
----------------------

- Add documentation for the ``--strict`` flag. (`3549
  &lt;https://github.com/pytest-dev/pytest/issues/3549&gt;`_)


Trivial/Internal Changes
------------------------

- Update old quotation style to parens in fixture.rst documentation. (`3525
  &lt;https://github.com/pytest-dev/pytest/issues/3525&gt;`_)

- Improve display of hint about ``--fulltrace`` with ``KeyboardInterrupt``.
  (`3545 &lt;https://github.com/pytest-dev/pytest/issues/3545&gt;`_)

- pytest&#39;s testsuite is no longer runnable through ``python setup.py test`` --
  instead invoke ``pytest`` or ``tox`` directly. (`3552
  &lt;https://github.com/pytest-dev/pytest/issues/3552&gt;`_)

- Fix typo in documentation (`3567
  &lt;https://github.com/pytest-dev/pytest/issues/3567&gt;`_)
   ```
   
  
  
   ### 3.6.1
   ```
   =========================

Bug Fixes
---------

- Fixed a bug where stdout and stderr were logged twice by junitxml when a test
  was marked xfail. (`3491
  &lt;https://github.com/pytest-dev/pytest/issues/3491&gt;`_)

- Fix ``usefixtures`` mark applyed to unittest tests by correctly instantiating
  ``FixtureInfo``. (`3498
  &lt;https://github.com/pytest-dev/pytest/issues/3498&gt;`_)

- Fix assertion rewriter compatibility with libraries that monkey patch
  ``file`` objects. (`3503
  &lt;https://github.com/pytest-dev/pytest/issues/3503&gt;`_)


Improved Documentation
----------------------

- Added a section on how to use fixtures as factories to the fixture
  documentation. (`3461 &lt;https://github.com/pytest-dev/pytest/issues/3461&gt;`_)


Trivial/Internal Changes
------------------------

- Enable caching for pip/pre-commit in order to reduce build time on
  travis/appveyor. (`3502
  &lt;https://github.com/pytest-dev/pytest/issues/3502&gt;`_)

- Switch pytest to the src/ layout as we already suggested it for good practice
  - now we implement it as well. (`3513
  &lt;https://github.com/pytest-dev/pytest/issues/3513&gt;`_)

- Fix if in tests to support 3.7.0b5, where a docstring handling in AST got
  reverted. (`3530 &lt;https://github.com/pytest-dev/pytest/issues/3530&gt;`_)

- Remove some python2.5 compatibility code. (`3529
  &lt;https://github.com/pytest-dev/pytest/issues/3529&gt;`_)
   ```
   
  
  
   ### 3.6.0
   ```
   =========================

Features
--------

- Revamp the internals of the ``pytest.mark`` implementation with correct per
  node handling which fixes a number of long standing bugs caused by the old
  design. This introduces new ``Node.iter_markers(name)`` and
  ``Node.get_closest_mark(name)`` APIs. Users are **strongly encouraged** to
  read the `reasons for the revamp in the docs
  &lt;https://docs.pytest.org/en/latest/mark.htmlmarker-revamp-and-iteration&gt;`_,
  or jump over to details about `updating existing code to use the new APIs
  &lt;https://docs.pytest.org/en/latest/mark.htmlupdating-code&gt;`_. (`3317
  &lt;https://github.com/pytest-dev/pytest/issues/3317&gt;`_)

- Now when ``pytest.fixture`` is applied more than once to the same function a
  ``ValueError`` is raised. This buggy behavior would cause surprising problems
  and if was working for a test suite it was mostly by accident. (`2334
  &lt;https://github.com/pytest-dev/pytest/issues/2334&gt;`_)

- Support for Python 3.7&#39;s builtin ``breakpoint()`` method, see `Using the
  builtin breakpoint function
  &lt;https://docs.pytest.org/en/latest/usage.htmlbreakpoint-builtin&gt;`_ for
  details. (`3180 &lt;https://github.com/pytest-dev/pytest/issues/3180&gt;`_)

- ``monkeypatch`` now supports a ``context()`` function which acts as a context
  manager which undoes all patching done within the ``with`` block. (`3290
  &lt;https://github.com/pytest-dev/pytest/issues/3290&gt;`_)

- The ``--pdb`` option now causes KeyboardInterrupt to enter the debugger,
  instead of stopping the test session. On python 2.7, hitting CTRL+C again
  exits the debugger. On python 3.2 and higher, use CTRL+D. (`3299
  &lt;https://github.com/pytest-dev/pytest/issues/3299&gt;`_)

- pytest not longer changes the log level of the root logger when the
  ``log-level`` parameter has greater numeric value than that of the level of
  the root logger, which makes it play better with custom logging configuration
  in user code. (`3307 &lt;https://github.com/pytest-dev/pytest/issues/3307&gt;`_)


Bug Fixes
---------

- A rare race-condition which might result in corrupted ``.pyc`` files on
  Windows has been hopefully solved. (`3008
  &lt;https://github.com/pytest-dev/pytest/issues/3008&gt;`_)

- Also use iter_marker for discovering the marks applying for marker
  expressions from the cli to avoid the bad data from the legacy mark storage.
  (`3441 &lt;https://github.com/pytest-dev/pytest/issues/3441&gt;`_)

- When showing diffs of failed assertions where the contents contain only
  whitespace, escape them using ``repr()`` first to make it easy to spot the
  differences. (`3443 &lt;https://github.com/pytest-dev/pytest/issues/3443&gt;`_)


Improved Documentation
----------------------

- Change documentation copyright year to a range which auto-updates itself each
  time it is published. (`3303
  &lt;https://github.com/pytest-dev/pytest/issues/3303&gt;`_)


Trivial/Internal Changes
------------------------

- ``pytest`` now depends on the `python-atomicwrites
  &lt;https://github.com/untitaker/python-atomicwrites&gt;`_ library. (`3008
  &lt;https://github.com/pytest-dev/pytest/issues/3008&gt;`_)

- Update all pypi.python.org URLs to pypi.org. (`3431
  &lt;https://github.com/pytest-dev/pytest/issues/3431&gt;`_)

- Detect `pytest_` prefixed hooks using the internal plugin manager since
  ``pluggy`` is deprecating the ``implprefix`` argument to ``PluginManager``.
  (`3487 &lt;https://github.com/pytest-dev/pytest/issues/3487&gt;`_)

- Import ``Mapping`` and ``Sequence`` from ``_pytest.compat`` instead of
  directly from ``collections`` in ``python_api.py::approx``. Add ``Mapping``
  to ``_pytest.compat``, import it from ``collections`` on python 2, but from
  ``collections.abc`` on Python 3 to avoid a ``DeprecationWarning`` on Python
  3.7 or newer. (`3497 &lt;https://github.com/pytest-dev/pytest/issues/3497&gt;`_)
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/pytest
  - Changelog: https://pyup.io/changelogs/pytest/
  - Repo: https://github.com/pytest-dev/pytest/issues
  - Homepage: http://pytest.org
</details>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
plugin: debugging related to the debugging builtin plugin type: enhancement new feature or API change, should be merged into features branch
Projects
None yet
Development

No branches or pull requests

6 participants