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

2023-12-28

Django 1.7介绍数据库迁移 https://docs.djangoproject.com/en/1.7/topics/migrations/.

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

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


一些背景:

直到姜戈1.6,当使用南时,我使用了SOUTH_TESTS_MIGRATE http://south.readthedocs.org/en/latest/unittests.html环境:

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

如果您希望测试运行程序使用syncdb而不是迁移 - 例如,如果您的迁移需要很长时间才能应用 - 只需在settings.py中设置 SOUTH_TESTS_MIGRATE = False 。

然而,syncdb已经不存在了,现在是migrate.

以及来自姜戈1.8我将使用--keepdb https://docs.djangoproject.com/en/dev/ref/django-admin/#django-admin-option---keepdb范围:

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

所以这个问题仅限于Django 1.7。


Look at 这个解决方法 https://groups.google.com/d/msg/django-developers/PWPj3etj3-U/kCl6pMsQYYoJ,由 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管理.py测试

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

在Django 1.9中,这种情况有所改善 https://docs.djangoproject.com/en/1.9/ref/settings/#migration-modules,您可以将值设置为None:

MIGRATION_MODULES = {“myapp”:无}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Django 1.7 中运行单元测试时禁用迁移 的相关文章

随机推荐