在Python Django中如何定义测试数据库并保留插入测试数据库的记录直到在测试用例的tearDown方法中清理

问题描述 投票:0回答:1

我想在 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 数据库浏览器。

test_db.sqlite

python python-3.x django django-testing django-tests
1个回答
0
投票

-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()
© www.soinside.com 2019 - 2024. All rights reserved.