21

我想像调试任何其他 Python 代码一样调试 Django TestCase:只需调用pdb.set_trace(),然后进入交互式会话。当我这样做时,我什么也看不到,因为测试是在不同的过程中运行的。我正在使用django-discover-runner,但我的猜测是这适用于默认的 Django 测试运行器。

问题:

是否可以在每次错误/失败pdb时使用django-discover-runnera) 和/或 b) 仅在我调用pdb.set_trace()测试代码时才进入会话?

有些研究:

这个答案rpdb2 debugger解释了 Django 创建了另一个进程,并建议使用对的一部分的调用winpdb,但我不想使用winpdb,我宁愿使用ipdb.

此答案django-nose通过运行如下测试命令解决了问题: ./manage.py test -- -s,但该选项不适用于django-discover-runner.

这个答案表明我可以这样做ipython

In [9]: %pdb
Automatic pdb calling has been turned ON

ipython这似乎是一个潜在的选择,但每次运行测试时启动似乎有点麻烦。

最后,这个答案表明它nose带有一个--pdb标志,它会陷入pdb错误,这就是我想要的。我是切换到django-nose测试运行器的唯一选择吗?

我在以下的内置帮助中没有看到任何选项django-discover-runner

$ python manage.py help test --settings=settings.test
Usage: manage.py test [options] [appname ...]

Runs the test suite for the specified applications, or the entire site if no apps are specified.

Options:
  -v VERBOSITY, --verbosity=VERBOSITY
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=verbose output, 3=very verbose output
  --settings=SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be
                        used.
  --pythonpath=PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
  --traceback           Print traceback on exception
  --noinput             Tells Django to NOT prompt the user for input of any
                        kind.
  --failfast            Tells Django to stop running the test suite after
                        first failed test.
  --testrunner=TESTRUNNER
                        Tells Django to use specified test runner class
                        instead of the one specified by the TEST_RUNNER
                        setting.
  --liveserver=LIVESERVER
                        Overrides the default address where the live server
                        (used with LiveServerTestCase) is expected to run
                        from. The default value is localhost:8081.
  -t TOP_LEVEL, --top-level-directory=TOP_LEVEL
                        Top level of project for unittest discovery.
  -p PATTERN, --pattern=PATTERN
                        The test matching pattern. Defaults to test*.py.
  --version             show program's version number and exit
  -h, --help            show this help message and exit
4

2 回答 2

21

Django 不在单独的进程中运行测试;声称它确实的链接答案是完全错误的。(最接近的是LiveServerTestCasefor Selenium 测试,它启动了一个单独的线程来运行开发服务器,但这仍然不是一个单独的进程,它不会阻止使用 pdb)。您应该能够import pdb; pdb.set_trace()在测试(或测试代码)中的任何位置插入并获得可用的 pdb 提示。我从来没有遇到过这个问题,我只是在一个新的项目中用 Django 1.5.1 和 django-discover-runner 1.0 再次验证了它。如果这对您不起作用,那是由于您的项目中的其他原因,而不是由于 Django 或 django-discover-runner。

默认情况下,Nose 会捕获所有输出,这会中断import pdb; pdb.set_trace(). 该-s选项关闭输出捕获。这对于现有的 Django 测试运行器或 django-discover-runner 来说不是必需的,因为它们一开始都没有进行输出捕获。

--pdb如果您使用的是 django-discover-runner ,我不知道任何与鼻子选项等效的方法。有一个提供此功能的django-pdb项目,但快速阅读它的代码告诉我,它无法与 django-discover-runner 配合使用;不过,它的代码可能会为您提供一些自己实现此功能的线索。

FWIW,我个人使用py.testpytest-django而不是 django-discover-runner 或 django-nose。即使 py.test 提供了--pdb像鼻子这样的选项,我也不使用它;我经常想在实际错误点之前中断,以便在错误之前逐步执行,所以我通常只是插入import pytest; pytest.set_trace()(导入set_tracefrompytest相当于鼻子的-s选项;它在运行 pdb 之前关闭 py.test 的输出捕获)我想要它在代码中的位置,然后在完成后将其删除。我不觉得这很麻烦;YMMV。

于 2013-06-21T15:37:55.217 回答
13

尝试使用 ipdb 而不是 pdb -

import ipdb;ipdb.set_trace()

或(适用于鼻子测试跑步者)

from nose.tools import set_trace;set_trace()
于 2016-02-12T11:13:45.070 回答