資料庫和測試
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