How to execute ipdb.set_trace() at will while running pytest tests
Question:
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.
Answers:
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()
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).
This is what I use
py.test tests/ --pdbcls=IPython.core.debugger:Pdb -s
As of 2019-11 here is what should fix it:
pip install ipdb gnureadline ptpython
export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'
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.
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.
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()
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).
This is what I use
py.test tests/ --pdbcls=IPython.core.debugger:Pdb -s
As of 2019-11 here is what should fix it:
pip install ipdb gnureadline ptpython
export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'
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.