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

Bil*_*rat 4 python django satchmo

当我通过键入运行测试用例时

python manage.py test myapp
Run Code Online (Sandbox Code Playgroud)

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

我可以使用任何数据库!

我想保留我的数据库,因为数据库中存在我想在创建的数据库中看到的错误.这样我就可以找到它们!

Tim*_*ych 12

您可以使用该test --keepdb选项阻止测试数据库被销毁.

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


lmi*_*asf 9

根据docs,您可以在运行测试后通过以下方式保留数据库:

$ python manage.py test -k
Run Code Online (Sandbox Code Playgroud)

或者

$ python manage.py test --keepdb
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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

但是,如果您没有时间这样做,您还可以让您的测试用例在完成之前暂停执行,让您有时间在数据库重置之前检查它。有几种方法可以实现这一点,但是,现在,这是一个黑客input在您的 Python 代码中询问用户将使 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:')
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用pdb'sset_trace函数,它也会使执行暂停并等待输入,同时让您在代码执行的那个点调试环境。

只需确保在将代码发送到自动构建系统之前删除input()(or pdb.set_trace()) 调用,否则它将等待用户输入并超时。


pym*_*men 7

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

  1. 确保您的测试类基于django.test.SimpleTestCase(不是 TestCase 或 TransactionTestCase)
  2. 进行一项要保留数据库状态的测试
  3. 将以下代码添加到您的测试类中,以防止测试执行后数据库表清理
    def tearDown(self) -> None:
        pass

    @classmethod
    def tearDownClass(cls):
        pass
Run Code Online (Sandbox Code Playgroud)
  1. 使用参数运行测试--keepdb,例如./manage.py test app.test --keepdb- 防止测试执行后整个数据库清理
  2. 等待测试完成
  3. 利润!拍摄快照/发现您的 test_database [不要忘记 Django 默认情况下会test_在您的默认数据库名称中添加前缀]

测试test_copy命令示例

./manage.py 测试 --noinput --keepdb api.tests.SomeTests.test_copy

class SomeTests(SimpleTestCase):
    allow_database_queries = True

    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):
        SubscriptionFactory()
Run Code Online (Sandbox Code Playgroud)


Sil*_*ght -5

根据文档

无论测试通过还是失败,当所有测试执行完毕后,测试数据库都会被销毁。

不过,固定装置可能对您的情况有所帮助。只需创建初始数据,您希望在测试开始时出现,作为纹理,然后进行测试加载它。