数据库和测试
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