【问题标题】:How to preserve django test database after running test cases运行测试用例后如何保留django测试数据库
【发布时间】:2011-06-04 12:41:45
【问题描述】:

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

python manage.py test myapp

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

我可以使用任何数据库!

我想保留我的数据库,因为我想在创建的数据库中看到数据库中的错误。以便我可以查明它们!

【问题讨论】:

  • 你在使用 SQLite 吗?你能切换到 MySQL 吗?
  • 也许您可以详细说明您要保留数据库的原因?这总是有可能不是你真正的问题,但例如糟糕的测试代码是。
  • MySQL能否解决这个问题。以便我的测试数据库保留

标签: python django satchmo


【解决方案1】:

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

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

【讨论】:

  • 另外注意,如果有任何查询,您还可能需要将allow_database_queries = True 属性添加到SomeTests 类。
【解决方案2】:

对于 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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      然而,如果您没有时间这样做,您也可以在测试用例完成之前暂停执行,让您有时间检查您的重置之前的数据库。有几种方法可以实现这一点,但是现在,这是一个技巧,在 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:')
      

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

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

      【讨论】:

        【解决方案5】:

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

        $ python manage.py test -k
        

        $ python manage.py test --keepdb
        

        【讨论】:

          【解决方案6】:

          根据docs

          无论测试是否通过 或失败,测试数据库 当所有测试都完成时被销毁 被处决了。

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

          【讨论】:

          • 这个答案已经过时了。请使用新的相关信息对其进行更新。
          猜你喜欢
          • 2011-09-23
          • 2015-08-10
          • 1970-01-01
          • 2018-08-17
          • 2019-10-04
          • 2020-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多