Django 数据库和测试

示例

Django在测试时使用特殊的数据库设置,以便测试可以正常使用数据库,但默认情况下在空数据库上运行。一个测试中的数据库更改将不会被另一测试看到。例如,以下两个测试都将通过:

fromdjango.testimport TestCase
frommyapp.modelsimport Thing

class MyTest(TestCase):

    def test_1(self):
        self.assertEqual(Thing.objects.count(), 0)
        Thing.objects.create()
        self.assertEqual(Thing.objects.count(), 1)

    def test_2(self):
        self.assertEqual(Thing.objects.count(), 0)
        Thing.objects.create(attr1="value")
        self.assertEqual(Thing.objects.count(), 1)

治具

如果要让多个测试使用数据库对象setUp,请在测试用例的方法中创建它们。此外,如果您在django项目中定义了灯具,则可以将它们包括在内,如下所示:

class MyTest(TestCase):
    fixtures = ["fixture1.json", "fixture2.json"]

默认情况下,djangofixtures在每个应用程序的目录中查找固定装置。可以使用以下FIXTURE_DIRS设置来设置更多目录:

# myapp/settings.py
FIXTURE_DIRS = [
    os.path.join(BASE_DIR, 'path', 'to', 'directory'),
]

假设您已创建如下模型:

# models.py
fromdjango.dbimport models


class Person(models.Model):
    """A person defined by his/her first- and lastname."""
    firstname = models.CharField(max_length=255)
    lastname = models.CharField(max_length=255)

然后您的.json固定装置可能看起来像这样:

# fixture1.json
[
    { "model": "myapp.person",
        "pk": 1,
        "fields": {
            "firstname": "Peter",
            "lastname": "Griffin"
        }
    },
    { "model": "myapp.person",
        "pk": 2,
        "fields": {
            "firstname": "Louis",
            "lastname": "Griffin"
        }
    },
]

重用测试数据库

为了加快测试运行速度,您可以告诉管理命令重用测试数据库(并防止在每次测试运行之前创建数据库并在每次测试运行之后删除数据库)。可以使用keepdb(或简写-k)标志来实现,如下所示:

# Reuse the test-database (since django version 1.8)
$ pythonmanage.pytest --keepdb