如何只在内存中运行Django的测试数据库?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

我的Django单元测试需要很长时间才能运行,所以我正在寻找加快速度的方法。我正在考虑安装一个SSD但我知道这也有它的缺点。当然,我可以用我的代码做一些事情,但是我正在寻找一个结构修复。即使运行一个测试也很慢,因为每次都需要重新构建/迁移数据库。所以我的主意是.

既然我知道测试数据库总是很小,为什么我不能把系统配置成总是将整个测试数据库保存在RAM中呢?千万不要碰磁盘。我如何在Django中配置它?我宁愿继续使用MySQL因为这就是我在生产中所用的,但是如果SQLite3或其他什么东西使这件事很容易,我会走那条路。

SQLite或MySQL是否可以完全在内存中运行?应该可以配置RAM磁盘,然后将测试数据库配置为将其数据存储在那里,但我不知道如何告诉Django/MySQL对某个数据库使用不同的数据目录,特别是因为它每次运行时都会被擦除和重新创建。(我在Mac FWIW上。)

提问于
用户回答回答于

我在我的settings.py在运行我的测试时,将引擎设置为sqite:

if 'test' in sys.argv:
    DATABASE_ENGINE = 'sqlite3'

或者在Django 1.2:

if 'test' in sys.argv:
    DATABASES['default'] = {'ENGINE': 'sqlite3'}

最后,在Django 1.3和1.4:

if 'test' in sys.argv:
    DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}

(对于Django 1.3来说,后端的完整路径并不是绝对必要的,而是使设置前向兼容。)

还可以添加以下行,以防南方迁移遇到问题:

    SOUTH_TESTS_MIGRATE = False
用户回答回答于

我通常为测试创建一个单独的设置文件,并在test命令中使用它。

python manage.py test --settings=mysite.test_settings myapp

它有两个好处:

  1. 你不需要检查test或者在sys.argv中任何这样的魔法词,test_settings.py可以简单地 从设置导入*#让测试更快_试验_迁移=假数据库“违约”={“Engine”:‘django.db.backends.sqlite 3’} 或者,可以根据需要进一步调整它,将测试设置与生产设置清晰地分开。
  2. 另一个好处是可以使用生产数据库引擎来运行测试,而不是sqlite 3,这样就可以避免细微的bug,因此在开发使用时 py测试---设置=mysite.test_设置myapp 在提交代码之前,运行一次 pythonManage.py测试myapp 只是为了确保所有的测试都通过了。

扫码关注云+社区