【问题标题】:Django test to use existing databaseDjango 测试使用现有数据库
【发布时间】:2011-09-09 04:06:48
【问题描述】:

我很难自定义测试数据库设置行为。我想实现以下目标:

  • 测试套件需要使用现有数据库
  • 测试套件不应删除或重​​新创建数据库,而是从 mysql 转储中加载数据
  • 由于数据库是从转储中填充的,因此不应加载任何固定装置
  • 完成测试后,不应破坏数据库

我很难让 testsuiterunner 绕过创建。

【问题讨论】:

  • 如果您从 sql 转储中加载数据,您会以何种方式使用现有数据库?我建议加载转储、创建固定装置并使用传统的测试方法。
  • 数据很多,从转储加载比从固定装置加载快
  • 不是“现有的”数据库,而是“一个”包含部分数据的现有数据库。
  • 测试旨在构建并随后出于某种原因拆除数据库。他们不应该与具有任何持久性的数据进行交互。我想你会发现很难改变这种行为如果它甚至是可能的。最好的办法是按照其他人的建议使用固定装置或 sqldump。
  • 嘿,如果你也像我一样从 Google 来到这里,请看这里:stackoverflow.com/questions/4606756/…

标签: django django-testing


【解决方案1】:

快进到 2016 年,在 django 中内置了在测试之间保留数据库的功能。它以--keep flag 的形式提供给 manage.py

Django 1.8 中的新功能。在测试运行之间保留测试数据库。这 具有跳过创建和销毁操作的优点 这可以大大减少运行测试的时间,尤其是那些在 一个大型测试套件。如果测试数据库不存在,它将是 在第一次运行时创建,然后为每次后续运行保留。 任何未应用的迁移也将应用于测试数据库 在运行测试套件之前。

这几乎满足了您在问题中提到的所有标准。事实上,它甚至更进一步。无需在每次运行之前导入转储。

【讨论】:

【解决方案2】:

这个 TEST_RUNNER 在 Django 1.3 中工作

from django.test.simple import DjangoTestSuiteRunner as TestRunner

class DjangoTestSuiteRunner(TestRunner):
    def setup_databases(self, **kwargs):
        pass

    def teardown_databases(self, old_config, **kwargs):
        pass

【讨论】:

    【解决方案3】:

    您需要提供自定义测试运行程序。

    您有兴趣用默认的django.test.runner.DiscoverRunner 覆盖的位是DiscoverRunner.setup_databasesDiscoverRunner.teardown_databases 方法。这两种方法都涉及创建和销毁测试数据库,并且只执行一次。您需要提供默认使用现有测试数据库的特定于测试的项目设置并覆盖这些设置,以便加载转储数据并且不会破坏测试数据库。

    根据转储的大小和内容,一个安全的选择可能是只创建一个子进程,将转储通过管道传输到数据库的 SQL 命令行界面,否则您可能能够获得一个游标和execute queries directly .

    如果您希望完全摆脱夹具加载,您可以提供一个自定义基础测试用例,扩展 Django 的默认 django.test.testcases.TestCase,并将 TestCase._fixutre_setupTestCase._fixutre_teardown 方法重写为 noop。

    请注意:此运行程序将使您无法对除您的应用程序源之外的任何内容进行测试。可以自定义运行程序,为现有数据库的连接创建特定别名并加载转储,然后提供覆盖 TestCase._database_names 以指向其别名的自定义测试用例。

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 2019-01-09
      • 2018-11-02
      • 2020-04-22
      • 2022-08-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      相关资源
      最近更新 更多