我在Ubuntu 13.04上使用了Python 2.7的Django 1.4。我正在研究的Django项目有一个使用Nose和Coverage的完整测试套件。我需要在运行任何测试之前在数据库中创建一个用户。我会在哪里做这件事?在运行测试之前在Django中创建数据库条目
system_user = User(username=accounts_constants.SYSTEM_USER)
system_user.save()
这个动机源于存在处理大量数据库事务的“系统机器人”。我在我们的项目中创建了一个完整的跟踪套件。如果用户更改任何敏感信息,我们会跟踪它。如果系统进行了这些更改,我们希望将系统用户列入跟踪信息中。
有在需要进行修改,以支持这一变化的代码的几个地方。显然,测试数据库没有这个用户。我想在运行任何测试之前添加它(但是在创建数据库之后)。
我一直在四处,但不能清楚地看到用于测试目的创建数据库。我的第一次尝试是在我们的测试套件跑步者的init中。
class CustomTestSuiteRunner(NoseTestSuiteRunner):
"""
Runs testing suite and adds code coverage report.
"""
def __init__(self, *args, **kwargs):
super(CustomTestSuiteRunner, self).__init__(*args, **kwargs)
self.coverage = coverage.coverage()
self.coverage.use_cache(0) # don't use caching with coverage.py
system_user = User(username=accounts_constants.SYSTEM_USER)
system_user.save()
由于它仍在使用开发数据库(系统用户已存在于此数据库中),因此失败。
我试着沿测试序列进一步添加的用户,但似乎无法寻找到合适的地方就可以。
任何方向将不胜感激。
EDIT1:
从girasquid的建议解决方案:
我不希望每个setUp
修改超到CustomTestCase
。相反,我正在尝试在__init__
中执行此操作。
class CustomTestCase(TestCase):
def __init__(self, *args, **kwargs):
super(CustomTestCase, self).__init__(*args, **kwargs)
try:
system_user = User.objects.create(
username=accounts_constants.SYSTEM_USER)
system_user.save()
except psycopg2.IntegrityError:
pass
但我正在逐渐从nose
的IntegrityError
。任何想法,为什么这可能是?
lib/python2.7/site-packages/nose/loader.py", line 518, in makeTest
return self._makeTest(obj, parent)
IntegrityError: duplicate key value violates unique constraint "auth_user_username_key"
EDIT2:
我被我们的团队坚信实行逐案设置的变化,包括用户,而不是一个全系统的变化。
是的,这是我在想 - 继承一个基础TestCase。我想知道是否有更好的地方去做。我可能会这样做。谢谢。 – Rico