How to execute ipdb.set_trace() at will while running pytest tests
PythonPytestPython 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.