資料庫和測試

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