Como executar ipdb.set_trace () à vontade durante a execução de testes pytest


96

Estou usando o pytest para meu conjunto de testes. Ao detectar bugs em testes complexos de intercomponentes, gostaria de colocá- import ipdb; ipdb.set_trace()los no meio do meu código para permitir que eu o depure.

No entanto, como pytest intercepta sys.stdin / sys.stdout ipdb falha. Como posso usar o ipdb durante o teste com o pytest.

Não estou interessado em saltar para pdb ou ipdb após uma falha, mas em colocar quebras em qualquer lugar do código e ser capaz de depurá-lo antes que a falha ocorra.

Respostas:


153

O erro é gerado devido à saída de captura de py.test.

Você deve executar py.test com a -sopção (desligar a saída de captura). Por exemplo:

py.test -s my_test.py

10
Caso queira fazer isso no Django, adicione addopts = -sao pytest.iniarquivo.
Rahul Gupta

39

Infelizmente, o pytest-ipdb não é mais compatível.

A solução é executar pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

A partir do comando help:

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

A diferença é apenas que TerminalPdb parece lançar erros, mas Pdb não ( documentos Ipython ).


1
TerminalPdbestá funcionando novamente e é a solução preferida, pois permitirá o preenchimento com guia.
Uwe L. Korn

cuidado com o ppdb, ele tem introspecção de qualidade
ipython

2

Isso é o que eu uso

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


0

A partir de 11 de 2019, aqui está o que deve corrigir:

pip install ipdb gnureadline ptpython

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

1
se você instalar a prompt-toolkit versão, 2.0.10então o ipdb funcionará bem novamente, porque ele quebra devido à atualização recente deste pacote para 3.0.0
Pawel Barcik
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.