Как отлаживать юнит-тесты с помощью отладчика pudb?

У меня возникли проблемы с отладкой некоторых модульных тестов с помощью отладчика pudb.

Тесты работают нормально с python, но мне не повезло запустить их с pudb.

Я изолировал проблему, получив следующий пример кода:

class Math:
    def pow(self, x, y):
        return x ** y

import unittest

class MathTest(unittest.TestCase):
    def testPow23(self):
        self.assertEquals(8, Math().pow(2, 3))
    def testPow24(self):
        self.assertEquals(16, Math().pow(2, 4))

if __name__ == '__main__':
    unittest.main()

Тесты проходят нормально:

$ python amodule.py 
.
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

Но если запустить через pudb, то выдает:

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

Я пробовал запускать с использованием pudb amodule.py, а также с python -m pudb.run amodule.py, но это не имеет значения — никакие тесты не запускаются тем или иным способом.

Должен ли я делать что-то другое для отладки модульных тестов с помощью pudb?


person Elias Dorneles    schedule 14.03.2014    source источник
comment
@LukasGraf Отлично, спасибо! Пожалуйста, опубликуйте это как ответ, чтобы я мог отдать вам должное. знак равно   -  person Elias Dorneles    schedule 14.03.2014
comment
Отлично, рад, что сработало :)   -  person Lukas Graf    schedule 14.03.2014


Ответы (3)


Попробуйте поставить точку останова на полезную строку кода:

from pudb import set_trace; set_trace()

Способы, которыми вы пытались запустить его, могут помешать обнаружению тестов и/или не запускать ваш скрипт с __name__ из '__main__'.

person Lukas Graf    schedule 14.03.2014
comment
А как насчет посмертной отладки? Раньше я вызывал программу как pudb myprogram params, и она останавливалась при первой ошибке. Можем ли мы сделать то же самое с pudb и unittests ? Я имею в виду остановиться на первой ошибке и получить посмертную отладку? - person yucer; 19.04.2017
comment
@yucer, это будет зависеть от вашего тестировщика. Если вы используете pytest, вы можете установить этот плагин pypi.org/project/pytest-pudb а затем запустите pytest --pudb - person Elias Dorneles; 15.10.2018

Поскольку это популярный вопрос, я чувствую, что должен также упомянуть, что большинство инструментов для запуска тестов потребуют от вас передачи переключателя, чтобы предотвратить захват стандартного вывода и ввода (обычно это -s).

Итак, не забудьте запустить pytest -s при использовании Pytest, или nosetests -s для Nose, python manage.py test -s для тестов Django, или проверьте документацию для вашего инструмента запуска тестов.

person Elias Dorneles    schedule 26.09.2017

Вы можете установить точку останова еще проще:

import pudb; pu.db

person Sławomir Lenart    schedule 04.10.2017