2013-05-29 40 views
1

我在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 

但我正在逐渐从noseIntegrityError。任何想法,为什么这可能是?

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:

我被我们的团队坚信实行逐案设置的变化,包括用户,而不是一个全系统的变化。

回答

3

我会定义我的测试用例setUp此:

class MyTestCase(unittest.TestCase): 
    def setUp(self): 
     self.system_user = User.objects.create(username=accounts_constants.SYSTEM_USER) 

如果你有很多你需要为做这个测试的情况下,它可能是把这个基础上有用TestCase,然后从所有测试中继承。

+0

是的,这是我在想 - 继承一个基础TestCase。我想知道是否有更好的地方去做。我可能会这样做。谢谢。 – Rico

相关问题