manu
manu

Reputation: 3853

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

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

Answers (5)

louis_guitton
louis_guitton

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

Apteryx
Apteryx

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

petRUShka
petRUShka

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

sorin
sorin

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

avoliva
avoliva

Reputation: 3366

This is what I use

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

Upvotes: 3

Related Questions