How to execute ipdb.set_trace() at will while running pytest tests

PythonPytest

Python Problem Overview


I'm using pytest for my test suite. While catching bugs in complex inter-components test, I would like to place import ipdb; ipdb.set_trace() in the middle of my code to allow me to debug it.

However, since pytest traps sys.stdin/sys.stdout ipdb fails. How can I use ipdb while testing with pytest.

I'm not interested in jumping to pdb or ipdb after a failure, but to place breaks anywhere in the code and be able to debug it there before the failure occurs.

Python Solutions


Solution 1 - Python

The error is raised because pytest captures output by default.

You can run pytest with -s option (turn off capture output). For example:

py.test -s my_test.py

and then in my_test.py:

import ipdb;
ipdb.set_trace()

Solution 2 - Python

pytest-ipdb is unfortunately not supported anymore.

The solution is to run pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

From the help command:

pytest -h
  --pdb                 start the interactive Python debugger on errors.
  --pdbcls=modulename:classname
                        start a custom interactive Python debugger on errors.
                        For example:
                        --pdbcls=IPython.terminal.debugger:TerminalPdb

The difference is just that TerminalPdb seems to throw erros, but Pdb not (Ipython docs).

Solution 3 - Python

As of 2019-11 here is what should fix it:

pip install ipdb gnureadline ptpython

export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'

Solution 4 - Python

This is what I use

py.test tests/ --pdbcls=IPython.core.debugger:Pdb -s

Solution 5 - Python

You may want to give pdbpp a try. I've had more success with it, compared to ipdb when used with pytest. See my answer here: https://stackoverflow.com/a/69320311/2896799.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmanuView Question on Stackoverflow
Solution 1 - PythonpetRUShkaView Answer on Stackoverflow
Solution 2 - Pythonlouis_guittonView Answer on Stackoverflow
Solution 3 - PythonsorinView Answer on Stackoverflow
Solution 4 - PythonavolivaView Answer on Stackoverflow
Solution 5 - PythonApteryxView Answer on Stackoverflow