【发布时间】:2014-09-29 10:47:55
【问题描述】:
Django 1.7 引入database migrations。
在 Django 1.7 中运行单元测试时,它会强制执行 迁移,这需要很长时间。所以我想跳过 django 迁移,并在最终状态下创建数据库。
我知道忽略迁移可能是一种不好的做法,因为这部分代码不会经过测试。但事实并非如此:我正在 CI 测试服务器 (jenkins) 中运行完整的迁移。我只想跳过速度很重要的本地测试中的迁移。
一些上下文:
直到 Django 1.6,在使用 South 时,我使用了 SOUTH_TESTS_MIGRATE 设置:
默认情况下,如果 South 的 syncdb 命令在非交互模式下运行(包括您在运行测试时),它也会应用迁移 - 每次运行测试时它都会运行每个迁移。
如果您希望测试运行程序使用 syncdb 而不是 migrate - 例如,如果您的迁移花费的时间太长而无法应用 - 只需在 settings.py 中设置 SOUTH_TESTS_MIGRATE = False。
但是,syncdb 已经不存在了,现在是 migrate。
从 Django 1.8 我将使用 --keepdb 参数:
--keepdb 选项可用于在测试运行之间保留测试数据库。这具有跳过创建和销毁操作的优点,这大大减少了运行测试的时间,尤其是大型测试套件中的测试。如果测试数据库不存在,它将在第一次运行时创建,然后为每次后续运行保留。在运行测试套件之前,任何未应用的迁移也将应用于测试数据库。
所以这个问题仅限于 Django 1.7。
【问题讨论】:
-
我认为在 UT 期间,您实际上并没有以测试它们的方式运行迁移,因为您开始使用的 DB 是不存在的。测试迁移实际上只在迁移现有数据库时发生。这个 1.7 迁移业务是我在 Django 中遇到的第一个真正的麻烦,但它确实是一个很大的刺激。 South 至少得到了适合迁移的测试场景。
-
django-test-without-migrations包对我来说真的很方便,您可能想将接受的答案更改为stackoverflow.com/a/28993456/200224 -
如果可能的话,我更喜欢避免添加新的依赖项。
标签: django unit-testing django-migrations