数据库和测试

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

from django.test import TestCase
from myapp.models import 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 项目中定义了 fixtures,它们可以像这样包含:

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

默认情况下,django 正在每个应用程序的 fixtures 目录中查找 fixtures。可以使用 FIXTURE_DIRS 设置设置更多目录:

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

假设你创建了一个模型,如下所示:

# models.py
from django.db import 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"
        }
    },
]

重用测试数据库

为了加快测试运行速度,你可以告诉 management-command 重用测试数据库(并防止它在每次测试运行之前创建并在每次测试运行后删除)。这可以使用 keepdb(或简写 -k)标志来完成,如下所示:

# Reuse the test-database (since django version 1.8)
$ python manage.py test --keepdb