如何在运行测试用例后保留django测试数据库

时间:2011-01-06 08:38:13

标签: python django satchmo

当我通过输入

运行测试用例时
python manage.py test myapp

测试用例完成后,django test runner默认删除了测试数据库。我不希望它被删除。

我可以使用任何数据库!

我想保留我的数据库,因为数据库中存在我想在创建的数据库中看到的错误。这样我就能确定它们了!

6 个答案:

答案 0 :(得分:8)

您可以使用test --keepdb选项阻止测试数据库被破坏。

https://docs.djangoproject.com/en/1.10/topics/testing/overview/#the-test-database

答案 1 :(得分:3)

根据docs,您可以在运行测试后保留数据库:

$ python manage.py test -k

$ python manage.py test --keepdb

答案 2 :(得分:2)

虽然将-k传递到manage.py test将保留测试数据库,但仍将删除在测试用例中创建的记录。这是因为Django的TestCase类仍然会在每个测试用例之后重置您的数据库(django.test.TransactionTestCase将执行flush,而django.test.TestCase会将每个测试用例包装在一个事务中并在测试用例完成后进行回滚。

使Django保留测试数据的唯一真正的解决方案是扩展TestCase类并覆盖用于重置数据库的代码。

但是,如果您没有时间执行此操作,还可以在测试用例执行完 pause 之前使它暂停,让您有时间检查数据库重置之前。有多种方法可以实现此目的,但是现在,这是一个问题,在您的Python代码中要求用户input将使Python暂停执行并等待用户输入。

from django.test import TestCase


class MyTestCase(TestCase):
    def test_something_does_something(self):
        result = do_something_with_the_database()
        self.assertTrue(result)

        # Ask for `input` so execution will pause and wait for input.
        input(
            'Execution is paused and you can now inspect the database.\n'
            'Press return/enter key to continue:')

或者,您也可以使用pdb的{​​{1}}函数,该函数还将使执行暂停并等待输入,同时您还可以在该代码点调试环境。执行。

在将代码发送到自动生成系统之前,请确保先删除set_trace(或input())调用,否则它将等待用户输入和超时。

答案 3 :(得分:1)

在测试执行后保留整个Django测试数据库的状态 (不仅是表结构)

  1. 确保您的测试类基于django.test.SimpleTestCase(不是从django.test导入TestCase,TransactionTestCase)
  2. 参加要保留其数据库状态的测试之一
  3. (可选)在测试中间添加raise Exception('db savepoint')(如果要在完整测试执行后保存状态,请跳过此步骤)
  4. 在测试类中添加以下代码,以防止测试执行后清理数据库表
    def tearDown(self) -> None:
        pass

    @classmethod
    def tearDownClass(cls):
        pass
  1. 使用--keepdb参数(例如./manage.py test app.test --keepdb)运行测试-以防止在测试执行后清理整个数据库
  2. 等待测试失败
  3. 利润!快照/发现您的test_database [不要忘记,默认情况下Django将在您的默认数据库中添加前缀test _]

请参见测试示例 test_copy

./manage.py test --noinput --keepdb api.tests.SomeTests.test_copy


class SomeTests(SimpleTestCase):
    def setUp(self):
        super(SomeTests, self).setUp()
        self.huge_set_up_operations()

    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.huge_init_database()

    def tearDown(self):
        pass

    @classmethod
    def tearDownClass(cls):
        pass

    def test_copy(self):
        subscription_models.COPY_SUBSCRIPTION_CHUNK_SIZE = 1  # verifies that everything goes ok even if chunked
        target_list = AutoResponderFactory.create(user=self.user).list
        target_contact = ContactFactory.create(user=self.user)
        SubscriptionFactory.create(contact=target_contact, list=target_list)

答案 4 :(得分:0)

根据docs

  

无论测试是否通过   或者失败,测试数据库   所有测试都被破坏了   已被执行。

虽然fixtures可能对您的情况有所帮助。只需创建初始数据,您希望在测试开始时就在那里,作为纹理,并使测试加载它。

答案 5 :(得分:0)

对于 Pytest 环境中的任何人,我使用以下 pytest.ini 进行测试

[pytest]
DJANGO_SETTINGS_MODULE=myapp.settings.test
python_files = tests.py test_*.py *_tests.py
addopts =
    --ds=myapp.settings.test
    --reuse-db
    --nomigrations

注意“--resuse-db”命令参数/addpots