Reputation: 3853
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.
Upvotes: 139
Views: 52949
Reputation: 5727
pytest-ipdb is unfortunately not supported anymore.
The solution is to run
pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:TerminalPdb
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).
Upvotes: 77
Reputation: 6361
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.
Upvotes: 0
Reputation: 10162
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()
Upvotes: 199
Reputation: 170628
As of 2019-11 here is what should fix it:
pip install ipdb gnureadline ptpython
export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'
Upvotes: 11
Reputation: 3366
This is what I use
py.test tests/ --pdbcls=IPython.core.debugger:Pdb -s
Upvotes: 3