我想在 Django 最新版本中为我的默认数据库创建一个测试数据库,为此我在项目
settings.py
文件中进行了配置,如下所示。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
'TEST': {
'NAME': BASE_DIR / 'test_db.sqlite3',
}
}
}
我的
Topic
文件中有一个模型 models.py
并运行 makemigrtions
和 migrate
cmds 以在 sqlite 数据库中拥有表。我在我的应用程序(first_app)TestTopic
文件中创建了tests.py
类,如下
from django.test import TestCase,SimpleTestCase
from .models import Topic
class TestTopic(TestCase):
def setUp(self):
Topic.objects.create(top_name='Test topic1')
Topic.objects.create(top_name='Test topic2')
Topic.objects.create(top_name='Test topic3')
def test_create_topic(self):
all_topics = Topic.objects.count()
self.assertEqual(all_topics, 3)
def tearDown(self) -> None:
return super().tearDown()
我正在下面执行 cmd 来运行我的应用程序(first_app)测试。通过
--keepdb
来保留 test_db
。
py manage.py test first_app --keepdb
此后我看到测试用例通过了。但是当我在 sqlite db 浏览器应用程序中检查
test_db.sqlite
以查看我在测试用例中创建的测试主题时,我没有看到它们。我希望将这些记录保留在 test_db
中,直到我手动清除它们或使用测试用例的 tearDown
方法清除它们。 (下面是 test_db.sqlite
主题表的 sqlite 数据库浏览器。
-keepdb
选项将仅保留数据库的模式,而不保留其中的数据。每次测试创建的数据永远不会提交到数据库,Django 在执行一个测试方法之前创建一个数据库事务,并在测试结束时回滚该事务。 (在测试期间将数据保存在数据库上不是一个好主意,这可能会破坏测试的幂等性。这意味着如果执行相同的测试两次,您可能会得到不同的结果)
如果您使用
setUpTestData
,那么数据将在班级的整组测试中保留:
class TestFoo(TestCase):
@classmethod
def setUpTestData(cls):
User.objects.create(...)
User.objects.create(...)
User.objects.create(...)
def test_something(self):
self.assertEqual(1 + 1, 2)
def tearDown(self) -> None:
print(User.objects.count()) # you'll have the 3 users here
return super().tearDown()