【问题标题】:pdb still will not show output even after using -s option with Django Nose即使在 Django Nose 中使用 -s 选项后,pdb 仍然不会显示输出
【发布时间】:2013-10-15 11:37:11
【问题描述】:

我正在尝试调试我的测试并且我正在使用自定义测试运行程序。当我不将它与 manage.py 结合使用时,我可以让 pdb 正常工作。

在 mysite/blog/tests/models_tests.py 我有以下几行:

import pdb; pdb.set_trace()

症状是当我运行“fab t:i=1”时,测试开始运行。大概 set_trace 正在启动,我只是看不到输出,因为光标只是闪烁,然后在大约 10 秒后停止闪烁。如果我输入 exit,我会收到以下错误:

Traceback (most recent call last):
  File "/home/jdp/Documents/www/env/local/lib/python2.7/site-packages/nose/loader.py", line 413, in loadTestsFromName
    addr.filename, addr.module)
  File "/home/jdp/Documents/www/env/local/lib/python2.7/site-packages/nose/importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/home/jdp/Documents/www/env/local/lib/python2.7/site-packages/nose/importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/jdp/Documents/www/mysite/blog/tests/models_tests.py", line 2, in <module>
    from blog.tests.factories import BlogFactory, CommentFactory
  File "/home/jdp/Documents/www/mysite/blog/tests/models_tests.py", line 2, in <module>
    from blog.tests.factories import BlogFactory, CommentFactory
  File "/usr/lib/python2.7/bdb.py", line 48, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/lib/python2.7/bdb.py", line 67, in dispatch_line
    if self.quitting: raise BdbQuit
BdbQuit

我猜这意味着 pdb 正在加载,我只是看不到输出。另外,如果我键入“c”,pdb 知道继续,并且测试通过。我只是看不到(pdb)提示。这是否意味着“-s”不能正常工作?

在 mysite/blog/tests/models_tests.py 我有以下几行:

import pdb; pdb.set_trace()

位于 mysite/mysite/testrunner.py:

from django_coverage.coverage_runner import CoverageRunner
from django_nose import NoseTestSuiteRunner

class NoseCoverageTestRunner(CoverageRunner, NoseTestSuiteRunner):
    pass

位于 mysite/mysite/settings.py:

EXTERNAL_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'south',
    'whoosh',
    'haystack',
    'django.contrib.markup',
    'django.contrib.gis',
    'world',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
]

INTERNAL_APPS = [
    'blog',
]

INSTALLED_APPS = EXTERNAL_APPS + INTERNAL_APPS

位于 mysite/mysite/test_settings.py:

# flake8: noqa
"""Settings to be used for running tests."""
import os

from mysite.settings import *


INSTALLED_APPS.append('django_nose')
INSTALLED_APPS.append('django_jasmine')

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'website_db',                     
        'USER': 'xxx',
        'PASSWORD': 'xxx',
        'HOST': '',                      
        'PORT': '',                    
    }
}


EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
SOUTH_TESTS_MIGRATE = False

TEST_RUNNER = 'mysite.testrunner.NoseCoverageTestRunner'
COVERAGE_MODULE_EXCLUDES = [
    'tests$', 'settings$', 'urls$', 'locale$',
    'migrations', 'fixtures', 'admin$', 'django_extensions',
]
COVERAGE_MODULE_EXCLUDES += EXTERNAL_APPS
COVERAGE_REPORT_HTML_OUTPUT_DIR = os.path.join(__file__, '../../coverage')

MEDIA_ROOT = os.path.join(__file__, '../../test_files/media')

最后,我从位于 mysite/fabfile.py 的 fabric 中运行这些测试:

from fabric.api import local, lcd, settings

def t(i=0):
    """
    Your central command for running tests. Call it like so:

        fab t
        fab t:i=0
    """
    command = 'python manage.py test -v 2 -s --settings=mysite.test_settings'
    if int(i) == 0:
        command += " --exclude='integration_tests' --exclude='jasmine_tests'"
    with settings(warn_only=True):
        result = local(command, capture=True)
        if result.failed:
            print result.stderr
            with lcd('test_files/media'):
                local('rm -rf image')
                print "Removed Test Folder Regardless of Failure"
        else:       
            with lcd('test_files/media'):
                local('rm -rf image')
                print "Tests OK. Deleting Images Folder"

【问题讨论】:

    标签: django pdb coverage.py django-nose


    【解决方案1】:

    好的,我发现了问题。

    article 向我透露了信息(在“以编程方式流鼻涕”部分下)。

    显然,当您以编程方式运行鼻子时,就像我对织物做的那样,鼻子会捕获 sys.stdout,因此打印语句将不起作用(显然 pdb 正在使用它输出到控制台)。

    当我在没有结构的命令提示符下输入此命令时,它会直接弹出到 (pdb) 提示符:

    ./manage.py test -s --settings=mysite.test_settings
    

    如果有人对此问题有解决方法,我希望能够只运行 Fabric,但至少在此期间我可以继续取得进展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      相关资源
      最近更新 更多