我正在尝试调试我的测试,而我正在使用自定义testrunner。当我没有将它与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')
最后,我在fabric中运行这些测试,位于mysite / fabfile.py:
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"
答案 0 :(得分:0)
好的,我发现了问题。
这article让我失望(在“以编程方式运行鼻子”一节下)。
显然当你以编程方式运行鼻子时,就像我使用fabric一样,nose会捕获sys.stdout,因此print语句将无效(显然pdb用于输出到控制台)。
当我在没有结构的命令提示符下输入此命令时,它会立即弹出(pdb)提示符:
./manage.py test -s --settings=mysite.test_settings
如果有人为这个问题找到解决方法,我宁愿能够只运行结构,但至少我可以在此期间继续取得进展。