为什么Django实际上没有将更改写入测试数据库

时间:2016-02-10 02:50:17

标签: django

在我的settings.py中,我有这个:

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

我在我的db上运行了这个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表并且它是空的。

这是为什么?感谢

2 个答案:

答案 0 :(得分:3)

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

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

如果您需要测试来提交对测试数据库的更改,则可以扩展TransactionTestCase。 E.g。

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

答案 1 :(得分:0)

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

  

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

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