【问题标题】:Why isn't Django actually writing changes to test db为什么 Django 不实际编写更改来测试数据库
【发布时间】:2016-02-10 02:50:17
【问题描述】:

在我的 settings.py 我有这个:

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'foo',
    'USER': 'foo',
    'PASSWORD': 'foo',
    'HOST': 'localhost',
    },
}

我已经在我的数据库上运行了这个 SQL:

GRANT ALL ON test_foo.* TO 'foo'@'localhost';

我已经将我想要通过测试找出的内容提炼出来了:

from django.test import TestCase
from django.contrib.auth.models import User

class UserTestCase(TestCase):

    def test_create_user(self):
        user = User.objects.create_user(
            username='jacob', email='jacob@bla.net', password='top_secret')
        user.save()
        user = User.objects.get(username="jacob")
        import ipdb; ipdb.set_trace()
        self.assertTrue(False)

当我运行测试并到达断点时,我查询了 test_foo 中的 auth_user 表,它是空的。

这是为什么?谢谢

【问题讨论】:

    标签: django


    【解决方案1】:

    Django 的TestCase 类利用数据库事务(如果数据库支持的话)来加速测试。

    这意味着在测试方法中,任何数据库修改仅对该测试可见,并且不会提交给数据库。您将无法使用外部工具检查更改。

    如果您需要测试以将更改提交到测试数据库,您可以改为扩展TransactionTestCase。例如

    class UserTestCase(TransactionTestCase):
    
        def test_create_user(self):
            # any database changes will be visible in the test database
            ....
    

    在每个TransactionTestCase 测试结束时,数据库将重置为已知状态。请注意,这会使您的单元测试变慢。同样,只有支持事务的数据库(例如 PostgreSQL、MySQL+InnoDB)才会表现出这种行为。

    更多信息请参见https://docs.djangoproject.com/en/1.9/topics/testing/tools/#transactiontestcase

    【讨论】:

    • 我测试了它,这就是正在发生的事情。泰!
    【解决方案2】:

    https://docs.djangoproject.com/en/1.9/topics/testing/overview/#the-test-database

    需要数据库的测试(即模型测试)不会使用您的“真实”(生产)数据库。为测试创建单独的空白数据库。

    根据上面链接的文档,默认数据库名称以 test_ 开头。

    【讨论】:

    • “当我运行测试并达到断点时,我在 test_foo 中查询 auth_user 表” db 的名称是 foo,我看到 test_foo 被创建并在我使用该 db 时查询 auth_user 表。所以不幸的是,这并不能解开谜团。 TY 给你的时间。
    猜你喜欢
    • 2021-06-23
    • 2015-01-28
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2015-03-04
    • 2020-09-20
    相关资源
    最近更新 更多