Как запустить pytest с помощью отладчика python с завершением табуляции? - PullRequest
0 голосов
/ 03 октября 2018

Справочная информация

Я отлаживал свои скрипты на Python ~ 2 года с простым from IPython import embed; embed(), и он работал очень хорошо.Я просто помещаю команду в строку, которую я хочу исследовать, и при запуске сценария у меня будет полная оболочка IPython с возможностью изучения переменных, определения функций и т. Д. Кроме того, оболочка IPython поставляется с дополнением табуляции имени переменной.

Теперь, вместо того, чтобы всегда определять «линию паузы» с помощью from IPython import embed; embed(), я бы хотел, чтобы мои скрипты Python приостанавливали выполнение во время выполнения тестов, когда они встречают исключение.

Вопрос

Как вы запускаете pytest таким образом, что

  1. Когда выдается исключение , он запускает отладчик python
  2. Этот отладчик имеет завершение табуляции для имен переменных?

Настройка

  • Windows 10
  • Python 3.6

Простой не пройденный тест

# test_somemodule.py
def test_me(some_variable):
    x = 1 + some_variable
    return x


test_me('I am a string')

(Нет, вы не пишете тесты для pytest, как этот, но для этой примерной цели это просто отлично.)

Решения, которыене работают

1.pytest --pdb (без установленного pdbpp)

Открывается базовая оболочка pdb, когда она запускается с ошибкой.Но у него нет табуляции.

-> x = 1 + some_variable
(Pdb) so[<tab_here_produces_tab>]

2.pytest --pdb ( с установленным pdbpp)

Открывается базовая оболочка pdbpp, когда она запускается с ошибкой.Но нет табуляции.

-> x = 1 + some_variable
(Pdb++) so[<tab_here_produces_tab>]

3.pytest --pdb --pdbcls=IPython.terminal.debugger:Pdb

Открывается базовая оболочка ipdb, когда она запускается с ошибкой.Но нет завершения табуляции.

    103
    104 def test_me(some_variable):
--> 105     x = 1 + some_variable
    106     return x
    107

ipdb> so[<tab_here_produces_tab>]

4.fancycompleter.interact()

Попробовал fancycompleter.interact() как предложено здесь , не повезло (с pdb, ipdb и pdbpp, fancycompleter v.0.8 и даже этой исправленной версией.).

5.pytest --pdb -s

Как прокомментировал Сергей Воронежский , для pytest доступен флаг -s.Тем не менее, завершение вкладки работает только частично: если есть несколько опций для одного и того же начального символа (символов), он выведет список возможных переменных.В нем отсутствует возможность быстрого выбора одной из совпадающих переменных (которая доступна, например, в оболочке IPython):

example with the -s flag

Есть ли способсделать завершение работы с вкладкой имени переменной?Я бы предпочел ipdb или pdbpp вместо ванили pdb, но даже рабочее решение с pdb просто отлично.

1 Ответ

0 голосов
/ 03 октября 2018

Это не оптимальное решение, но лучше, чем ничего.Может быть, кто-то приходит с лучшим ответом.Вот что я сделал

  1. Установлено pdbpp (pip install pdbpp)
  2. Сделано ~/.pdbrc файл (‪C:\Users\<USER>\.pdbrc) со следующим содержанием

    alias emb from IPython import embed; embed()

  3. Сделано ~/.pdbrc.py файл (‪C:\Users\<USER>\.pdbrc.py) со следующим содержанием

import pdb


class Config(pdb.DefaultConfig):
    def setup(self, pdb):
        print('Use "emb" to enter IPython shell')

Пример использования

Выполнить pytest --pdb (тот же файл .py, что и в вопросе).Как видно из рисунка, завершается вкладка для переменной some_variable.

tab completion inside IPython shell inside pdbpp

...