26

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

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

我很难让 testsuiterunner 绕过创建。

4

3 回答 3

14

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

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

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

于 2016-05-08T14:36:32.337 回答
4

此 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
于 2014-06-06T10:01:22.990 回答
0

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

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

根据转储的大小和内容,一个安全的选择可能是创建一个子进程,将转储通过管道传输到数据库的 SQL 命令行界面,否则您可能能够获取游标并直接执行查询

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

警告购买者:这个运行器将使得除了你的应用程序源之外的任何东西都无法进行测试。TestCase._database_names可以自定义运行程序以创建与现有数据库的连接的特定别名并加载转储,然后提供覆盖以指向其别名的自定义测试用例。

于 2013-09-20T13:52:57.510 回答