【问题标题】:Create a Database Entry in Django Before Running Tests在运行测试之前在 Django 中创建一个数据库条目
【发布时间】:2013-05-25 04:15:38
【问题描述】:

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

失败,因为它仍在使用开发数据库(系统用户已存在于该数据库中)。

我尝试在测试序列中进一步添加用户,但似乎找不到合适的位置。

任何方向都将不胜感激。

编辑1:

来自 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:

我们的团队说服我实施逐个设置更改以包括用户而不是系统范围的更改。

【问题讨论】:

    标签: database django unit-testing


    【解决方案1】:

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

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

    如果您有很多需要执行此操作的测试用例,则将其放在基础 TestCase 上然后从该基础上继承所有测试可能会很有用。

    【讨论】:

    • 是的,这就是我的想法——继承一个基本的TestCase。我想知道是否有更好的地方可以做到这一点。我可能会这样做。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2018-12-06
    • 2016-03-21
    • 2014-07-26
    • 2010-11-14
    • 1970-01-01
    相关资源
    最近更新 更多