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.

Asked By: manu

||

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()
Answered By: petRUShka

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).

Answered By: louis_guitton

This is what I use

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

Answered By: avoliva

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

pip install ipdb gnureadline ptpython

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

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.

Answered By: Apteryx
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.