一尘不染

在Django 1.7中运行单元测试时禁用迁移

django

Django 1.7引入了数据库迁移。

在Django 1.7中运行单元测试时,它会强制进行迁移,这需要很长时间。因此,我想跳过django迁移,并以最终状态创建数据库。

我知道忽略迁移可能是一个坏习惯,因为该部分代码将不会进行测试。事实并非如此:我正在CI测试服务器(jenkins)中运行完整迁移。我只想在速度很重要的本地测试中跳过迁移。

一些背景:

直到Django 1.6之前,在使用South时,我都使用SOUTH_TESTS_MIGRATE设置:

默认情况下,South的syncdb命令如果以非交互模式运行(包括运行测试的时间),也会应用迁移-它将在每次运行测试时运行每次迁移。

如果您希望测试运行程序使用syncdb而不是进行迁移(例如,如果迁移时间太长而无法应用),只需在settings.py中设置SOUTH_TESTS_MIGRATE = False。

但是,syncdb不再存在,现在可以进行迁移。

从Django 1.8开始,我将使用–keepdb参数:

–keepdb选项可用于在两次测试运行之间保留测试数据库。这具有跳过创建和销毁操作的优势,这极大地减少了运行测试的时间,尤其是大型测试套件中的测试。如果测试数据库不存在,它将在第一次运行时创建,然后为以后的每次运行保留。在运行测试套件之前,所有未应用的迁移也将应用于测试数据库。

因此,此问题仅限于Django 1.7。


阅读 382

收藏
2020-04-03

共2个答案

一尘不染

看一下由Bernie Sumption发布到Django开发人员邮件列表的解决方法:

如果尚未运行makemigrations,则“ migrate”命令会将应用程序视为未迁移,并直接从模型中创建表,就像syncdb在1.6中所做的那样。我为单元测试定义了一个新的设置模块,名为“ settings_test.py”,该模块从主设置模块导入*并添加以下行:

MIGRATION_MODULES = {“ myapp”:“ myapp.migrations_not_used_in_tests”}

然后我运行如下测试:

DJANGO_SETTINGS_MODULE =“ myapp.settings_test” python manage.py测试

傻瓜会迁移到认为该应用程序未迁移的状态,因此每次创建测试数据库时,它都会反映出models.py的当前结构。

在Django 1.9中,这种情况有所改善,你可以将值设置为None

MIGRATION_MODULES = {“ myapp”:无}

2020-04-03
一尘不染

这是我的设置文件的结尾:

class DisableMigrations(object):

    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        return None


TESTS_IN_PROGRESS = False
if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]:
    logging.disable(logging.CRITICAL)
    PASSWORD_HASHERS = (
        'django.contrib.auth.hashers.MD5PasswordHasher',
    )
    DEBUG = False
    TEMPLATE_DEBUG = False
    TESTS_IN_PROGRESS = True
    MIGRATION_MODULES = DisableMigrations()
2020-04-03