Django测试使用现有数据库

时间:2011-06-06 09:57:58

标签: django django-testing

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

  • 测试套件需要使用现有数据库
  • 测试套件不应删除或重​​新创建数据库,而应从mysql dump
  • 加载数据
  • 由于db是从转储填充的,因此不应加载任何灯具
  • 完成测试后,不应销毁数据库

我很难让testsuiterunner绕过创作。

3 个答案:

答案 0 :(得分:5)

快进到2016年,django内置了在测试之间保留数据库的能力。它以--keep flag到manage.py

的形式提供
  

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

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

答案 1 :(得分:3)

此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

答案 2 :(得分:0)

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

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

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

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

警告:这个跑步者将无法为您的应用程序的来源提供便利。可以自定义运行器以为与现有数据库的连接创建特定别名并加载转储,然后提供覆盖django.test.testcases.TestCase以指向其别名的自定义测试用例。