在运行测试之前在Django中创建数据库条目

时间:2013-05-29 18:55:21

标签: database django unit-testing

我在Ubuntu 13.04上使用Django 1.4和Python 2.7。我正在研究的Django项目有一个使用Nose和Coverage的整个测试套件。我需要在运行任何测试之前在数据库中创建用户。我会在哪里做到这一点?

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

但我从IntegrityError获得nose。任何想法为什么会这样?

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:

我的团队确信我实施逐案更改以包含用户而不是系统范围内的更改。

1 个答案:

答案 0 :(得分:3)

我会在我的测试用例中定义setUp

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

如果您需要执行大量测试用例,那么将其放在基础TestCase上然后继承所有测试可能会很有用。