【问题标题】:How to test migrations faster in Django?如何在 Django 中更快地测试迁移?
【发布时间】:2017-05-02 07:22:21
【问题描述】:

我试过写a test on specific migration files。基本上我想测试数据库的当前状态和一对迁移之间的数据。我使用MigrationExecutor如下:

executor = MigrationExecutor(connection)
old_apps = executor.loader.project_state(self.migrate_from).apps
executor.migrate(self.migrate_from)
# do something here
executor.migrate(self.migrate_to)

我们的项目中有很多迁移文件,因此使用单元测试运行所有这些文件需要很长时间。通常,我会在settings_test.py 中将迁移模块设置为None

MIGRATION_MODULES: {
    'my_app': None
}

使用此设置,测试将运行得非常快。问题是无法再找到要测试的迁移文件(self.migrate_fromself.migrate_to):

django.db.migrations.exceptions.NodeNotFoundError: Node ('poleluxe', '0090_auto_previous_migration') not a valid node

所以我不得不在测试中再次包含迁移模块。

有没有办法在不运行所有迁移文件的情况下包含迁移文件?就我而言,我想跳过从00010089 的所有迁移,只运行0090(如self.migration_from)和0091(如self.migrate_to)。

我正在考虑压缩前 89 个迁移并将结果与​​ 00900091 一起放在一个单独的文件夹中,然后在测试中引用该迁移文件夹。但是,我不确定这是否是一个很好的解决方案。

【问题讨论】:

标签: python django unit-testing


【解决方案1】:

这是我目前所理解的,如果我不正确,请指导我。

问题

  1. Migration test code 需要应用迁移。
  2. Django 比任何其他进程启动得早,例如@override_settingsetUpClass()

解决方案

在 TestClass 的一开始覆盖 MIGRATION_MODULES 设置,即使 TestClass 没有完全初始化,因为那是我找到正确点的地方。

通过这种方式,您不仅可以在运行测试时禁用所有迁移以加快速度,还可以测试迁移文件。

  1. 禁用来自settings.py的所有迁移。

    MIGRATION_MODULES = {app: None for app in INSTALLED_APPS}
    
  2. (可选)如果您使用 pytest-django,请从 pytest 设置中删除 --nomigrations 选项。
  3. 覆盖“MIGRATION_MODULES”设置并在测试后重新设置。

    class TestMigrations(TestCase):
        origin_modules = getattr(settings, 'MIGRATION_MODULES', {})
        setattr(settings, 'MIGRATION_MODULES', {})    
    
        ...
    
        @classmethod
        def tearDownClass(cls):
            setattr(settings, 'MIGRATION_MODULES', cls.origin_modules)
            super().tearDownClass()
    

试用信息

  1. @override_setting 在 TestClass 或 TestMethod 不起作用,因为 Django 比 @override_setting 装饰更早启动和运行迁移
  2. pytest-django 和 --nomigrations 不工作不太确定,但我的解决方法是禁用从 Django 设置而不是 pytest-django 进行迁移

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    相关资源
    最近更新 更多